From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adam Goode Subject: [PATCH - seq 1/1] ALSA seq: expose the card number of ALSA seq clients Date: Thu, 4 Jun 2015 21:04:50 -0400 Message-ID: <1433466290-31244-1-git-send-email-agoode@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail-yh0-f53.google.com (mail-yh0-f53.google.com [209.85.213.53]) by alsa0.perex.cz (Postfix) with ESMTP id B071E26669E for ; Fri, 5 Jun 2015 03:05:05 +0200 (CEST) Received: by yhpn97 with SMTP id n97so15073233yhp.0 for ; Thu, 04 Jun 2015 18:05:04 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: patch@alsa-project.org Cc: Adam Goode , alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org 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 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 /** 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(®ister_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(®ister_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(®ister_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