diff mbox

Provide sequencer sound card number / PID via alsa-lib

Message ID 1455303441-13962-1-git-send-email-martin@mail.zuhause (mailing list archive)
State New, archived
Headers show

Commit Message

Martin Koegler Feb. 12, 2016, 6:57 p.m. UTC
From: Martin Koegler <martin.koegler@chello.at>

Signed-off-by: Martin Koegler <martin.koegler@chello.at>
---
 include/seq.h              |  1 +
 include/sound/asequencer.h |  5 +++--
 src/seq/seq.c              | 11 +++++++++++
 src/seq/seq_hw.c           |  8 +++++++-
 4 files changed, 22 insertions(+), 3 deletions(-)

Comments

Takashi Sakamoto Feb. 13, 2016, 12:36 p.m. UTC | #1
Hi,

On Feb 13 2016 03:57, Martin Koegler wrote:
> From: Martin Koegler <martin.koegler@chello.at>
> 
> Signed-off-by: Martin Koegler <martin.koegler@chello.at>

This is related to your below patch.
http://mailman.alsa-project.org/pipermail/alsa-devel/2016-February/104229.html

Would you please re-post this patch with your comments again so that the
other developers can get to know your intension?

> ---
>  include/seq.h              |  1 +
>  include/sound/asequencer.h |  5 +++--
>  src/seq/seq.c              | 11 +++++++++++
>  src/seq/seq_hw.c           |  8 +++++++-
>  4 files changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/include/seq.h b/include/seq.h
> index 9576822..77996e5 100644
> --- a/include/seq.h
> +++ b/include/seq.h
> @@ -143,6 +143,7 @@ snd_seq_client_type_t snd_seq_client_info_get_type(const snd_seq_client_info_t *
>  const char *snd_seq_client_info_get_name(snd_seq_client_info_t *info);
>  int snd_seq_client_info_get_broadcast_filter(const snd_seq_client_info_t *info);
>  int snd_seq_client_info_get_error_bounce(const snd_seq_client_info_t *info);
> +int snd_seq_client_info_get_owner(const snd_seq_client_info_t *info);
>  const unsigned char *snd_seq_client_info_get_event_filter(const snd_seq_client_info_t *info);
>  int snd_seq_client_info_get_num_ports(const snd_seq_client_info_t *info);
>  int snd_seq_client_info_get_event_lost(const snd_seq_client_info_t *info);
> diff --git a/include/sound/asequencer.h b/include/sound/asequencer.h
> index 09c8a00..7ebf7fd 100644
> --- a/include/sound/asequencer.h
> +++ b/include/sound/asequencer.h
> @@ -24,7 +24,7 @@
>  
>  
>  /** 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
> @@ -356,7 +356,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 owner;			/* RO: card number[kernel] / PID[user] */
> +	char reserved[64 - sizeof(int)]; /* for future use */
>  };
>  
>  
> diff --git a/src/seq/seq.c b/src/seq/seq.c
> index 620ca3f..2505293 100644
> --- a/src/seq/seq.c
> +++ b/src/seq/seq.c
> @@ -1522,6 +1522,17 @@ int snd_seq_client_info_get_error_bounce(const snd_seq_client_info_t *info)
>  }
>  
>  /**
> + * \brief Get the sound card number (kernel) or owning PID
> + * \param info client_info container
> + * \return card number/PID/-1 if value is not available.
> + */
> +int snd_seq_client_info_get_owner(const snd_seq_client_info_t *info)
> +{
> +	assert(info);
> +	return info->owner;
> +}
> +
> +/**
>   * \brief (DEPRECATED) Get the event filter bitmap of a client_info container
>   * \param info client_info container
>   * \return NULL if no event filter, or pointer to event filter bitmap
> diff --git a/src/seq/seq_hw.c b/src/seq/seq_hw.c
> index d033367..a4c083a 100644
> --- a/src/seq/seq_hw.c
> +++ b/src/seq/seq_hw.c
> @@ -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 micro_version;
>  } snd_seq_hw_t;
>  #endif /* DOC_HIDDEN */
>  
> @@ -100,6 +101,8 @@ 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->micro_version < SNDRV_PROTOCOL_MICRO(SNDRV_SEQ_VERSION_MAX))
> +		info->owner = -1;
>  	return 0;
>  }
>  
> @@ -368,6 +371,8 @@ 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->micro_version < SNDRV_PROTOCOL_MICRO(SNDRV_SEQ_VERSION_MAX))
> +		info->owner = -1;
>  	return 0;
>  }
>  
> @@ -480,6 +485,7 @@ int snd_seq_hw_open(snd_seq_t **handle, const char *name, int streams, int mode)
>  		return -ENOMEM;
>  	}
>  	hw->fd = fd;
> +	hw->micro_version = SNDRV_PROTOCOL_MICRO(ver);
>  	if (streams & SND_SEQ_OPEN_OUTPUT) {
>  		seq->obuf = (char *) malloc(seq->obufsize = SND_SEQ_OBUF_SIZE);
>  		if (!seq->obuf) {
>
Martin Koegler Feb. 13, 2016, 12:45 p.m. UTC | #2
On Sat, Feb 13, 2016 at 09:36:46PM +0900, Takashi Sakamoto wrote:
> On Feb 13 2016 03:57, Martin Koegler wrote:
> > From: Martin Koegler <martin.koegler@chello.at>
> > 
> > Signed-off-by: Martin Koegler <martin.koegler@chello.at>
> 
> This is related to your below patch.
> http://mailman.alsa-project.org/pipermail/alsa-devel/2016-February/104229.html
> 
> Would you please re-post this patch with your comments again so that the
> other developers can get to know your intension?

I will repost.

There is a 3rd related kernel patch:
https://patchwork.kernel.org/bundle/e9925248/provide%20sequencer%20sound%20card/

Regards,
Martin
diff mbox

Patch

diff --git a/include/seq.h b/include/seq.h
index 9576822..77996e5 100644
--- a/include/seq.h
+++ b/include/seq.h
@@ -143,6 +143,7 @@  snd_seq_client_type_t snd_seq_client_info_get_type(const snd_seq_client_info_t *
 const char *snd_seq_client_info_get_name(snd_seq_client_info_t *info);
 int snd_seq_client_info_get_broadcast_filter(const snd_seq_client_info_t *info);
 int snd_seq_client_info_get_error_bounce(const snd_seq_client_info_t *info);
+int snd_seq_client_info_get_owner(const snd_seq_client_info_t *info);
 const unsigned char *snd_seq_client_info_get_event_filter(const snd_seq_client_info_t *info);
 int snd_seq_client_info_get_num_ports(const snd_seq_client_info_t *info);
 int snd_seq_client_info_get_event_lost(const snd_seq_client_info_t *info);
diff --git a/include/sound/asequencer.h b/include/sound/asequencer.h
index 09c8a00..7ebf7fd 100644
--- a/include/sound/asequencer.h
+++ b/include/sound/asequencer.h
@@ -24,7 +24,7 @@ 
 
 
 /** 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
@@ -356,7 +356,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 owner;			/* RO: card number[kernel] / PID[user] */
+	char reserved[64 - sizeof(int)]; /* for future use */
 };
 
 
diff --git a/src/seq/seq.c b/src/seq/seq.c
index 620ca3f..2505293 100644
--- a/src/seq/seq.c
+++ b/src/seq/seq.c
@@ -1522,6 +1522,17 @@  int snd_seq_client_info_get_error_bounce(const snd_seq_client_info_t *info)
 }
 
 /**
+ * \brief Get the sound card number (kernel) or owning PID
+ * \param info client_info container
+ * \return card number/PID/-1 if value is not available.
+ */
+int snd_seq_client_info_get_owner(const snd_seq_client_info_t *info)
+{
+	assert(info);
+	return info->owner;
+}
+
+/**
  * \brief (DEPRECATED) Get the event filter bitmap of a client_info container
  * \param info client_info container
  * \return NULL if no event filter, or pointer to event filter bitmap
diff --git a/src/seq/seq_hw.c b/src/seq/seq_hw.c
index d033367..a4c083a 100644
--- a/src/seq/seq_hw.c
+++ b/src/seq/seq_hw.c
@@ -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 micro_version;
 } snd_seq_hw_t;
 #endif /* DOC_HIDDEN */
 
@@ -100,6 +101,8 @@  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->micro_version < SNDRV_PROTOCOL_MICRO(SNDRV_SEQ_VERSION_MAX))
+		info->owner = -1;
 	return 0;
 }
 
@@ -368,6 +371,8 @@  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->micro_version < SNDRV_PROTOCOL_MICRO(SNDRV_SEQ_VERSION_MAX))
+		info->owner = -1;
 	return 0;
 }
 
@@ -480,6 +485,7 @@  int snd_seq_hw_open(snd_seq_t **handle, const char *name, int streams, int mode)
 		return -ENOMEM;
 	}
 	hw->fd = fd;
+	hw->micro_version = SNDRV_PROTOCOL_MICRO(ver);
 	if (streams & SND_SEQ_OPEN_OUTPUT) {
 		seq->obuf = (char *) malloc(seq->obufsize = SND_SEQ_OBUF_SIZE);
 		if (!seq->obuf) {