Ask snd_seq_set_client_midi_version
Hi, I'm trying out MIDI 2.0 and found a problem, when using snd_seq_set_client_midi_version
With SND_SEQ_CLIENT_LEGACY_MIDI I get the following sequence of events when connecting a midi device (using the method snd_seq_event_input or snd_seq_ump_event_input) (timidity command:timidity --interface=A --buffer-fragments=2,8 --output-mode=s1l --sampling-freq=44100):
SND_SEQ_EVENT_CLIENT_STARTSND_SEQ_EVENT_PORT_STARTSND_SEQ_EVENT_PORT_STARTSND_SEQ_EVENT_PORT_STARTSND_SEQ_EVENT_PORT_START
But with SND_SEQ_CLIENT_UMP_MIDI_1_0 and SND_SEQ_CLIENT_UMP_MIDI_2_0 I don't get the SND_SEQ_EVENT_PORT_START events, I only get the following:
SND_SEQ_EVENT_CLIENT_STARTSND_SEQ_EVENT_SYSTEMSND_SEQ_EVENT_SYSTEMSND_SEQ_EVENT_SYSTEM
I don't know if I'm asking this in the right place, what mistake am I making? Just by modifying that it stops working.
Quoted 19 lines · Correo Alternativo
Hi, I'm trying out MIDI 2.0 and found a problem, when using
snd_seq_set_client_midi_versionWith SND_SEQ_CLIENT_LEGACY_MIDI I get the following sequence of events when connecting a midi device (using the method
snd_seq_event_inputorsnd_seq_ump_event_input) (timidity command:timidity --interface=A --buffer-fragments=2,8 --output-mode=s1l --sampling-freq=44100):
SND_SEQ_EVENT_CLIENT_STARTSND_SEQ_EVENT_PORT_STARTSND_SEQ_EVENT_PORT_STARTSND_SEQ_EVENT_PORT_STARTSND_SEQ_EVENT_PORT_STARTBut with
SND_SEQ_CLIENT_UMP_MIDI_1_0andSND_SEQ_CLIENT_UMP_MIDI_2_0I don't get theSND_SEQ_EVENT_PORT_STARTevents, I only get the following:
Quoted 7 lines
SND_SEQ_EVENT_CLIENT_STARTSND_SEQ_EVENT_SYSTEMSND_SEQ_EVENT_SYSTEMSND_SEQ_EVENT_SYSTEMI don't know if I'm asking this in the right place, what mistake am I making? Just by modifying that it stops working.
Hmm, there should be no difference in this regard between the legacy and UMP clients.
Do you mean that the destination client (i.e. timidity) doesn't receive *_PORT_START events when you send from a UMP client? Or how is the actual setup and the connection?
thanks,
Takashi
Possible bug with snd_seq_event_input_pending
In reply to Correo AlternativoHi, I don't know if this is a bug or not, but I'll report it in case it is.
If I configure my client as follows:
snd_seq_set_client_midi_version(seq, SND_SEQ_CLIENT_LEGACY_MIDI);
snd_seq_set_client_ump_conversion(seq, 0);//I disable ump conversion
And then I send a midi event from a MIDI 2.0 device, the snd_seq_event_input_pending(seq, 1) function will not respond until it receives any other legacy event.
Now I know that with SND_SEQ_CLIENT_LEGACY_MIDI I shouldn't disable ump conversion, but I expected it to return 0.
Thank you
Re: Possible bug with snd_seq_event_input_pending
Quoted 7 lines · Carlos
Hi, I don't know if this is a bug or not, but I'll report it in case it is.
If I configure my client as follows:
snd_seq_set_client_midi_version(seq, SND_SEQ_CLIENT_LEGACY_MIDI);
Quoted 8 lines
snd_seq_set_client_ump_conversion(seq, 0);//I disable ump conversionAnd then I send a midi event from a MIDI 2.0 device, the
snd_seq_event_input_pending(seq, 1)function will not respond until it receives any other legacy event.Now I know that with SND_SEQ_CLIENT_LEGACY_MIDI I shouldn't disable ump conversion, but I expected it to return 0.
This can be indeed a problem in the kernel side. It shouldn't deliver the UMP events if the destination can't handle it.
Could you try the patch below?
thanks,
Takashi
-- 8< --
From: Takashi Iwai <[email protected]>
Subject: [PATCH] ALSA: seq: Drop UMP events when no UMP-conversion is set
When a destination client is a user client in the legacy MIDI mode and it sets the no-UMP-conversion flag, currently the all UMP events are still passed as-is. But this may confuse the user-space, because the event packet size is different from the legacy mode.
Since we cannot handle UMP events in user clients unless it's running in the UMP client mode, we should filter out those events instead of accepting blindly. This patch addresses it by slightly adjusting the conditions for UMP event handling at the event delivery time.
--- sound/core/seq/seq_clientmgr.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
sound/core/seq/seq_clientmgr.c +9 -3
@@ -678,12 +678,18 @@ 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)) { +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, event, atomic, hop); goto __skip; - }else if (snd_seq_client_is_ump (dest)) { + }else if (dest->type ==USER_CLIENT && + !snd_seq_client_is_ump (dest)) { + result =0 ;// drop the event + goto __skip; + } + }else if (snd_seq_client_is_ump (dest)) { +if (!(dest->filter &SNDRV_SEQ_FILTER_NO_CONVERT )) { result =snd_seq_deliver_to_ump (client, dest, dest_port, event, atomic, hop); goto __skip;
Signature · 1 line
2.43.0