OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=87
117 lines
4.2 KiB
Diff
117 lines
4.2 KiB
Diff
From acb423d937111d682706169bcdcb58c70fdfa84d Mon Sep 17 00:00:00 2001
|
|
From: Takashi Iwai <tiwai@suse.de>
|
|
Date: Tue, 26 Jul 2011 13:10:24 +0200
|
|
Subject: [PATCH 2/2] Add snd_{ctl|pcm}_open_fallback() functions
|
|
|
|
This patch adds new API functions, snd_ctl_open_fallback() and
|
|
snd_pcm_open_fallback(). These are just like snd_*_open_lconf() but
|
|
used to open a fallback PCM/control. The difference is that it replaces
|
|
the name string with the given original name, so that hctl and other
|
|
upper-layers will recognize it as an alias.
|
|
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
include/control.h | 1 +
|
|
include/pcm.h | 3 +++
|
|
src/control/control.c | 22 ++++++++++++++++++++++
|
|
src/pcm/pcm.c | 24 ++++++++++++++++++++++++
|
|
4 files changed, 50 insertions(+), 0 deletions(-)
|
|
|
|
diff --git a/include/control.h b/include/control.h
|
|
index e8f38bb..f265e34 100644
|
|
--- a/include/control.h
|
|
+++ b/include/control.h
|
|
@@ -224,6 +224,7 @@ char *snd_device_name_get_hint(const void *hint, const char *id);
|
|
|
|
int snd_ctl_open(snd_ctl_t **ctl, const char *name, int mode);
|
|
int snd_ctl_open_lconf(snd_ctl_t **ctl, const char *name, int mode, snd_config_t *lconf);
|
|
+int snd_ctl_open_fallback(snd_ctl_t **ctl, snd_config_t *root, const char *name, const char *orig_name, int mode);
|
|
int snd_ctl_close(snd_ctl_t *ctl);
|
|
int snd_ctl_nonblock(snd_ctl_t *ctl, int nonblock);
|
|
int snd_async_add_ctl_handler(snd_async_handler_t **handler, snd_ctl_t *ctl,
|
|
diff --git a/include/pcm.h b/include/pcm.h
|
|
index 7243ffb..be355a9 100644
|
|
--- a/include/pcm.h
|
|
+++ b/include/pcm.h
|
|
@@ -410,6 +410,9 @@ int snd_pcm_open(snd_pcm_t **pcm, const char *name,
|
|
int snd_pcm_open_lconf(snd_pcm_t **pcm, const char *name,
|
|
snd_pcm_stream_t stream, int mode,
|
|
snd_config_t *lconf);
|
|
+int snd_pcm_open_fallback(snd_pcm_t **pcm, snd_config_t *root,
|
|
+ const char *name, const char *orig_name,
|
|
+ snd_pcm_stream_t stream, int mode);
|
|
|
|
int snd_pcm_close(snd_pcm_t *pcm);
|
|
const char *snd_pcm_name(snd_pcm_t *pcm);
|
|
diff --git a/src/control/control.c b/src/control/control.c
|
|
index 19e9389..cd17c6f 100644
|
|
--- a/src/control/control.c
|
|
+++ b/src/control/control.c
|
|
@@ -919,6 +919,28 @@ int snd_ctl_open_lconf(snd_ctl_t **ctlp, const char *name,
|
|
return snd_ctl_open_noupdate(ctlp, lconf, name, mode);
|
|
}
|
|
|
|
+/**
|
|
+ * \brief Opens a fallback CTL
|
|
+ * \param ctlp Returned CTL handle
|
|
+ * \param root Configuration root
|
|
+ * \param name ASCII identifier of the CTL handle used as fallback
|
|
+ * \param orig_name The original ASCII name
|
|
+ * \param mode Open mode (see #SND_CTL_NONBLOCK, #SND_CTL_ASYNC)
|
|
+ * \return 0 on success otherwise a negative error code
|
|
+ */
|
|
+int snd_ctl_open_fallback(snd_ctl_t **ctlp, snd_config_t *root,
|
|
+ const char *name, const char *orig_name, int mode)
|
|
+{
|
|
+ int err;
|
|
+ assert(ctlp && name && root);
|
|
+ err = snd_ctl_open_noupdate(ctlp, root, name, mode);
|
|
+ if (err >= 0) {
|
|
+ free((*ctlp)->name);
|
|
+ (*ctlp)->name = orig_name ? strdup(orig_name) : NULL;
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+
|
|
#ifndef DOC_HIDDEN
|
|
#define TYPE(v) [SND_CTL_ELEM_TYPE_##v] = #v
|
|
#define IFACE(v) [SND_CTL_ELEM_IFACE_##v] = #v
|
|
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
|
|
index 02dea0d..12f8cd0 100644
|
|
--- a/src/pcm/pcm.c
|
|
+++ b/src/pcm/pcm.c
|
|
@@ -2259,6 +2259,30 @@ int snd_pcm_open_lconf(snd_pcm_t **pcmp, const char *name,
|
|
return snd_pcm_open_noupdate(pcmp, lconf, name, stream, mode, 0);
|
|
}
|
|
|
|
+/**
|
|
+ * \brief Opens a fallback PCM
|
|
+ * \param pcmp Returned PCM handle
|
|
+ * \param root Configuration root
|
|
+ * \param name ASCII identifier of the PCM handle
|
|
+ * \param orig_name The original ASCII name
|
|
+ * \param stream Wanted stream
|
|
+ * \param mode Open mode (see #SND_PCM_NONBLOCK, #SND_PCM_ASYNC)
|
|
+ * \return 0 on success otherwise a negative error code
|
|
+ */
|
|
+int snd_pcm_open_fallback(snd_pcm_t **pcmp, snd_config_t *root,
|
|
+ const char *name, const char *orig_name,
|
|
+ snd_pcm_stream_t stream, int mode)
|
|
+{
|
|
+ int err;
|
|
+ assert(pcmp && name && root);
|
|
+ err = snd_pcm_open_noupdate(pcmp, root, name, stream, mode, 0);
|
|
+ if (err >= 0) {
|
|
+ free((*pcmp)->name);
|
|
+ (*pcmp)->name = orig_name ? strdup(orig_name) : NULL;
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+
|
|
#ifndef DOC_HIDDEN
|
|
int snd_pcm_new(snd_pcm_t **pcmp, snd_pcm_type_t type, const char *name,
|
|
snd_pcm_stream_t stream, int mode)
|
|
--
|
|
1.7.6
|
|
|