Re: kernel snd seq bugs: SND_SEQ_EVENT_CLIENT_CHANGE & SND_SEQ_EVENT_PORT_CHANGE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 24 Nov 2024 22:31:13 +0100,
Mark Lentczner wrote:
> 
> I'm the author of amidiminder - a utility that keeps track of desired
> connections between ALSA Seq (MIDI) ports.
> 
> I've found a bug in the kernel part of the ALSA Sequencer, and am not sure
> where or how to report it.
> 
> Summary:
> The events:
> * SND_SEQ_EVENT_CLIENT_CHANGE is never sent
> * SND_SEQ_EVENT_PORT_CHANGE is not sent on common port changes (name and
> port info)
> 
> I have a lot of detail on these bugs, what other software causes them to be
> a problem (PureData), and where the missing code in the kernel
> sound/core/seq files is.
> 
> Before I dump all the details in this forum.... where is the right place
> for me to report and/or discuss this?

Those events aren't created indeed.  I don't remember exactly, as the
implementation was really old (decades ago), but I guess it was
because it'd give too much broadcasting when the event is triggered at
each client / port change.

Actually it's trivial to enable those events.  It's just a patch like
below.  But, I have to consider the result by this change and try to
avoid the unnecessary event bombing before going ahead.


thanks,

Takashi

-- 8< --
--- a/sound/core/seq/seq_clientmgr.c
+++ b/sound/core/seq/seq_clientmgr.c
@@ -1290,6 +1290,10 @@ static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client,
 		client->midi_version = client_info->midi_version;
 	memcpy(client->event_filter, client_info->event_filter, 32);
 	client->group_filter = client_info->group_filter;
+
+	/* notify the change */
+	snd_seq_system_client_ev_client_change(client->number);
+
 	return 0;
 }
 
@@ -1413,6 +1417,9 @@ static int snd_seq_ioctl_set_port_info(struct snd_seq_client *client, void *arg)
 	if (port) {
 		snd_seq_set_port_info(port, info);
 		snd_seq_port_unlock(port);
+		/* notify the change */
+		snd_seq_system_client_ev_port_change(info->addr.client,
+						     info->addr.port);
 	}
 	return 0;
 }



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux