Skip to content

Commit d2b7060

Browse files
committed
ALSA: seq: Add UMP group filter
Add a new filter bitmap for UMP groups for reducing the unnecessary read/write when the client is connected to UMP EP seq port. The new group_filter field contains the bitmap for the groups, i.e. when the bit is set, the corresponding group is filtered out and the messages to that group won't be delivered. The filter bitmap consists of each bit of 1-based UMP Group number. The bit 0 is reserved for the future use. Reviewed-by: Jaroslav Kysela <perex@perex.cz> Link: https://lore.kernel.org/r/20230523075358.9672-37-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent e85b926 commit d2b7060

4 files changed

Lines changed: 18 additions & 1 deletion

File tree

include/uapi/sound/asequencer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,8 @@ struct snd_seq_client_info {
362362
int card; /* RO: card number[kernel] */
363363
int pid; /* RO: pid[user] */
364364
unsigned int midi_version; /* MIDI version */
365-
char reserved[52]; /* for future use */
365+
unsigned int group_filter; /* UMP group filter bitmap (for 1-based Group indices) */
366+
char reserved[48]; /* for future use */
366367
};
367368

368369
/* MIDI version numbers in client info */

sound/core/seq/seq_clientmgr.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,6 +1229,7 @@ static void get_client_info(struct snd_seq_client *cptr,
12291229
info->filter = cptr->filter;
12301230
info->event_lost = cptr->event_lost;
12311231
memcpy(info->event_filter, cptr->event_filter, 32);
1232+
info->group_filter = cptr->group_filter;
12321233
info->num_ports = cptr->num_ports;
12331234

12341235
if (cptr->type == USER_CLIENT)
@@ -1290,6 +1291,7 @@ static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client,
12901291
if (client->user_pversion >= SNDRV_PROTOCOL_VERSION(1, 0, 3))
12911292
client->midi_version = client_info->midi_version;
12921293
memcpy(client->event_filter, client_info->event_filter, 32);
1294+
client->group_filter = client_info->group_filter;
12931295
return 0;
12941296
}
12951297

sound/core/seq/seq_clientmgr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct snd_seq_client {
4040
int number; /* client number */
4141
unsigned int filter; /* filter flags */
4242
DECLARE_BITMAP(event_filter, 256);
43+
unsigned short group_filter;
4344
snd_use_lock_t use_lock;
4445
int event_lost;
4546
/* ports */

sound/core/seq/seq_ump_convert.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,17 @@ static int deliver_with_group_convert(struct snd_seq_client *dest,
527527
atomic, hop);
528528
}
529529

530+
/* apply the UMP event filter; return true to skip the event */
531+
static bool ump_event_filtered(struct snd_seq_client *dest,
532+
const struct snd_seq_ump_event *ev)
533+
{
534+
unsigned char group;
535+
536+
group = ump_message_group(ev->ump[0]);
537+
/* check the bitmap for 1-based group number */
538+
return dest->group_filter & (1U << (group + 1));
539+
}
540+
530541
/* Convert from UMP packet and deliver */
531542
int snd_seq_deliver_from_ump(struct snd_seq_client *source,
532543
struct snd_seq_client *dest,
@@ -539,6 +550,8 @@ int snd_seq_deliver_from_ump(struct snd_seq_client *source,
539550

540551
if (snd_seq_ev_is_variable(event))
541552
return 0; // skip, no variable event for UMP, so far
553+
if (ump_event_filtered(dest, ump_ev))
554+
return 0; // skip if group filter is set and matching
542555
type = ump_message_type(ump_ev->ump[0]);
543556

544557
if (snd_seq_client_is_ump(dest)) {

0 commit comments

Comments
 (0)