ALSA: seq: Add port inactive flag
authorTakashi Iwai <tiwai@suse.de>
Tue, 23 May 2023 07:53:47 +0000 (09:53 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 23 May 2023 10:11:23 +0000 (12:11 +0200)
This extends the ALSA sequencer port capability bit to indicate the
"inactive" flag.  When this flag is set, the port is essentially
invisible, and doesn't appear in the port query ioctls, while the
direct access and the connection to this port are still allowed.  The
active/inactive state can be flipped dynamically, so that it can be
visible at any time later.

This feature is introduced basically for UMP; some UMP Groups in a UMP
Block may be unassigned, hence those are practically invisible.  On
ALSA sequencer, the corresponding sequencer ports will get this new
"inactive" flag to indicate the invisible state.

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230523075358.9672-27-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/uapi/sound/asequencer.h
sound/core/seq/seq_clientmgr.c
sound/core/seq/seq_ports.c

index b87950cbfb7951a70388c987a2fa1f8da66fae44..c6ca6609790b93652d1051665a300ede69402af0 100644 (file)
@@ -427,6 +427,7 @@ struct snd_seq_remove_events {
 #define SNDRV_SEQ_PORT_CAP_SUBS_READ   (1<<5)  /* allow read subscription */
 #define SNDRV_SEQ_PORT_CAP_SUBS_WRITE  (1<<6)  /* allow write subscription */
 #define SNDRV_SEQ_PORT_CAP_NO_EXPORT   (1<<7)  /* routing not allowed */
+#define SNDRV_SEQ_PORT_CAP_INACTIVE    (1<<8)  /* inactive port */
 
        /* port type */
 #define SNDRV_SEQ_PORT_TYPE_SPECIFIC   (1<<0)  /* hardware specific */
index 801d5eee21eb550c3099add845c9c2beb93df86e..6508ce63f76195c3707464d32a2f35aeaa09fe82 100644 (file)
@@ -2416,6 +2416,8 @@ static void snd_seq_info_dump_ports(struct snd_info_buffer *buffer,
 
        mutex_lock(&client->ports_mutex);
        list_for_each_entry(p, &client->ports_list_head, list) {
+               if (p->capability & SNDRV_SEQ_PORT_CAP_INACTIVE)
+                       continue;
                snd_iprintf(buffer, "  Port %3d : \"%s\" (%c%c%c%c)\n",
                            p->addr.port, p->name,
                            FLAG_PERM_RD(p->capability),
index 500b1a5a9679b34158967089651bbb4e8e3479fe..42f4172d47667f6483a46938938de1d26362ff5f 100644 (file)
@@ -69,11 +69,15 @@ struct snd_seq_client_port *snd_seq_port_query_nearest(struct snd_seq_client *cl
 {
        int num;
        struct snd_seq_client_port *port, *found;
+       bool check_inactive = (pinfo->capability & SNDRV_SEQ_PORT_CAP_INACTIVE);
 
        num = pinfo->addr.port;
        found = NULL;
        read_lock(&client->ports_lock);
        list_for_each_entry(port, &client->ports_list_head, list) {
+               if ((port->capability & SNDRV_SEQ_PORT_CAP_INACTIVE) &&
+                   !check_inactive)
+                       continue; /* skip inactive ports */
                if (port->addr.port < num)
                        continue;
                if (port->addr.port == num) {