Reduce Linux voice capture latency and verify device timing

This commit is contained in:
evgeny committed 2026-10-15 17:26:09 +02:00
1 parent 3276204196
commit 7477da42a5
11 files changed
+342 -38

No files matched your search

+14
View File
@@ -12,6 +12,18 @@ extern "C" void audio_stream_log_route(ma_device* device, int capture);
AudioDevice::AudioDevice() { m_clock.start(); }
AudioDevice::~AudioDevice() { close(); }
void AudioDevice::requestLowLatency(ma_context* context, ma_device_config& config) {
#ifdef __linux__
if (context && context->backend == ma_backend_pulseaudio) {
// Период I/O не зависит от размера кадра AEC/кодека; сервер согласует фактический буфер.
config.periodSizeInFrames = 0;
config.periodSizeInMilliseconds = 10;
}
#else
(void)context; (void)config;
#endif
}
bool AudioDevice::init(ma_context* context, ma_device_config config, const char* role, uint64_t session, Callback callback) {
close();
m_role = role;
@@ -22,6 +34,8 @@ bool AudioDevice::init(ma_context* context, ma_device_config config, const char*
config.noFixedSizedCallback = MA_TRUE; // Аппаратные чанки не требуют скрытого накопителя miniaudio.
config.notificationCallback = notification;
config.pUserData = this;
DEBUG_INFO(DEBUG_CATEGORY_CALL, "audio: %s requested backend=%s rate=%u period_frames=%u period_ms=%u",
role, ma_get_backend_name(context->backend), config.sampleRate, config.periodSizeInFrames, config.periodSizeInMilliseconds);
ma_result result = ma_device_init(context, &config, device);
if (result != MA_SUCCESS) {
DEBUG_ERROR(DEBUG_CATEGORY_CALL, "audio: %s init failed result=%d", role, result);