diff --git a/NEWS b/NEWS index 48fa2401a..65fdd1002 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ ver 0.23.15 (not yet released) * decoder - ffmpeg: fix build failure with FFmpeg 6.1 +* output + - alsa: limit buffer time to 2 seconds ver 0.23.14 (2023/10/08) * decoder diff --git a/src/input/plugins/AlsaInputPlugin.cxx b/src/input/plugins/AlsaInputPlugin.cxx index ccf0b10d8..d76359833 100644 --- a/src/input/plugins/AlsaInputPlugin.cxx +++ b/src/input/plugins/AlsaInputPlugin.cxx @@ -369,9 +369,14 @@ AlsaInputStream::ConfigureCapture(AudioFormat audio_format) period_size_min, period_size_max, period_time_min, period_time_max); - /* choose the maximum possible buffer_size ... */ - snd_pcm_hw_params_set_buffer_size(capture_handle, hw_params, - buffer_size_max); + /* choose the maximum buffer_time up to limit of 2 seconds ... */ + unsigned buffer_time = buffer_time_max; + if (buffer_time > 2000000U) + buffer_time = 2000000U; + int direction = -1; + if ((err = snd_pcm_hw_params_set_buffer_time_near(capture_handle, + hw_params, &buffer_time, &direction)) < 0) + throw Alsa::MakeError(err, "Cannot set buffer time"); /* ... and calculate the period_size to have four periods in one buffer; this way, we get woken up often enough to avoid @@ -379,7 +384,7 @@ AlsaInputStream::ConfigureCapture(AudioFormat audio_format) snd_pcm_uframes_t buffer_size; if (snd_pcm_hw_params_get_buffer_size(hw_params, &buffer_size) == 0) { snd_pcm_uframes_t period_size = buffer_size / 4; - int direction = -1; + direction = -1; if ((err = snd_pcm_hw_params_set_period_size_near(capture_handle, hw_params, &period_size, &direction)) < 0) throw Alsa::MakeError(err, "Cannot set period size");