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)