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

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.de


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e9e02819
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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_MULTICAST	(1U<<1)	/* accept multicast messages */
#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 */

struct snd_seq_client_info {
+10 −8
Original line number Diff line number Diff line
@@ -671,6 +671,7 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client,
					  dest_port->time_real);

#if IS_ENABLED(CONFIG_SND_SEQ_UMP)
	if (!(dest->filter & SNDRV_SEQ_FILTER_NO_CONVERT)) {
		if (snd_seq_ev_is_ump(event)) {
			result = snd_seq_deliver_from_ump(client, dest, dest_port,
							  event, atomic, hop);
@@ -680,6 +681,7 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client,
							event, atomic, hop);
			goto __skip;
		}
	}
#endif /* CONFIG_SND_SEQ_UMP */

	result = __snd_seq_deliver_single_event(dest, dest_port, event,
+8 −0
Original line number Diff line number Diff line
@@ -152,6 +152,7 @@ static int __init
register_client(void)
{
	struct snd_seq_dummy_port *rec1, *rec2;
	struct snd_seq_client *client;
	int i;

	if (ports < 1) {
@@ -165,6 +166,13 @@ register_client(void)
	if (my_client < 0)
		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 */
	for (i = 0; i < ports; i++) {
		rec1 = create_port(i, 0);