diff options
author | Takashi Iwai <tiwai@suse.de> | 2024-08-07 11:22:56 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2024-08-07 11:31:37 +0200 |
commit | 08713dcc49060f2d0870483932c6d68ef8430acf (patch) | |
tree | 7eb001aeb1d5655a4c8580aaa0a8687760b7a052 /sound/core/ump.c | |
parent | 901e85677ec0bb9a69fb9eab1feafe0c4eb7d07e (diff) | |
download | lwn-08713dcc49060f2d0870483932c6d68ef8430acf.tar.gz lwn-08713dcc49060f2d0870483932c6d68ef8430acf.zip |
ALSA: ump: Choose the protocol when protocol caps are changed
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
Diffstat (limited to 'sound/core/ump.c')
-rw-r--r-- | sound/core/ump.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/sound/core/ump.c b/sound/core/ump.c index c7c3581bbbbc..4502de891adf 100644 --- a/sound/core/ump.c +++ b/sound/core/ump.c @@ -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++) { |