[alsa-devel] [PATCH - seq 1/1] ALSA seq: expose the card number of ALSA seq clients

Adam Goode agoode at google.com
Fri Jun 5 03:04:50 CEST 2015


Expose the card number of seq clients. This allows interested userspace
programs to discover the hardware device that backs a particular seq
client. Before this change, the only way to get information about the
hardware for a client was by using brittle heuristics.

Signed-off-by: Adam Goode <agoode at google.com>

diff --git a/include/uapi/sound/asequencer.h b/include/uapi/sound/asequencer.h
index 5a5fa49..c2a659be 100644
--- a/include/uapi/sound/asequencer.h
+++ b/include/uapi/sound/asequencer.h
@@ -25,7 +25,7 @@
 #include <sound/asound.h>
 
 /** version of the sequencer */
-#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION (1, 0, 1)
+#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION (1, 0, 2)
 
 /**
  * definition of sequencer event types
@@ -357,7 +357,8 @@ struct snd_seq_client_info {
 	unsigned char event_filter[32];	/* event filter bitmap */
 	int num_ports;			/* RO: number of ports */
 	int event_lost;			/* number of lost events */
-	char reserved[64];		/* for future use */
+	int card_number;		/* RO: card number, or -1 if no card. Added in protocol version 1.0.2 */
+	char reserved[60];		/* for future use */
 };
 
 
diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
index edbdab8..fcae784 100644
--- a/sound/core/seq/seq_clientmgr.c
+++ b/sound/core/seq/seq_clientmgr.c
@@ -216,7 +216,7 @@ int __init client_init_data(void)
 }
 
 
-static struct snd_seq_client *seq_create_client1(int client_index, int poolsize)
+static struct snd_seq_client *seq_create_client1(int client_index, int poolsize, int card_number)
 {
 	unsigned long flags;
 	int c;
@@ -232,6 +232,7 @@ static struct snd_seq_client *seq_create_client1(int client_index, int poolsize)
 		return NULL;
 	}
 	client->type = NO_CLIENT;
+	client->card_number = card_number;
 	snd_use_lock_init(&client->use_lock);
 	rwlock_init(&client->ports_lock);
 	mutex_init(&client->ports_mutex);
@@ -327,7 +328,7 @@ static int snd_seq_open(struct inode *inode, struct file *file)
 
 	if (mutex_lock_interruptible(&register_mutex))
 		return -ERESTARTSYS;
-	client = seq_create_client1(-1, SNDRV_SEQ_DEFAULT_EVENTS);
+	client = seq_create_client1(-1, SNDRV_SEQ_DEFAULT_EVENTS, -1);
 	if (client == NULL) {
 		mutex_unlock(&register_mutex);
 		return -ENOMEM;	/* failure code */
@@ -1194,6 +1195,7 @@ static void get_client_info(struct snd_seq_client *cptr,
 	info->event_lost = cptr->event_lost;
 	memcpy(info->event_filter, cptr->event_filter, 32);
 	info->num_ports = cptr->num_ports;
+	info->card_number = cptr->card_number;
 	memset(info->reserved, 0, sizeof(info->reserved));
 }
 
@@ -2239,6 +2241,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
 {
 	struct snd_seq_client *client;
 	va_list args;
+	int card_number = -1;
 
 	if (snd_BUG_ON(in_interrupt()))
 		return -EBUSY;
@@ -2252,6 +2255,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
 		return -ERESTARTSYS;
 
 	if (card) {
+		card_number = card->number;
 		client_index += SNDRV_SEQ_GLOBAL_CLIENTS
 			+ card->number * SNDRV_SEQ_CLIENTS_PER_CARD;
 		if (client_index >= SNDRV_SEQ_DYNAMIC_CLIENTS_BEGIN)
@@ -2259,7 +2263,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index,
 	}
 
 	/* empty write queue as default */
-	client = seq_create_client1(client_index, 0);
+	client = seq_create_client1(client_index, 0, card_number);
 	if (client == NULL) {
 		mutex_unlock(&register_mutex);
 		return -EBUSY;	/* failure code */
@@ -2533,9 +2537,13 @@ void snd_seq_info_clients_read(struct snd_info_entry *entry,
 			continue;
 		}
 
-		snd_iprintf(buffer, "Client %3d : \"%s\" [%s]\n",
+		snd_iprintf(buffer, "Client %3d : \"%s\" [%s]",
 			    c, client->name,
 			    client->type == USER_CLIENT ? "User" : "Kernel");
+		if (client->card_number != -1) {
+			snd_iprintf(buffer, ", card %d", client->card_number);
+		}
+		snd_iprintf(buffer, "\n");
 		snd_seq_info_dump_ports(buffer, client);
 		if (snd_seq_write_pool_allocated(client)) {
 			snd_iprintf(buffer, "  Output pool :\n");
diff --git a/sound/core/seq/seq_clientmgr.h b/sound/core/seq/seq_clientmgr.h
index 20f0a72..627be9d 100644
--- a/sound/core/seq/seq_clientmgr.h
+++ b/sound/core/seq/seq_clientmgr.h
@@ -50,6 +50,7 @@ struct snd_seq_client {
 		accept_output: 1;
 	char name[64];		/* client name */
 	int number;		/* client number */
+	int card_number;	/* card number, or -1 if no card */
 	unsigned int filter;	/* filter flags */
 	DECLARE_BITMAP(event_filter, 256);
 	snd_use_lock_t use_lock;
-- 
2.2.0.rc0.207.ga3a616c



More information about the Alsa-devel mailing list