diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-07-29 15:56:39 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-07-29 15:56:39 +0200 |
commit | 78dbc57b9918a5c0a29eb70f36af6d21b9471e9d (patch) | |
tree | 20c409fe2fa32e8e77c6923c354e4a3cdac52e91 | |
parent | e31aaac5308216f89039cdfa016fe396f49e8fe7 (diff) | |
parent | acb423d937111d682706169bcdcb58c70fdfa84d (diff) | |
download | alsa-lib-78dbc57b9918a5c0a29eb70f36af6d21b9471e9d.tar.gz |
Merge branch 'fallback'
-rw-r--r-- | include/control.h | 1 | ||||
-rw-r--r-- | include/pcm.h | 3 | ||||
-rw-r--r-- | src/conf/alsa.conf | 4 | ||||
-rw-r--r-- | src/control/control.c | 22 | ||||
-rw-r--r-- | src/pcm/pcm.c | 24 |
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) |