mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-02 09:01:48 -05:00
seq: Provide sequencer sound card number / PID via alsa-lib
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. It supports kernels with and without the required support. Signed-off-by: Martin Koegler <martin.koegler@chello.at> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
3adfa1b3eb
commit
e0e3ce5f71
4 changed files with 43 additions and 3 deletions
|
|
@ -1521,6 +1521,32 @@ int snd_seq_client_info_get_error_bounce(const snd_seq_client_info_t *info)
|
|||
return (info->filter & SNDRV_SEQ_FILTER_BOUNCE) ? 1 : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the sound card number.
|
||||
* \param info client_info container
|
||||
* \return card number or -1 if value is not available.
|
||||
*
|
||||
* Only available for SND_SEQ_KERNEL_CLIENT clients.
|
||||
*/
|
||||
int snd_seq_client_info_get_card(const snd_seq_client_info_t *info)
|
||||
{
|
||||
assert(info);
|
||||
return info->card;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the owning PID.
|
||||
* \param info client_info container
|
||||
* \return pid or -1 if value is not available.
|
||||
*
|
||||
* Only available for SND_SEQ_USER_CLIENT clients.
|
||||
*/
|
||||
int snd_seq_client_info_get_pid(const snd_seq_client_info_t *info)
|
||||
{
|
||||
assert(info);
|
||||
return info->pid;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief (DEPRECATED) Get the event filter bitmap of a client_info container
|
||||
* \param info client_info container
|
||||
|
|
|
|||
|
|
@ -32,10 +32,11 @@ const char *_snd_module_seq_hw = "";
|
|||
#ifndef DOC_HIDDEN
|
||||
#define SNDRV_FILE_SEQ ALSA_DEVICE_DIRECTORY "seq"
|
||||
#define SNDRV_FILE_ALOADSEQ ALOAD_DEVICE_DIRECTORY "aloadSEQ"
|
||||
#define SNDRV_SEQ_VERSION_MAX SNDRV_PROTOCOL_VERSION(1, 0, 1)
|
||||
#define SNDRV_SEQ_VERSION_MAX SNDRV_PROTOCOL_VERSION(1, 0, 2)
|
||||
|
||||
typedef struct {
|
||||
int fd;
|
||||
int version;
|
||||
} snd_seq_hw_t;
|
||||
#endif /* DOC_HIDDEN */
|
||||
|
||||
|
|
@ -100,6 +101,10 @@ static int snd_seq_hw_get_client_info(snd_seq_t *seq, snd_seq_client_info_t * in
|
|||
/*SYSERR("SNDRV_SEQ_IOCTL_GET_CLIENT_INFO failed");*/
|
||||
return -errno;
|
||||
}
|
||||
if (hw->version < SNDRV_PROTOCOL_VERSION(1, 0, 2)) {
|
||||
info->card = -1;
|
||||
info->pid = -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -368,6 +373,10 @@ static int snd_seq_hw_query_next_client(snd_seq_t *seq, snd_seq_client_info_t *i
|
|||
/*SYSERR("SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT failed");*/
|
||||
return -errno;
|
||||
}
|
||||
if (hw->version < SNDRV_PROTOCOL_VERSION(1, 0, 2)) {
|
||||
info->card = -1;
|
||||
info->pid = -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -480,6 +489,7 @@ int snd_seq_hw_open(snd_seq_t **handle, const char *name, int streams, int mode)
|
|||
return -ENOMEM;
|
||||
}
|
||||
hw->fd = fd;
|
||||
hw->version = ver;
|
||||
if (streams & SND_SEQ_OPEN_OUTPUT) {
|
||||
seq->obuf = (char *) malloc(seq->obufsize = SND_SEQ_OBUF_SIZE);
|
||||
if (!seq->obuf) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue