Commit 329ffe11 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: seq: Allow suppressing UMP conversions

A sequencer client like seq_dummy rather doesn't want to convert UMP
events but receives / sends as is.  Add a new event filter flag to
suppress the automatic UMP conversion and applies accordingly.
Reviewed-by: default avatarJaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230523075358.9672-32-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e9e02819
...@@ -347,6 +347,7 @@ typedef int __bitwise snd_seq_client_type_t; ...@@ -347,6 +347,7 @@ typedef int __bitwise snd_seq_client_type_t;
#define SNDRV_SEQ_FILTER_BROADCAST (1U<<0) /* accept broadcast messages */ #define SNDRV_SEQ_FILTER_BROADCAST (1U<<0) /* accept broadcast messages */
#define SNDRV_SEQ_FILTER_MULTICAST (1U<<1) /* accept multicast messages */ #define SNDRV_SEQ_FILTER_MULTICAST (1U<<1) /* accept multicast messages */
#define SNDRV_SEQ_FILTER_BOUNCE (1U<<2) /* accept bounce event in error */ #define SNDRV_SEQ_FILTER_BOUNCE (1U<<2) /* accept bounce event in error */
#define SNDRV_SEQ_FILTER_NO_CONVERT (1U<<30) /* don't convert UMP events */
#define SNDRV_SEQ_FILTER_USE_EVENT (1U<<31) /* use event filter */ #define SNDRV_SEQ_FILTER_USE_EVENT (1U<<31) /* use event filter */
struct snd_seq_client_info { struct snd_seq_client_info {
......
...@@ -671,14 +671,16 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client, ...@@ -671,14 +671,16 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client,
dest_port->time_real); dest_port->time_real);
#if IS_ENABLED(CONFIG_SND_SEQ_UMP) #if IS_ENABLED(CONFIG_SND_SEQ_UMP)
if (snd_seq_ev_is_ump(event)) { if (!(dest->filter & SNDRV_SEQ_FILTER_NO_CONVERT)) {
result = snd_seq_deliver_from_ump(client, dest, dest_port, if (snd_seq_ev_is_ump(event)) {
event, atomic, hop); result = snd_seq_deliver_from_ump(client, dest, dest_port,
goto __skip; event, atomic, hop);
} else if (snd_seq_client_is_ump(dest)) { goto __skip;
result = snd_seq_deliver_to_ump(client, dest, dest_port, } else if (snd_seq_client_is_ump(dest)) {
event, atomic, hop); result = snd_seq_deliver_to_ump(client, dest, dest_port,
goto __skip; event, atomic, hop);
goto __skip;
}
} }
#endif /* CONFIG_SND_SEQ_UMP */ #endif /* CONFIG_SND_SEQ_UMP */
......
...@@ -152,6 +152,7 @@ static int __init ...@@ -152,6 +152,7 @@ static int __init
register_client(void) register_client(void)
{ {
struct snd_seq_dummy_port *rec1, *rec2; struct snd_seq_dummy_port *rec1, *rec2;
struct snd_seq_client *client;
int i; int i;
if (ports < 1) { if (ports < 1) {
...@@ -165,6 +166,13 @@ register_client(void) ...@@ -165,6 +166,13 @@ register_client(void)
if (my_client < 0) if (my_client < 0)
return my_client; return my_client;
/* don't convert events but just pass-through */
client = snd_seq_kernel_client_get(my_client);
if (!client)
return -EINVAL;
client->filter = SNDRV_SEQ_FILTER_NO_CONVERT;
snd_seq_kernel_client_put(client);
/* create ports */ /* create ports */
for (i = 0; i < ports; i++) { for (i = 0; i < ports; i++) {
rec1 = create_port(i, 0); rec1 = create_port(i, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment