From c87ef15e8241b5d6235c3d17ee520d5e9e812c56 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 4 Nov 2020 14:46:49 +0100 Subject: [PATCH] ALSA: configure capture settings before playback This fixes an issue with some soundcards e.g. "AxeFx III". Device configuration fails unless set_hwpar() is performed for the capture device before configuring the playack device (half duplex is fine, too). --- libs/backends/alsa/zita-alsa-pcmi.cc | 34 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/libs/backends/alsa/zita-alsa-pcmi.cc b/libs/backends/alsa/zita-alsa-pcmi.cc index 8587bdeb35..57e4789379 100644 --- a/libs/backends/alsa/zita-alsa-pcmi.cc +++ b/libs/backends/alsa/zita-alsa-pcmi.cc @@ -438,22 +438,8 @@ void Alsa_pcmi::initialise (const char *play_name, const char *capt_name, const } } + /* devices opened, now perform hardware config */ _state = -2; - if (_play_handle) - { - if (snd_pcm_hw_params_malloc (&_play_hwpar) < 0) - { - if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't allocate playback hw params\n"); - return; - } - if (snd_pcm_sw_params_malloc (&_play_swpar) < 0) - { - if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't allocate playback sw params\n"); - return; - } - if (set_hwpar (_play_handle, _play_hwpar, "playback", _play_nfrag, &_play_nchan) < 0) return; - if (set_swpar (_play_handle, _play_swpar, "playback") < 0) return; - } if (_capt_handle) { @@ -471,6 +457,24 @@ void Alsa_pcmi::initialise (const char *play_name, const char *capt_name, const if (set_swpar (_capt_handle, _capt_swpar, "capture") < 0) return; } + if (_play_handle) + { + if (snd_pcm_hw_params_malloc (&_play_hwpar) < 0) + { + if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't allocate playback hw params\n"); + return; + } + if (snd_pcm_sw_params_malloc (&_play_swpar) < 0) + { + if (_debug & DEBUG_INIT) fprintf (stderr, "Alsa_pcmi: can't allocate playback sw params\n"); + return; + } + if (set_hwpar (_play_handle, _play_hwpar, "playback", _play_nfrag, &_play_nchan) < 0) return; + if (set_swpar (_play_handle, _play_swpar, "playback") < 0) return; + } + + /* devices are configured, now confirm settings and setup format conversion */ + if (_play_handle) { if (snd_pcm_hw_params_get_rate (_play_hwpar, &fsamp, &dir) || (fsamp != _fsamp) || dir)