61 lines
3.4 KiB
C
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
|