Files
utun2/tools/chatgui/transport/audio_diagnostics.h
T

61 lines
3.4 KiB
C

#pragma once
#include <stdint.h>
/* Desktop-аудиодиагностика: callbacks передают числовые снимки в ограниченную очередь.
* Отдельный reporter пишет сводки в категорию call; start/stop принадлежат владельцу устройств. */
#ifdef __cplusplus
extern "C" {
#endif
/* Только метаданные: PCM и содержимое сообщений не записываются. */
enum audio_diag_stage {
AUDIO_DIAG_LOOP, AUDIO_DIAG_READ, AUDIO_DIAG_WRITE, AUDIO_DIAG_MAP,
AUDIO_DIAG_SUBMIT, AUDIO_DIAG_DUPLEX, AUDIO_DIAG_CALLBACK,
AUDIO_DIAG_FEED, AUDIO_DIAG_PULL, AUDIO_DIAG_STAGE_COUNT
};
enum audio_diag_kind {
AUDIO_DIAG_ENTER, AUDIO_DIAG_LEAVE, AUDIO_DIAG_OPEN, AUDIO_DIAG_CLOSE,
AUDIO_DIAG_NOTIFY, AUDIO_DIAG_BACKEND_STARTED, AUDIO_DIAG_HOLE, AUDIO_DIAG_UNFILLED, AUDIO_DIAG_CAPTURE_DROP,
AUDIO_DIAG_NO_PROGRESS, AUDIO_DIAG_BACKEND_UNDERRUN, AUDIO_DIAG_BACKEND_OVERFLOW, AUDIO_DIAG_ERROR, AUDIO_DIAG_LABEL, AUDIO_DIAG_LOG,
AUDIO_DIAG_CAPTURE_CLOCK, AUDIO_DIAG_PLAYBACK_CLOCK, AUDIO_DIAG_WASAPI_PLAYBACK
};
struct audio_capture_timing {
int64_t first_us, latency_us, converter_us;
unsigned frames, rate;
int measured, missing;
};
struct audio_playback_timing {
int64_t latency_us, converter_us;
unsigned frames, rate;
int measured;
};
/* Снимок перед заполнением client PCM. Padding — текущая очередь, stream_latency — отдельное
* свойство WASAPI; их сумма не объявляется измеренным временем физического воспроизведения. */
struct audio_wasapi_timing {
int64_t stream_latency_us, converter_us; // Задержка stream API и converter/cache соответственно.
unsigned frames, rate, device_rate; // Размер client callback, client/device частоты в Гц.
unsigned padding_frames, buffer_frames, period_frames, periods; // Размеры очереди/буфера в device PCM.
unsigned mapped_frames; // Уже заполненная часть незавершённого WASAPI buffer.
int shared, fixed_callback; // Режим доступа и наличие дополнительного callback-буфера.
int32_t padding_result, latency_result; // HRESULT каждого запроса; отрицательное значение — ошибка.
};
/* start/stop — управляющий поток; перед stop все producers должны быть остановлены. */
void audio_diag_start(void);
void audio_diag_stop(void);
void audio_diag_event(const void* device, int kind, int stage, int64_t value, int64_t detail);
void audio_diag_label(const void* device, uint64_t id, const char* name);
void audio_diag_log(const void* log, unsigned int level, const char* message);
void audio_diag_capture_clock(const void* device, const struct audio_capture_timing* timing);
void audio_diag_playback_clock(const void* device, const struct audio_playback_timing* timing);
/* Вызывать из playback callback; снимок копируется, устройством reporter не пользуется. */
void audio_diag_wasapi_playback(const void* device, const struct audio_wasapi_timing* timing);
#ifdef __cplusplus
}
#endif