Message ID | 1456943188-29600-3-git-send-email-martin@mail.zuhause (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, 02 Mar 2016 19:26:28 +0100, Martin Koegler wrote: > > From: Martin Koegler <martin.koegler@chello.at> > > rawmidi devices expose the card number via IOCTLs, which allows to > find the corresponding device in sysfs. > > The sequencer provides no identifing data. Chromium works around this > issue by scanning rawmidi as well as sequencer devices and matching > them by using assumtions, how the kernel register sequencer devices. > > This changes adds support for exposing the card number for kernel clients > as well as the PID for user client. > > The minor of the API version is changed to distinguish between the zero > initialised reserved field and card number 0. > > Signed-off-by: Martin Koegler <martin.koegler@chello.at> This ABI change itself looks simple enough, so I have no big problem to merge if you can convince other people with it :) Clemens? Takashi > --- > include/uapi/sound/asequencer.h | 6 ++++-- > sound/core/seq/seq_clientmgr.c | 14 ++++++++++++++ > sound/core/seq/seq_clientmgr.h | 2 ++ > 3 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/include/uapi/sound/asequencer.h b/include/uapi/sound/asequencer.h > index 5a5fa49..8c7da5a 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,9 @@ 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; /* RO: card number[kernel] */ > + int pid; /* RO: pid[user] */ > + char reserved[56]; /* for future use */ > }; > > > diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c > index 58e79e0..d6d9419 100644 > --- a/sound/core/seq/seq_clientmgr.c > +++ b/sound/core/seq/seq_clientmgr.c > @@ -364,6 +364,7 @@ static int snd_seq_open(struct inode *inode, struct file *file) > /* fill client data */ > user->file = file; > sprintf(client->name, "Client-%d", c); > + client->data.user.owner = get_pid(task_pid(current)); > > /* make others aware this new client */ > snd_seq_system_client_ev_client_start(c); > @@ -380,6 +381,7 @@ static int snd_seq_release(struct inode *inode, struct file *file) > seq_free_client(client); > if (client->data.user.fifo) > snd_seq_fifo_delete(&client->data.user.fifo); > + put_pid(client->data.user.owner); > kfree(client); > } > > @@ -1197,6 +1199,17 @@ 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; > + > + if (cptr->type == USER_CLIENT) > + info->pid = pid_vnr(cptr->data.user.owner); > + else > + info->pid = -1; > + > + if (cptr->type == KERNEL_CLIENT) > + info->card = cptr->data.kernel.card ? cptr->data.kernel.card->number : -1; > + else > + info->card = -1; > + > memset(info->reserved, 0, sizeof(info->reserved)); > } > > @@ -2271,6 +2284,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, > > client->accept_input = 1; > client->accept_output = 1; > + client->data.kernel.card = card; > > va_start(args, name_fmt); > vsnprintf(client->name, sizeof(client->name), name_fmt, args); > diff --git a/sound/core/seq/seq_clientmgr.h b/sound/core/seq/seq_clientmgr.h > index 20f0a72..031462e 100644 > --- a/sound/core/seq/seq_clientmgr.h > +++ b/sound/core/seq/seq_clientmgr.h > @@ -33,6 +33,7 @@ > struct snd_seq_user_client { > struct file *file; /* file struct of client */ > /* ... */ > + struct pid* owner; > > /* fifo */ > struct snd_seq_fifo *fifo; /* queue for incoming events */ > @@ -41,6 +42,7 @@ struct snd_seq_user_client { > > struct snd_seq_kernel_client { > /* ... */ > + struct snd_card* card; > }; > > > -- > 2.1.4 > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >
On Thu, Mar 03, 2016 at 10:43:32AM +0100, Takashi Iwai wrote: > > From: Martin Koegler <martin.koegler@chello.at> > > > > rawmidi devices expose the card number via IOCTLs, which allows to > > find the corresponding device in sysfs. > > > > The sequencer provides no identifing data. Chromium works around this > > issue by scanning rawmidi as well as sequencer devices and matching > > them by using assumtions, how the kernel register sequencer devices. > > > > This changes adds support for exposing the card number for kernel clients > > as well as the PID for user client. > > > > The minor of the API version is changed to distinguish between the zero > > initialised reserved field and card number 0. > > > > Signed-off-by: Martin Koegler <martin.koegler@chello.at> > > This ABI change itself looks simple enough, so I have no big problem > to merge if you can convince other people with it :) > > Clemens? The current solution has been proposed by him: http://mailman.alsa-project.org/pipermail/alsa-devel/2016-February/104175.html Regards, Martin
Takashi Iwai wrote: > Martin Koegler wrote: >> rawmidi devices expose the card number via IOCTLs, which allows to >> find the corresponding device in sysfs. >> >> The sequencer provides no identifing data. Chromium works around this >> issue by scanning rawmidi as well as sequencer devices and matching >> them by using assumtions, how the kernel register sequencer devices. >> >> This changes adds support for exposing the card number for kernel clients >> as well as the PID for user client. >> >> The minor of the API version is changed to distinguish between the zero >> initialised reserved field and card number 0. >> >> Signed-off-by: Martin Koegler <martin.koegler@chello.at> > > This ABI change itself looks simple enough, so I have no big problem > to merge if you can convince other people with it :) Acked-by: Clemens Ladisch <clemens@ladisch.de> >> --- >> include/uapi/sound/asequencer.h | 6 ++++-- >> sound/core/seq/seq_clientmgr.c | 14 ++++++++++++++ >> sound/core/seq/seq_clientmgr.h | 2 ++ >> 3 files changed, 20 insertions(+), 2 deletions(-) >> >> diff --git a/include/uapi/sound/asequencer.h b/include/uapi/sound/asequencer.h >> index 5a5fa49..8c7da5a 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,9 @@ 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; /* RO: card number[kernel] */ >> + int pid; /* RO: pid[user] */ >> + char reserved[56]; /* for future use */ >> }; >> >> >> diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c >> index 58e79e0..d6d9419 100644 >> --- a/sound/core/seq/seq_clientmgr.c >> +++ b/sound/core/seq/seq_clientmgr.c >> @@ -364,6 +364,7 @@ static int snd_seq_open(struct inode *inode, struct file *file) >> /* fill client data */ >> user->file = file; >> sprintf(client->name, "Client-%d", c); >> + client->data.user.owner = get_pid(task_pid(current)); >> >> /* make others aware this new client */ >> snd_seq_system_client_ev_client_start(c); >> @@ -380,6 +381,7 @@ static int snd_seq_release(struct inode *inode, struct file *file) >> seq_free_client(client); >> if (client->data.user.fifo) >> snd_seq_fifo_delete(&client->data.user.fifo); >> + put_pid(client->data.user.owner); >> kfree(client); >> } >> >> @@ -1197,6 +1199,17 @@ 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; >> + >> + if (cptr->type == USER_CLIENT) >> + info->pid = pid_vnr(cptr->data.user.owner); >> + else >> + info->pid = -1; >> + >> + if (cptr->type == KERNEL_CLIENT) >> + info->card = cptr->data.kernel.card ? cptr->data.kernel.card->number : -1; >> + else >> + info->card = -1; >> + >> memset(info->reserved, 0, sizeof(info->reserved)); >> } >> >> @@ -2271,6 +2284,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, >> >> client->accept_input = 1; >> client->accept_output = 1; >> + client->data.kernel.card = card; >> >> va_start(args, name_fmt); >> vsnprintf(client->name, sizeof(client->name), name_fmt, args); >> diff --git a/sound/core/seq/seq_clientmgr.h b/sound/core/seq/seq_clientmgr.h >> index 20f0a72..031462e 100644 >> --- a/sound/core/seq/seq_clientmgr.h >> +++ b/sound/core/seq/seq_clientmgr.h >> @@ -33,6 +33,7 @@ >> struct snd_seq_user_client { >> struct file *file; /* file struct of client */ >> /* ... */ >> + struct pid* owner; >> >> /* fifo */ >> struct snd_seq_fifo *fifo; /* queue for incoming events */ >> @@ -41,6 +42,7 @@ struct snd_seq_user_client { >> >> struct snd_seq_kernel_client { >> /* ... */ >> + struct snd_card* card; >> }; >> >> >> -- >> 2.1.4 >> >> _______________________________________________ >> Alsa-devel mailing list >> Alsa-devel@alsa-project.org >> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >> > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >
On Tue, 08 Mar 2016 10:00:37 +0100, Clemens Ladisch wrote: > > Takashi Iwai wrote: > > Martin Koegler wrote: > >> rawmidi devices expose the card number via IOCTLs, which allows to > >> find the corresponding device in sysfs. > >> > >> The sequencer provides no identifing data. Chromium works around this > >> issue by scanning rawmidi as well as sequencer devices and matching > >> them by using assumtions, how the kernel register sequencer devices. > >> > >> This changes adds support for exposing the card number for kernel clients > >> as well as the PID for user client. > >> > >> The minor of the API version is changed to distinguish between the zero > >> initialised reserved field and card number 0. > >> > >> Signed-off-by: Martin Koegler <martin.koegler@chello.at> > > > > This ABI change itself looks simple enough, so I have no big problem > > to merge if you can convince other people with it :) > > Acked-by: Clemens Ladisch <clemens@ladisch.de> OK, I merged it now. But the patch had a few minor coding-style issues. I fixed them up. Martin, at the next time, please run scripts/checkpatch.pl before submission. thanks, Takashi
diff --git a/include/uapi/sound/asequencer.h b/include/uapi/sound/asequencer.h index 5a5fa49..8c7da5a 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,9 @@ 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; /* RO: card number[kernel] */ + int pid; /* RO: pid[user] */ + char reserved[56]; /* for future use */ }; diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index 58e79e0..d6d9419 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -364,6 +364,7 @@ static int snd_seq_open(struct inode *inode, struct file *file) /* fill client data */ user->file = file; sprintf(client->name, "Client-%d", c); + client->data.user.owner = get_pid(task_pid(current)); /* make others aware this new client */ snd_seq_system_client_ev_client_start(c); @@ -380,6 +381,7 @@ static int snd_seq_release(struct inode *inode, struct file *file) seq_free_client(client); if (client->data.user.fifo) snd_seq_fifo_delete(&client->data.user.fifo); + put_pid(client->data.user.owner); kfree(client); } @@ -1197,6 +1199,17 @@ 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; + + if (cptr->type == USER_CLIENT) + info->pid = pid_vnr(cptr->data.user.owner); + else + info->pid = -1; + + if (cptr->type == KERNEL_CLIENT) + info->card = cptr->data.kernel.card ? cptr->data.kernel.card->number : -1; + else + info->card = -1; + memset(info->reserved, 0, sizeof(info->reserved)); } @@ -2271,6 +2284,7 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, client->accept_input = 1; client->accept_output = 1; + client->data.kernel.card = card; va_start(args, name_fmt); vsnprintf(client->name, sizeof(client->name), name_fmt, args); diff --git a/sound/core/seq/seq_clientmgr.h b/sound/core/seq/seq_clientmgr.h index 20f0a72..031462e 100644 --- a/sound/core/seq/seq_clientmgr.h +++ b/sound/core/seq/seq_clientmgr.h @@ -33,6 +33,7 @@ struct snd_seq_user_client { struct file *file; /* file struct of client */ /* ... */ + struct pid* owner; /* fifo */ struct snd_seq_fifo *fifo; /* queue for incoming events */ @@ -41,6 +42,7 @@ struct snd_seq_user_client { struct snd_seq_kernel_client { /* ... */ + struct snd_card* card; };