fix error code when controlC0 device has no enough permissions

See alsa bug#3600
This commit is contained in:
Jaroslav Kysela 2007-11-25 23:20:50 +01:00
parent 2ba380fdc4
commit a2d98ebd42

View file

@ -39,12 +39,7 @@
#define SND_FILE_LOAD ALOAD_DEVICE_DIRECTORY "aloadC%i" #define SND_FILE_LOAD ALOAD_DEVICE_DIRECTORY "aloadC%i"
#endif #endif
/** static int snd_card_load1(int card)
* \brief Try to load the driver for a card.
* \param card Card number.
* \return 1 if driver is present, zero if driver is not present
*/
int snd_card_load(int card)
{ {
int open_dev; int open_dev;
char control[sizeof(SND_FILE_CONTROL) + 10]; char control[sizeof(SND_FILE_CONTROL) + 10];
@ -61,9 +56,20 @@ int snd_card_load(int card)
#endif #endif
if (open_dev >= 0) { if (open_dev >= 0) {
close (open_dev); close (open_dev);
return 1; return 0;
} else {
return -errno;
} }
return 0; }
/**
* \brief Try to load the driver for a card.
* \param card Card number.
* \return 1 if driver is present, zero if driver is not present
*/
int snd_card_load(int card)
{
return !!(snd_card_load1(card) == 0);
} }
/** /**
@ -104,7 +110,7 @@ int snd_card_next(int *rcard)
*/ */
int snd_card_get_index(const char *string) int snd_card_get_index(const char *string)
{ {
int card; int card, err;
snd_ctl_t *handle; snd_ctl_t *handle;
snd_ctl_card_info_t info; snd_ctl_card_info_t info;
@ -116,13 +122,16 @@ int snd_card_get_index(const char *string)
return -EINVAL; return -EINVAL;
if (card < 0 || card > 31) if (card < 0 || card > 31)
return -EINVAL; return -EINVAL;
if (snd_card_load(card)) err = snd_card_load1(card);
if (err >= 0)
return card; return card;
return -ENODEV; return err;
} }
for (card = 0; card < 32; card++) { for (card = 0; card < 32; card++) {
#ifdef SUPPORT_ALOAD
if (! snd_card_load(card)) if (! snd_card_load(card))
continue; continue;
#endif
if (snd_ctl_hw_open(&handle, NULL, card, 0) < 0) if (snd_ctl_hw_open(&handle, NULL, card, 0) < 0)
continue; continue;
if (snd_ctl_card_info(handle, &info) < 0) { if (snd_ctl_card_info(handle, &info) < 0) {