ALSA: ump: Choose the protocol when protocol caps are changed
authorTakashi Iwai <tiwai@suse.de>
Wed, 7 Aug 2024 09:22:56 +0000 (11:22 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 7 Aug 2024 09:31:37 +0000 (11:31 +0200)
When the protocol capability bits are changed via Endpoint Info update
notification, we should check the validity of the current protocol and
reset it if needed, too.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20240807092303.1935-2-tiwai@suse.de
sound/core/ump.c

index c7c3581bbbbc2f5f489cbfafc3401d57d6e1663c..4502de891adff2cf83e155b37027b780722cda50 100644 (file)
@@ -657,6 +657,17 @@ static int ump_append_string(struct snd_ump_endpoint *ump, char *dest,
                format == UMP_STREAM_MSG_FORMAT_END);
 }
 
+/* Choose the default protocol */
+static void choose_default_protocol(struct snd_ump_endpoint *ump)
+{
+       if (ump->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK)
+               return;
+       if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI2)
+               ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI2;
+       else
+               ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI1;
+}
+
 /* handle EP info stream message; update the UMP attributes */
 static int ump_handle_ep_info_msg(struct snd_ump_endpoint *ump,
                                  const union snd_ump_stream_msg *buf)
@@ -678,6 +689,10 @@ static int ump_handle_ep_info_msg(struct snd_ump_endpoint *ump,
 
        ump_dbg(ump, "EP info: version=%x, num_blocks=%x, proto_caps=%x\n",
                ump->info.version, ump->info.num_blocks, ump->info.protocol_caps);
+
+       ump->info.protocol &= ump->info.protocol_caps;
+       choose_default_protocol(ump);
+
        return 1; /* finished */
 }
 
@@ -1040,12 +1055,7 @@ int snd_ump_parse_endpoint(struct snd_ump_endpoint *ump)
                ump_dbg(ump, "Unable to get UMP EP stream config\n");
 
        /* If no protocol is set by some reason, assume the valid one */
-       if (!(ump->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK)) {
-               if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI2)
-                       ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI2;
-               else if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI1)
-                       ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI1;
-       }
+       choose_default_protocol(ump);
 
        /* Query and create blocks from Function Blocks */
        for (blk = 0; blk < ump->info.num_blocks; blk++) {