sound: Fix OSS API requests for more than 8 channels

Audio devices with more than 8 channels need bitperfect mode to operate,
the vchan processing chain is limited to 8 channels. For these devices,
let applications properly select a certain number of channels supported
by the driver, instead of mapping the request to a vchan format.

Reviewed by:	emaste
Pull Request:	https://github.com/freebsd/freebsd-src/pull/914

(cherry picked from commit 61c8316796)
This commit is contained in:
Florian Walpen 2023-11-25 01:04:34 +01:00 committed by Ed Maste
parent 49e126a03b
commit 602ea0ced1

View file

@ -1502,24 +1502,31 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
case SOUND_PCM_WRITE_CHANNELS:
/* case SNDCTL_DSP_CHANNELS: ( == SOUND_PCM_WRITE_CHANNELS) */
if (*arg_i < 0) {
if (*arg_i < 0 || *arg_i > AFMT_CHANNEL_MAX) {
*arg_i = 0;
ret = EINVAL;
break;
}
if (*arg_i != 0) {
struct pcmchan_matrix *m;
uint32_t ext;
uint32_t ext = 0;
tmp = 0;
if (*arg_i > SND_CHN_MAX)
*arg_i = SND_CHN_MAX;
/*
* Map channel number to surround sound formats.
* Devices that need bitperfect mode to operate
* (e.g. more than SND_CHN_MAX channels) are not
* subject to any mapping.
*/
if (!(dsp_get_flags(i_dev) & SD_F_BITPERFECT)) {
struct pcmchan_matrix *m;
m = feeder_matrix_default_channel_map(*arg_i);
if (m != NULL)
ext = m->ext;
else
ext = 0;
if (*arg_i > SND_CHN_MAX)
*arg_i = SND_CHN_MAX;
m = feeder_matrix_default_channel_map(*arg_i);
if (m != NULL)
ext = m->ext;
}
PCM_ACQUIRE_QUICK(d);
if (wrch) {