From 33ab0b5381c87e151e87e5000964edd868484886 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 12 May 2009 08:06:41 +0200 Subject: [PATCH] Extend snd_card_get_index() to accept also control device name like /dev/snd/controlC0 Signed-off-by: Jaroslav Kysela --- src/control/cards.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/control/cards.c b/src/control/cards.c index 4d2c7394..aec823ec 100644 --- a/src/control/cards.c +++ b/src/control/cards.c @@ -39,29 +39,42 @@ #define SND_FILE_LOAD ALOAD_DEVICE_DIRECTORY "aloadC%i" #endif -static int snd_card_load1(int card) +static int snd_card_load2(const char *control) { int open_dev; - char control[sizeof(SND_FILE_CONTROL) + 10]; - - sprintf(control, SND_FILE_CONTROL, card); + snd_ctl_card_info_t info; open_dev = snd_open_device(control, O_RDONLY); -#ifdef SUPPORT_ALOAD - if (open_dev < 0) { - char aload[sizeof(SND_FILE_LOAD) + 10]; - sprintf(aload, SND_FILE_LOAD, card); - open_dev = snd_open_device(aload, O_RDONLY); - } -#endif if (open_dev >= 0) { - close (open_dev); - return 0; + if (ioctl(open_dev, SNDRV_CTL_IOCTL_CARD_INFO, &info) < 0) { + int err = -errno; + close(open_dev); + return err; + } + close(open_dev); + return info.card; } else { return -errno; } } +static int snd_card_load1(int card) +{ + int res; + char control[sizeof(SND_FILE_CONTROL) + 10]; + + sprintf(control, SND_FILE_CONTROL, card); + res = snd_card_load2(control); +#ifdef SUPPORT_ALOAD + if (res < 0) { + char aload[sizeof(SND_FILE_LOAD) + 10]; + sprintf(aload, SND_FILE_LOAD, card); + res = snd_card_load2(aload); + } +#endif + return res; +} + /** * \brief Try to load the driver for a card. * \param card Card number. @@ -127,6 +140,8 @@ int snd_card_get_index(const char *string) return card; return err; } + if (string[0] == '/') /* device name */ + return snd_card_load2(string); for (card = 0; card < 32; card++) { #ifdef SUPPORT_ALOAD if (! snd_card_load(card))