Reduce Linux voice capture latency and verify device timing
This commit is contained in:
1 parent
3276204196
commit
7477da42a5
11 files changed
+342
-38
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user