]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: seq: ump: Fix seq port updates per FB info notify
authorTakashi Iwai <tiwai@suse.de>
Thu, 28 Nov 2024 17:04:22 +0000 (18:04 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 29 Nov 2024 10:04:10 +0000 (11:04 +0100)
update_port_infos() is called when a UMP FB Info update notification
is received, and this function is supposed to update the attributes of
the corresponding sequencer port.  However, the function had a few
issues and it brought to the incorrect states.  Namely:

- It tried to get a wrong sequencer info for the update without
  correcting the port number with the group-offset 1
- The loop exited immediately when a sequencer port isn't present;
  this ended up with the truncation if a sequencer port in the middle
  goes away

This patch addresses those bugs.

Fixes: 4a16a3af0571 ("ALSA: seq: ump: Handle FB info update")
Link: https://patch.msgid.link/20241128170423.23351-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/seq/seq_ump_client.c

index e5d3f4d206bf6ac8912fdd0e06a781210e5a8755..e956f17f379282b40145a1b37956d2e4930db491 100644 (file)
@@ -257,12 +257,12 @@ static void update_port_infos(struct seq_ump_client *client)
                        continue;
 
                old->addr.client = client->seq_client;
-               old->addr.port = i;
+               old->addr.port = ump_group_to_seq_port(i);
                err = snd_seq_kernel_client_ctl(client->seq_client,
                                                SNDRV_SEQ_IOCTL_GET_PORT_INFO,
                                                old);
                if (err < 0)
-                       return;
+                       continue;
                fill_port_info(new, client, &client->ump->groups[i]);
                if (old->capability == new->capability &&
                    !strcmp(old->name, new->name))
@@ -271,7 +271,7 @@ static void update_port_infos(struct seq_ump_client *client)
                                                SNDRV_SEQ_IOCTL_SET_PORT_INFO,
                                                new);
                if (err < 0)
-                       return;
+                       continue;
                /* notify to system port */
                snd_seq_system_client_ev_port_change(client->seq_client, i);
        }