summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2011-07-29 15:56:39 +0200
committerTakashi Iwai <tiwai@suse.de>2011-07-29 15:56:39 +0200
commit78dbc57b9918a5c0a29eb70f36af6d21b9471e9d (patch)
tree20c409fe2fa32e8e77c6923c354e4a3cdac52e91
parente31aaac5308216f89039cdfa016fe396f49e8fe7 (diff)
parentacb423d937111d682706169bcdcb58c70fdfa84d (diff)
downloadalsa-lib-78dbc57b9918a5c0a29eb70f36af6d21b9471e9d.tar.gz
Merge branch 'fallback'
-rw-r--r--include/control.h1
-rw-r--r--include/pcm.h3
-rw-r--r--src/conf/alsa.conf4
-rw-r--r--src/control/control.c22
-rw-r--r--src/pcm/pcm.c24
5 files changed, 53 insertions, 1 deletions
diff --git a/include/control.h b/include/control.h
index e8f38bb4..f265e349 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 7243ffb3..be355a91 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/conf/alsa.conf b/src/conf/alsa.conf
index 1889f01e..a33c24e7 100644
--- a/src/conf/alsa.conf
+++ b/src/conf/alsa.conf
@@ -119,6 +119,7 @@ defaults.timer.subdevice 0
pcm.cards cards.pcm
pcm.default cards.pcm.default
+pcm.sysdefault cards.pcm.default
pcm.front cards.pcm.front
pcm.rear cards.pcm.rear
pcm.center_lfe cards.pcm.center_lfe
@@ -321,7 +322,7 @@ pcm.null {
# Control interface
#
-ctl.default {
+ctl.sysdefault {
type hw
card {
@func getenv
@@ -335,6 +336,7 @@ ctl.default {
}
}
}
+ctl.default ctl.sysdefault
ctl.hw {
@args [ CARD ]
diff --git a/src/control/control.c b/src/control/control.c
index 19e93897..cd17c6f4 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 02dea0d0..12f8cd0d 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)