Skip to content

Commit

Permalink
ALSA: seq: ump: Handle groupless messages
Browse files Browse the repository at this point in the history
The UMP Utility and Stream messages are "groupless", i.e. an incoming
groupless packet should be sent only to the UMP EP port, and the event
with the groupless message is sent to UMP EP as is without the group
translation per port.

Also, the former reserved bit 0 for the client group filter is now
used for groupless events.  When the bit 0 is set, the groupless
events are filtered out and skipped.

Link: https://lore.kernel.org/r/20230612081054.17200-6-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Iwai committed Jun 12, 2023
1 parent 960a114 commit 5437ac9
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 2 deletions.
3 changes: 3 additions & 0 deletions include/sound/ump.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,4 +255,7 @@ static inline u32 ump_stream_compose(unsigned char status, unsigned short form)
((u32)status << 16);
}

#define ump_is_groupless_msg(type) \
((type) == UMP_MSG_TYPE_UTILITY || (type) == UMP_MSG_TYPE_STREAM)

#endif /* __SOUND_UMP_H */
5 changes: 4 additions & 1 deletion include/uapi/sound/asequencer.h
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,10 @@ struct snd_seq_client_info {
int card; /* RO: card number[kernel] */
int pid; /* RO: pid[user] */
unsigned int midi_version; /* MIDI version */
unsigned int group_filter; /* UMP group filter bitmap (for 1-based Group indices) */
unsigned int group_filter; /* UMP group filter bitmap
* (bit 0 = groupless messages,
* bit 1-16 = messages for groups 1-16)
*/
char reserved[48]; /* for future use */
};

Expand Down
5 changes: 4 additions & 1 deletion sound/core/seq/seq_ump_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,10 @@ static void seq_ump_input_receive(struct snd_ump_endpoint *ump,
if (!client->opened[STR_IN])
return;

ev.source.port = ump_group_to_seq_port(ump_message_group(*val));
if (ump_is_groupless_msg(ump_message_type(*val)))
ev.source.port = 0; /* UMP EP port */
else
ev.source.port = ump_group_to_seq_port(ump_message_group(*val));
ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
ev.flags = SNDRV_SEQ_EVENT_UMP;
memcpy(ev.ump, val, words << 2);
Expand Down
3 changes: 3 additions & 0 deletions sound/core/seq/seq_ump_convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,8 @@ static bool ump_event_filtered(struct snd_seq_client *dest,
unsigned char group;

group = ump_message_group(ev->ump[0]);
if (ump_is_groupless_msg(ump_message_type(ev->ump[0])))
return dest->group_filter & (1U << 0);
/* check the bitmap for 1-based group number */
return dest->group_filter & (1U << (group + 1));
}
Expand Down Expand Up @@ -565,6 +567,7 @@ int snd_seq_deliver_from_ump(struct snd_seq_client *source,
event, atomic, hop);
/* non-EP port and different group is set? */
if (dest_port->ump_group &&
!ump_is_groupless_msg(type) &&
ump_message_group(*ump_ev->ump) + 1 != dest_port->ump_group)
return deliver_with_group_convert(dest, dest_port,
ump_ev, atomic, hop);
Expand Down

0 comments on commit 5437ac9

Please sign in to comment.