summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2023-06-12 11:10:52 +0300
committerTakashi Iwai <tiwai@suse.de>2023-06-12 19:22:33 +0300
commit6a8b4800ae54e9ceb8d017bcfb61d04ff0da90f2 (patch)
tree3c40c2c483e656616d8f93167b1384fc4a714411
parent174a6dfbc17ee9defed4daeeea6061ef34644f02 (diff)
downloadlinux-6a8b4800ae54e9ceb8d017bcfb61d04ff0da90f2.tar.xz
ALSA: seq: ump: Notify UMP protocol change to sequencer
UMP v1.1 supports the protocol switch via a UMP Stream message. When it's received, we need to take care of the midi_version field in the corresponding sequencer client, too. This patch introduces a new ops to notify the protocol change to snd_seq_ump_ops for handling it. Link: https://lore.kernel.org/r/20230612081054.17200-9-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--include/sound/ump.h1
-rw-r--r--sound/core/seq/seq_ump_client.c10
-rw-r--r--sound/core/ump.c13
3 files changed, 24 insertions, 0 deletions
diff --git a/include/sound/ump.h b/include/sound/ump.h
index 0e9c048346fa..68478e7be3b4 100644
--- a/include/sound/ump.h
+++ b/include/sound/ump.h
@@ -72,6 +72,7 @@ struct snd_seq_ump_ops {
const u32 *data, int words);
int (*notify_fb_change)(struct snd_ump_endpoint *ump,
struct snd_ump_block *fb);
+ int (*switch_protocol)(struct snd_ump_endpoint *ump);
};
struct snd_ump_block {
diff --git a/sound/core/seq/seq_ump_client.c b/sound/core/seq/seq_ump_client.c
index 901a670dcb36..fe21c801af74 100644
--- a/sound/core/seq/seq_ump_client.c
+++ b/sound/core/seq/seq_ump_client.c
@@ -439,9 +439,19 @@ static int seq_ump_notify_fb_change(struct snd_ump_endpoint *ump,
return 0;
}
+/* UMP protocol change notification; just update the midi_version field */
+static int seq_ump_switch_protocol(struct snd_ump_endpoint *ump)
+{
+ if (!ump->seq_client)
+ return -ENODEV;
+ setup_client_midi_version(ump->seq_client);
+ return 0;
+}
+
static const struct snd_seq_ump_ops seq_ump_ops = {
.input_receive = seq_ump_input_receive,
.notify_fb_change = seq_ump_notify_fb_change,
+ .switch_protocol = seq_ump_switch_protocol,
};
/* create a sequencer client and ports for the given UMP endpoint */
diff --git a/sound/core/ump.c b/sound/core/ump.c
index c0cda12bce10..f364bb290d3a 100644
--- a/sound/core/ump.c
+++ b/sound/core/ump.c
@@ -657,14 +657,27 @@ static int ump_handle_product_id_msg(struct snd_ump_endpoint *ump,
buf->raw, 2);
}
+/* notify the protocol change to sequencer */
+static void seq_notify_protocol(struct snd_ump_endpoint *ump)
+{
+#if IS_ENABLED(CONFIG_SND_SEQUENCER)
+ if (ump->seq_ops && ump->seq_ops->switch_protocol)
+ ump->seq_ops->switch_protocol(ump);
+#endif /* CONFIG_SND_SEQUENCER */
+}
+
/* handle EP stream config message; update the UMP protocol */
static int ump_handle_stream_cfg_msg(struct snd_ump_endpoint *ump,
const union snd_ump_stream_msg *buf)
{
+ unsigned int old_protocol = ump->info.protocol;
+
ump->info.protocol =
(buf->stream_cfg.protocol << 8) | buf->stream_cfg.jrts;
ump_dbg(ump, "Current protocol = %x (caps = %x)\n",
ump->info.protocol, ump->info.protocol_caps);
+ if (ump->parsed && ump->info.protocol != old_protocol)
+ seq_notify_protocol(ump);
return 1; /* finished */
}