mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
[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>
This commit is contained in:
parent
f03d68fe34
commit
2529bba760
@ -75,6 +75,8 @@ static int snd_ctl_open(struct inode *inode, struct file *file)
|
|||||||
init_waitqueue_head(&ctl->change_sleep);
|
init_waitqueue_head(&ctl->change_sleep);
|
||||||
spin_lock_init(&ctl->read_lock);
|
spin_lock_init(&ctl->read_lock);
|
||||||
ctl->card = card;
|
ctl->card = card;
|
||||||
|
ctl->prefer_pcm_subdevice = -1;
|
||||||
|
ctl->prefer_rawmidi_subdevice = -1;
|
||||||
ctl->pid = current->pid;
|
ctl->pid = current->pid;
|
||||||
file->private_data = ctl;
|
file->private_data = ctl;
|
||||||
write_lock_irqsave(&card->ctl_files_rwlock, flags);
|
write_lock_irqsave(&card->ctl_files_rwlock, flags);
|
||||||
|
@ -792,7 +792,8 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
|
|||||||
kctl = snd_ctl_file(list);
|
kctl = snd_ctl_file(list);
|
||||||
if (kctl->pid == current->pid) {
|
if (kctl->pid == current->pid) {
|
||||||
prefer_subdevice = kctl->prefer_pcm_subdevice;
|
prefer_subdevice = kctl->prefer_pcm_subdevice;
|
||||||
break;
|
if (prefer_subdevice != -1)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
up_read(&card->controls_rwsem);
|
up_read(&card->controls_rwsem);
|
||||||
|
@ -430,7 +430,8 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)
|
|||||||
kctl = snd_ctl_file(list);
|
kctl = snd_ctl_file(list);
|
||||||
if (kctl->pid == current->pid) {
|
if (kctl->pid == current->pid) {
|
||||||
subdevice = kctl->prefer_rawmidi_subdevice;
|
subdevice = kctl->prefer_rawmidi_subdevice;
|
||||||
break;
|
if (subdevice != -1)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
up_read(&card->controls_rwsem);
|
up_read(&card->controls_rwsem);
|
||||||
|
Loading…
Reference in New Issue
Block a user