[alsa-devel] [PATCH] alsa-lib: snd_device_name_hint misbehaving
Raymond Yau
superquad.vortex2 at gmail.com
Mon Nov 2 07:49:00 CET 2009
Is there any test program for this change since currently only "hw" and
"pulse" can be listed by name hint ?
* Add "ctl" to the list of device types that snd_device_name_hint can
search for.
2009/11/2 John Lindgren <john.lindgren at tds.net>
> * Remove erroneous snd_config_delete calls that cause later calls to
> snd_pcm_open to fail.
>
> * Don't list card-independent PCM devices ("null" or PulseAudio, for
> example) more than once even if multiple sound cards are installed.
>
> * Add "ctl" to the list of device types that snd_device_name_hint can
> search for.
>
> * Cache the path to libasound.so within snd_dlopen rather than looking
> it up with dladdr every call.
>
> For a longer explanation:
>
> http://mailman.alsa-project.org/pipermail/alsa-devel/2009-October/022505.html
>
> Signed-off-by: John Lindgren <john.lindgren at tds.net>
>
> ------
>
> src/conf.c | 2 --
> src/control/namehint.c | 34 +++++++++++++++++++++++++++-------
> src/dlmisc.c | 10 +++++++---
> 3 files changed, 34 insertions(+), 12 deletions(-)
>
> ------
>
> diff --git a/src/conf.c b/src/conf.c
> index 570c90f..52a477c 100644
> --- a/src/conf.c
> +++ b/src/conf.c
> @@ -1132,7 +1132,6 @@ static int parse_def(snd_config_t *parent, input_t
> *input, int skip, int overrid
> free(id);
> continue;
> }
> - snd_config_delete(n);
> }
> if (mode == MERGE) {
> SNDERR("%s does not exists", id);
> @@ -1156,7 +1155,6 @@ static int parse_def(snd_config_t *parent, input_t
> *input, int skip, int overrid
> skip = 1;
> n = NULL;
> } else if (mode == OVERRIDE) {
> - snd_config_delete(n);
> n = NULL;
> }
> } else {
> diff --git a/src/control/namehint.c b/src/control/namehint.c
> index e878f83..ec9d04f 100644
> --- a/src/control/namehint.c
> +++ b/src/control/namehint.c
> @@ -328,7 +328,6 @@ static int try_config(struct hint_list *list,
> if (snd_config_search(cfg1, "slave", &cfg) >= 0 &&
> snd_config_search(cfg, base, &cfg1) >= 0)
> goto __hint;
> - snd_config_delete(res);
> res = NULL;
> if (strchr(buf, ':') != NULL)
> goto __ok;
> @@ -379,8 +378,6 @@ static int try_config(struct hint_list *list,
> err = hint_list_add(list, buf, buf1);
> }
> __skip_add:
> - if (res)
> - snd_config_delete(res);
> if (buf1)
> free(buf1);
> free(buf);
> @@ -450,13 +447,10 @@ static int add_card(struct hint_list *list, int card)
> if (err == -EXDEV)
> continue;
> if (err < 0) {
> + list->card = card;
> list->device = -1;
> err = try_config(list, list->siface, str);
> }
> - if (err < 0) {
> - list->card = -1;
> - err = try_config(list, list->siface, str);
> - }
> if (err == -ENOMEM)
> goto __error;
> }
> @@ -466,6 +460,29 @@ static int add_card(struct hint_list *list, int card)
> return err;
> }
>
> +static int add_software_devices(struct hint_list *list)
> +{
> + int err;
> + snd_config_t *conf, *n;
> + snd_config_iterator_t i, next;
> + const char *str;
> +
> + err = snd_config_search(snd_config, list->siface, &conf);
> + if (err < 0)
> + return err;
> + snd_config_for_each(i, next, conf) {
> + n = snd_config_iterator_entry(i);
> + if (snd_config_get_id(n, &str) < 0)
> + continue;
> + list->card = -1;
> + list->device = -1;
> + err = try_config(list, list->siface, str);
> + if (err == -ENOMEM)
> + return -ENOMEM;
> + }
> + return 0;
> +}
> +
> static int get_card_name(struct hint_list *list, int card)
> {
> char scard[16], *s;
> @@ -532,6 +549,8 @@ int snd_device_name_hint(int card, const char *iface,
> void ***hints)
> list.iface = SND_CTL_ELEM_IFACE_SEQUENCER;
> else if (strcmp(iface, "hwdep") == 0)
> list.iface = SND_CTL_ELEM_IFACE_HWDEP;
> + else if (strcmp(iface, "ctl") == 0)
> + list.iface = SND_CTL_ELEM_IFACE_MIXER;
> else
> return -EINVAL;
> list.show_all = 0;
> @@ -543,6 +562,7 @@ int snd_device_name_hint(int card, const char *iface,
> void ***hints)
> if (err >= 0)
> err = add_card(&list, card);
> } else {
> + add_software_devices(&list);
> err = snd_card_next(&card);
> if (err < 0)
> goto __error;
> diff --git a/src/dlmisc.c b/src/dlmisc.c
> index c882cdc..3cca0f0 100644
> --- a/src/dlmisc.c
> +++ b/src/dlmisc.c
> @@ -54,9 +54,13 @@ void *snd_dlopen(const char *name, int mode)
> #else
> #ifdef HAVE_LIBDL
> if (name == NULL) {
> - Dl_info dlinfo;
> - if (dladdr(snd_dlopen, &dlinfo) > 0)
> - name = dlinfo.dli_fname;
> + static const char * self = NULL;
> + if (self == NULL) {
> + Dl_info dlinfo;
> + if (dladdr(snd_dlopen, &dlinfo) > 0)
> + self = dlinfo.dli_fname;
> + }
> + name = self;
> }
> #endif
> #endif
>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
More information about the Alsa-devel
mailing list