mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
ALSA: usb-audio: Manage number of rawmidis globally
We're going to create rawmidi objects for MIDI 2.0 in a different code from the current code for USB-MIDI 1.0. As a preliminary work, this patch adds the number of rawmidi objects to keep globally in a USB-audio card instance, so that it can be referred from both MIDI 1.0 and 2.0 code. Reviewed-by: Jaroslav Kysela <perex@perex.cz> Link: https://lore.kernel.org/r/20230523075358.9672-8-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
fa030f666d
commit
bb1bf4fa59
@ -179,8 +179,9 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
|
||||
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
|
||||
altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) {
|
||||
int err = __snd_usbmidi_create(chip->card, iface,
|
||||
&chip->midi_list, NULL,
|
||||
chip->usb_id);
|
||||
&chip->midi_list, NULL,
|
||||
chip->usb_id,
|
||||
&chip->num_rawmidis);
|
||||
if (err < 0) {
|
||||
dev_err(&dev->dev,
|
||||
"%u:%d: cannot create sequencer device\n",
|
||||
|
@ -2461,7 +2461,8 @@ int __snd_usbmidi_create(struct snd_card *card,
|
||||
struct usb_interface *iface,
|
||||
struct list_head *midi_list,
|
||||
const struct snd_usb_audio_quirk *quirk,
|
||||
unsigned int usb_id)
|
||||
unsigned int usb_id,
|
||||
unsigned int *num_rawmidis)
|
||||
{
|
||||
struct snd_usb_midi *umidi;
|
||||
struct snd_usb_midi_endpoint_info endpoints[MIDI_MAX_ENDPOINTS];
|
||||
@ -2476,6 +2477,8 @@ int __snd_usbmidi_create(struct snd_card *card,
|
||||
umidi->iface = iface;
|
||||
umidi->quirk = quirk;
|
||||
umidi->usb_protocol_ops = &snd_usbmidi_standard_ops;
|
||||
if (num_rawmidis)
|
||||
umidi->next_midi_device = *num_rawmidis;
|
||||
spin_lock_init(&umidi->disc_lock);
|
||||
init_rwsem(&umidi->disc_rwsem);
|
||||
mutex_init(&umidi->mutex);
|
||||
@ -2595,6 +2598,8 @@ int __snd_usbmidi_create(struct snd_card *card,
|
||||
usb_autopm_get_interface_no_resume(umidi->iface);
|
||||
|
||||
list_add_tail(&umidi->list, midi_list);
|
||||
if (num_rawmidis)
|
||||
*num_rawmidis = umidi->next_midi_device;
|
||||
return 0;
|
||||
|
||||
free_midi:
|
||||
|
@ -46,14 +46,15 @@ int __snd_usbmidi_create(struct snd_card *card,
|
||||
struct usb_interface *iface,
|
||||
struct list_head *midi_list,
|
||||
const struct snd_usb_audio_quirk *quirk,
|
||||
unsigned int usb_id);
|
||||
unsigned int usb_id,
|
||||
unsigned int *num_rawmidis);
|
||||
|
||||
static inline int snd_usbmidi_create(struct snd_card *card,
|
||||
struct usb_interface *iface,
|
||||
struct list_head *midi_list,
|
||||
const struct snd_usb_audio_quirk *quirk)
|
||||
{
|
||||
return __snd_usbmidi_create(card, iface, midi_list, quirk, 0);
|
||||
return __snd_usbmidi_create(card, iface, midi_list, quirk, 0, NULL);
|
||||
}
|
||||
|
||||
void snd_usbmidi_input_stop(struct list_head *p);
|
||||
|
@ -436,8 +436,9 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip,
|
||||
chip->usb_id == USB_ID(0x0582, 0x002b)
|
||||
? &ua700_quirk : &uaxx_quirk;
|
||||
return __snd_usbmidi_create(chip->card, iface,
|
||||
&chip->midi_list, quirk,
|
||||
chip->usb_id);
|
||||
&chip->midi_list, quirk,
|
||||
chip->usb_id,
|
||||
&chip->num_rawmidis);
|
||||
}
|
||||
|
||||
if (altsd->bNumEndpoints != 1)
|
||||
|
@ -49,6 +49,7 @@ struct snd_usb_audio {
|
||||
struct list_head clock_ref_list; /* list of clock refcounts */
|
||||
int pcm_devs;
|
||||
|
||||
unsigned int num_rawmidis; /* number of created rawmidi devices */
|
||||
struct list_head midi_list; /* list of midi interfaces */
|
||||
|
||||
struct list_head mixer_list; /* list of mixer interfaces */
|
||||
|
Loading…
Reference in New Issue
Block a user