]> git.alsa-project.org Git - alsa-lib.git/commitdiff
direct pcm plugins: fix channel number selection
authorClemens Ladisch <clemens@ladisch.de>
Mon, 4 Dec 2006 17:14:13 +0000 (18:14 +0100)
committerClemens Ladisch <clemens@ladisch.de>
Mon, 4 Dec 2006 17:14:13 +0000 (18:14 +0100)
The code to set the number of channels did not work when the requested
channel count was not available and when the min/max channel counts were
not identical.

Replacing the entire selection code with
snd_pcm_hw_params_set_channels_near() gives the same result in the cases
where it previously worked, and works in all other cases.

src/pcm/pcm_direct.c

index 075671022906cab2a20a197000350622d890eb74..f189181f75678f1105dbdcd78b0661e3372696cc 100644 (file)
@@ -899,28 +899,10 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
                }
                params->format = format;
        }
-       ret = snd_pcm_hw_params_set_channels(spcm, hw_params, params->channels);
+       ret = INTERNAL(snd_pcm_hw_params_set_channels_near)(spcm, hw_params, (unsigned int *)&params->channels);
        if (ret < 0) {
-               unsigned int min, max;
-               ret = INTERNAL(snd_pcm_hw_params_get_channels_min)(hw_params, &min);
-               if (ret < 0) {
-                       SNDERR("cannot obtain minimal count of channels");
-                       return ret;
-               }
-               ret = INTERNAL(snd_pcm_hw_params_get_channels_min)(hw_params, &max);
-               if (ret < 0) {
-                       SNDERR("cannot obtain maximal count of channels");
-                       return ret;
-               }
-               if (min == max) {
-                       ret = snd_pcm_hw_params_set_channels(spcm, hw_params, min);
-                       if (ret >= 0)
-                               params->channels = min;
-               }
-               if (ret < 0) {
-                       SNDERR("requested count of channels is not available");
-                       return ret;
-               }
+               SNDERR("requested count of channels is not available");
+               return ret;
        }
        ret = INTERNAL(snd_pcm_hw_params_set_rate_near)(spcm, hw_params, (unsigned int *)&params->rate, 0);
        if (ret < 0) {