diff options
Diffstat (limited to 'recipes/pulseaudio/pulseaudio-0.9.15/periodfix.patch')
-rw-r--r-- | recipes/pulseaudio/pulseaudio-0.9.15/periodfix.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/recipes/pulseaudio/pulseaudio-0.9.15/periodfix.patch b/recipes/pulseaudio/pulseaudio-0.9.15/periodfix.patch new file mode 100644 index 0000000000..3a1c605009 --- /dev/null +++ b/recipes/pulseaudio/pulseaudio-0.9.15/periodfix.patch @@ -0,0 +1,73 @@ +X-Git-Url: http://git.0pointer.de/?p=pulseaudio.git;a=blobdiff_plain;f=src%2Fmodules%2Falsa%2Falsa-util.c;h=107bec357c7889f0197853f5e5f1951a5a2f5be0;hp=a3a045080dac0e1b30e8671443ce73a03337cf14;hb=4bffc7849f7898fa85dd6ac8e735db86b57814b3;hpb=d2b5ae5525e9036c4f91b1615879a5a07aac5bf2 + +diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c +index a3a0450..107bec3 100644 +--- a/src/modules/alsa/alsa-util.c ++++ b/src/modules/alsa/alsa-util.c +@@ -334,7 +334,6 @@ int pa_alsa_set_hw_params( + int ret = -1; + snd_pcm_uframes_t _period_size = period_size ? *period_size : 0; + unsigned int _periods = periods ? *periods : 0; +- snd_pcm_uframes_t buffer_size; + unsigned int r = ss->rate; + unsigned int c = ss->channels; + pa_sample_format_t f = ss->format; +@@ -390,39 +389,47 @@ int pa_alsa_set_hw_params( + goto finish; + + if (_period_size && tsched_size && _periods) { ++ + /* Adjust the buffer sizes, if we didn't get the rate we were asking for */ + _period_size = (snd_pcm_uframes_t) (((uint64_t) _period_size * r) / ss->rate); + tsched_size = (snd_pcm_uframes_t) (((uint64_t) tsched_size * r) / ss->rate); + + if (_use_tsched) { +- _period_size = tsched_size; +- _periods = 1; ++ snd_pcm_uframes_t buffer_size; + + pa_assert_se(snd_pcm_hw_params_get_buffer_size_max(hwparams, &buffer_size) == 0); + pa_log_debug("Maximum hw buffer size is %u ms", (unsigned) buffer_size * 1000 / r); ++ ++ _period_size = tsched_size; ++ _periods = 1; + } + ++ if (_period_size > 0 && _periods > 0) { ++ snd_pcm_uframes_t buffer_size; ++ + buffer_size = _periods * _period_size; + ++ if ((ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams, &buffer_size)) < 0) ++ pa_log_info("snd_pcm_hw_params_set_buffer_size_near() failed: %s", pa_alsa_strerror(ret)); ++ } ++ + if (_periods > 0) { + +- /* First we pass 0 as direction to get exactly what we asked +- * for. That this is necessary is presumably a bug in ALSA */ ++ /* First we pass 0 as direction to get exactly what we ++ * asked for. That this is necessary is presumably a bug ++ * in ALSA. All in all this is mostly a hint to ALSA, so ++ * we don't care if this fails. */ + + dir = 0; +- if ((ret = snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir)) < 0) { ++ if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir) < 0) { + dir = 1; +- if ((ret = snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir)) < 0) { ++ if (snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir) < 0) { + dir = -1; + if ((ret = snd_pcm_hw_params_set_periods_near(pcm_handle, hwparams, &_periods, &dir)) < 0) +- goto finish; ++ pa_log_info("snd_pcm_hw_params_set_periods_near() failed: %s", pa_alsa_strerror(ret)); + } + } + } +- +- if (_period_size > 0) +- if ((ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams, &buffer_size)) < 0) +- goto finish; + } + + if ((ret = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) |