direct pcm plugins: fix channel number selection

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.
This commit is contained in:
Clemens Ladisch 2006-12-04 18:14:13 +01:00
parent 0f99fe7830
commit 9819099e0e

View file

@ -899,29 +899,11 @@ 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);
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;
}
ret = INTERNAL(snd_pcm_hw_params_set_channels_near)(spcm, hw_params, (unsigned int *)&params->channels);
if (ret < 0) {
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) {
SNDERR("requested rate is not available");