diff options
author | Takashi Iwai <tiwai@suse.de> | 2024-08-07 11:22:57 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2024-08-07 11:31:37 +0200 |
commit | b28654233f654cc16134b72751bf371c7bf0ce3a (patch) | |
tree | b15411bb57fa0554014c363339fa9c32fd4b1335 /sound/usb | |
parent | 08713dcc49060f2d0870483932c6d68ef8430acf (diff) |
ALSA: usb-audio: Accept multiple protocols in GTBs
It's valid to give different protocols via multiple GTBs; e.g. a MIDI
1.0 port is embedded in a MIDI 2.0 device that talks with MIDI 2.0
protocol. However, the current driver implementation assumes only a
single protocol over the whole Endpoint, and it can't handle such a
scenario.
This patch changes the driver's behavior to parse GTBs to accept
multiple protocols. Instead of switching to the last given protocol,
it adds the protocol capability bits now. Meanwhile, the default
protocol is chosen by the first given protocol in GTBs.
Practically seen, this should be a minor issue, as new devices should
specify the protocols properly via UMP Endpoint Info messages, so this
is rather just covering a corner case.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20240807092303.1935-3-tiwai@suse.de
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/midi2.c | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/sound/usb/midi2.c b/sound/usb/midi2.c index 820d3e4b672a..fa655aa4a56f 100644 --- a/sound/usb/midi2.c +++ b/sound/usb/midi2.c @@ -607,12 +607,8 @@ static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi, return 0; } - if (ump->info.protocol && ump->info.protocol != protocol) - usb_audio_info(rmidi->umidi->chip, - "Overriding preferred MIDI protocol in GTB %d: %x -> %x\n", - rmidi->usb_block_id, ump->info.protocol, - protocol); - ump->info.protocol = protocol; + if (!ump->info.protocol) + ump->info.protocol = protocol; protocol_caps = protocol; switch (desc->bMIDIProtocol) { @@ -624,13 +620,7 @@ static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi, break; } - if (ump->info.protocol_caps && ump->info.protocol_caps != protocol_caps) - usb_audio_info(rmidi->umidi->chip, - "Overriding MIDI protocol caps in GTB %d: %x -> %x\n", - rmidi->usb_block_id, ump->info.protocol_caps, - protocol_caps); - ump->info.protocol_caps = protocol_caps; - + ump->info.protocol_caps |= protocol_caps; return 0; } |