]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ALSA: usb-audio: Fix duplicated name in MIDI substream names
authorTakashi Iwai <tiwai@suse.de>
Tue, 29 Apr 2025 18:36:15 +0000 (20:36 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:13:52 +0000 (11:13 +0200)
[ Upstream commit 0759e77a6d9bd34a874da73721ce4a7dc6665023 ]

The MIDI substream name string is constructed from the combination of
the card shortname (which is taken from USB iProduct) and the USB
iJack.  The problem is that some devices put the product name to the
iJack field, too.  For example, aplaymidi -l output on the Lanchkey MK
49 are like:

  % aplaymidi -l
  Port    Client name            Port name
  44:0    Launchkey MK4 49       Launchkey MK4 49 Launchkey MK4
  44:1    Launchkey MK4 49       Launchkey MK4 49 Launchkey MK4

where the actual iJack name can't be seen because it's truncated due
to the doubly words.

For resolving those situations, this patch compares the iJack string
with the card shortname, and drops if both start with the same words.
Then the result becomes like:

  % aplaymidi -l
  Port    Client name            Port name
  40:0    Launchkey MK4 49       Launchkey MK4 49 MIDI In
  40:1    Launchkey MK4 49       Launchkey MK4 49 DAW In

A caveat is that there are some pre-defined names for certain
devices in the driver code, and this workaround shouldn't be applied
to them.  Similarly, when the iJack isn't specified, we should skip
this check, too.  The patch added those checks in addition to the
string comparison.

Suggested-by: Paul Davis <paul@linuxaudiosystems.com>
Tested-by: Paul Davis <paul@linuxaudiosystems.com>
Link: https://lore.kernel.org/CAFa_cKmEDQWcJatbYWi6A58Zg4Ma9_6Nr3k5LhqwyxC-P_kXtw@mail.gmail.com
Link: https://patch.msgid.link/20250429183626.20773-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/usb/midi.c

index 826ac870f246903178b50e1e73d1287b728d7350..a792ada18863ac1840fbc26ab6d84b70d8361c58 100644 (file)
@@ -1885,10 +1885,18 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi *umidi,
        }
 
        port_info = find_port_info(umidi, number);
-       name_format = port_info ? port_info->name :
-               (jack_name != default_jack_name  ? "%s %s" : "%s %s %d");
-       snprintf(substream->name, sizeof(substream->name),
-                name_format, umidi->card->shortname, jack_name, number + 1);
+       if (port_info || jack_name == default_jack_name ||
+           strncmp(umidi->card->shortname, jack_name, strlen(umidi->card->shortname)) != 0) {
+               name_format = port_info ? port_info->name :
+                       (jack_name != default_jack_name  ? "%s %s" : "%s %s %d");
+               snprintf(substream->name, sizeof(substream->name),
+                        name_format, umidi->card->shortname, jack_name, number + 1);
+       } else {
+               /* The manufacturer included the iProduct name in the jack
+                * name, do not use both
+                */
+               strscpy(substream->name, jack_name);
+       }
 
        *rsubstream = substream;
 }