> > as suggested by > > https://bugs.freedesktop.org/show_bug.cgi?id=84804 > > > > Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net> > > --- > > src/modules/alsa/alsa-util.c | 15 +++++++++++++++ > > 1 file changed, 15 insertions(+) > > > > diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c > > index 4131cff..e382d4f 100644 > > --- a/src/modules/alsa/alsa-util.c > > +++ b/src/modules/alsa/alsa-util.c > > @@ -183,6 +183,19 @@ static int set_buffer_size(snd_pcm_t *pcm_handle, > snd_pcm_hw_params_t *hwparams, > > return 0; > > } > > > > +static void check_access(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t > *hwparams, bool use_mmap) { > > + if ((use_mmap && !snd_pcm_hw_params_test_access(pcm_handle, > hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED)) || > > + !snd_pcm_hw_params_test_access(pcm_handle, hwparams, > SND_PCM_ACCESS_RW_INTERLEAVED)) > > + pa_log_error("Weird, PCM claims to support interleaved access, > but snd_pcm_hw_params_set_access() failed."); > > HW Params of device "hw:0,0": > -------------------- > ACCESS: MMAP_NONINTERLEAVED RW_NONINTERLEAVED > FORMAT: S32_LE > SUBFORMAT: STD > SAMPLE_BITS: 32 > FRAME_BITS: [448 832] > CHANNELS: [14 26] > RATE: [32000 96000] > PERIOD_TIME: (666 256000] > PERIOD_SIZE: [64 8192] > PERIOD_BYTES: [3584 851968] > PERIODS: 2 > BUFFER_TIME: (1333 512000] > BUFFER_SIZE: [128 16384] > BUFFER_BYTES: [7168 1703936] > TICK_TIME: ALL > > if use of test_access is to prevent set_access corrupt the configuration > space of hw_param when access is not supported, I am not sure if I understand your comment correctly the idea of the patch is to improve the logging in case _INTERLEAVED is not supported (but NONINTERLEAVED is) I don't want to change the current behaviour in the normal case, hence check_access() is called after trying to set the access method what do you means with corruption of config space? regards, p. > > if (snd_pcm_hw_params_test_access(pcm_handle, hwparams, > SND_PCM_ACCESS_MMAP_INTERLEAVED) == 0) { > ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, > SND_PCM_ACCESS_MMAP_INTERLEAVED); > pa_log_error("snd_pcm_hw_params_set_access() failed: %s", > pa_alsa_strerror(ret)); > goto finish; > } > > else if (snd_pcm_hw_params_test_access(pcm_handle, hwparams, > SND_PCM_ACCESS_RW_INTERLEAVED) == 0) { > ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, > SND_PCM_ACCESS_RW_INTERLEAVED); > pa_log_error("snd_pcm_hw_params_set_access() failed: %s", > pa_alsa_strerror(ret)); > goto finish; > } > else { > pa_log_error("Pulseaudio does not support non interleaved access nor > complex access. "); > goto finish; > } > > > + > > + if ((use_mmap && !snd_pcm_hw_params_test_access(pcm_handle, > hwparams, SND_PCM_ACCESS_MMAP_NONINTERLEAVED)) || > > + !snd_pcm_hw_params_test_access(pcm_handle, hwparams, > SND_PCM_ACCESS_RW_NONINTERLEAVED)) > > + pa_log_error("PCM seems to support non-interleaved access, but > PA doesn't."); > > + else if (use_mmap && !snd_pcm_hw_params_test_access(pcm_handle, > hwparams, SND_PCM_ACCESS_MMAP_COMPLEX)) { > > + pa_log_error("PCM seems to support mmapped complex access, but > PA doesn't."); > > + } > > +} > > + > > /* Set the hardware parameters of the given ALSA device. Returns the > > * selected fragment settings in *buffer_size and *period_size. Determine > > * whether mmap and tsched mode can be enabled. */ > > @@ -229,6 +242,7 @@ int pa_alsa_set_hw_params( > > > > if ((ret = snd_pcm_hw_params_set_access(pcm_handle, > hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { > > pa_log_debug("snd_pcm_hw_params_set_access() failed: > %s", pa_alsa_strerror(ret)); > > + check_access(pcm_handle, hwparams, true); > > goto finish; > > } > > > > @@ -237,6 +251,7 @@ int pa_alsa_set_hw_params( > > > > } else if ((ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, > SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { > > pa_log_debug("snd_pcm_hw_params_set_access() failed: %s", > pa_alsa_strerror(ret)); > > + check_access(pcm_handle, hwparams, false); > > goto finish; > > } > > > -- Peter Meerwald +43-664-2444418 (mobile)