/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * The blow logging funcitons must only be called from the audio thread. */ #ifndef AUDIO_THREAD_LOG_H_ #define AUDIO_THREAD_LOG_H_ #include <pthread.h> #include <stdint.h> #include "cras_types.h" #define AUDIO_THREAD_LOGGING 1 #if (AUDIO_THREAD_LOGGING) #define ATLOG(log,event,data1,data2,data3) \ audio_thread_event_log_data(log,event,data1,data2,data3); #else #define ATLOG(log,event,data1,data2,data3) #endif extern struct audio_thread_event_log *atlog; static inline struct audio_thread_event_log *audio_thread_event_log_init() { struct audio_thread_event_log *log; log = (struct audio_thread_event_log *) calloc(1, sizeof(struct audio_thread_event_log)); log->len = AUDIO_THREAD_EVENT_LOG_SIZE; return log; } static inline void audio_thread_event_log_deinit(struct audio_thread_event_log *log) { free(log); } /* Log a tag and the current time, Uses two words, the first is split * 8 bits for tag and 24 for seconds, second word is micro seconds. */ static inline void audio_thread_event_log_data( struct audio_thread_event_log *log, enum AUDIO_THREAD_LOG_EVENTS event, uint32_t data1, uint32_t data2, uint32_t data3) { struct timespec now; clock_gettime(CLOCK_MONOTONIC_RAW, &now); log->log[log->write_pos].tag_sec = (event << 24) | (now.tv_sec & 0x00ffffff); log->log[log->write_pos].nsec = now.tv_nsec; log->log[log->write_pos].data1 = data1; log->log[log->write_pos].data2 = data2; log->log[log->write_pos].data3 = data3; log->write_pos++; log->write_pos %= AUDIO_THREAD_EVENT_LOG_SIZE; } #endif /* AUDIO_THREAD_LOG_H_ */