[ALSA] Fix substream selection in PCM and rawmidi The PCM and rawmidi substreams can be selected explicitly by opening control handle and set via *_PREFER_SUBDEVICE ioctl. But, when multiple controls are opened, the driver gets confused. The patch fixes the initialization of prefer_*_subdevice and the check of multiple controls. The first set subdevice is picked up as the valid one. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
diff --git a/sound/core/control.c b/sound/core/control.c index 31ad581..ac14426 100644 --- a/sound/core/control.c +++ b/sound/core/control.c
@@ -75,6 +75,8 @@ init_waitqueue_head(&ctl->change_sleep); spin_lock_init(&ctl->read_lock); ctl->card = card; + ctl->prefer_pcm_subdevice = -1; + ctl->prefer_rawmidi_subdevice = -1; ctl->pid = current->pid; file->private_data = ctl; write_lock_irqsave(&card->ctl_files_rwlock, flags);
diff --git a/sound/core/pcm.c b/sound/core/pcm.c index f52178a..ed3b094 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c
@@ -792,7 +792,8 @@ kctl = snd_ctl_file(list); if (kctl->pid == current->pid) { prefer_subdevice = kctl->prefer_pcm_subdevice; - break; + if (prefer_subdevice != -1) + break; } } up_read(&card->controls_rwsem);
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 8a2bdfa..269c467 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c
@@ -430,7 +430,8 @@ kctl = snd_ctl_file(list); if (kctl->pid == current->pid) { subdevice = kctl->prefer_rawmidi_subdevice; - break; + if (subdevice != -1) + break; } } up_read(&card->controls_rwsem);