mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
Changes for auto loader..
This commit is contained in:
parent
9225699798
commit
d0ca621a75
8 changed files with 62 additions and 15 deletions
|
|
@ -9,6 +9,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int snd_card_load(int card);
|
||||
int snd_cards(void);
|
||||
unsigned int snd_cards_mask(void);
|
||||
int snd_card_name(const char *name);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,22 @@
|
|||
|
||||
#define SND_FILE_CONTROL "/dev/snd/control%i"
|
||||
|
||||
int snd_card_load(int card)
|
||||
{
|
||||
int open_dev;
|
||||
char control[32];
|
||||
char aload[32];
|
||||
|
||||
sprintf (control, "/dev/snd/control%d",card);
|
||||
sprintf (aload, "/dev/aload%d", card);
|
||||
|
||||
if ((open_dev=open(control, O_RDONLY)) < 0) {
|
||||
close(open(aload, O_RDONLY));
|
||||
} else {
|
||||
close (open_dev);
|
||||
}
|
||||
}
|
||||
|
||||
int snd_cards(void)
|
||||
{
|
||||
int idx, count;
|
||||
|
|
@ -59,9 +75,13 @@ unsigned int snd_cards_mask(void)
|
|||
if (save_mask)
|
||||
return save_mask;
|
||||
for (idx = 0, mask = 0; idx < SND_CARDS; idx++) {
|
||||
snd_card_load(idx);
|
||||
sprintf(filename, SND_FILE_CONTROL, idx);
|
||||
if ((fd = open(filename, O_RDWR)) < 0) {
|
||||
snd_card_load(idx);
|
||||
if ((fd = open(filename, O_RDWR)) < 0)
|
||||
continue;
|
||||
}
|
||||
close(fd);
|
||||
mask |= 1 << idx;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,11 +43,16 @@ int snd_ctl_open(void **handle, int card)
|
|||
snd_ctl_t *ctl;
|
||||
|
||||
*handle = NULL;
|
||||
|
||||
if (card < 0 || card >= SND_CARDS)
|
||||
return -EINVAL;
|
||||
sprintf(filename, SND_FILE_CONTROL, card);
|
||||
if ((fd = open(filename, O_RDWR)) < 0) {
|
||||
snd_card_load(card);
|
||||
if ((fd = open(filename, O_RDWR)) < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
if (ioctl(fd, SND_CTL_IOCTL_PVERSION, &ver) < 0) {
|
||||
close(fd);
|
||||
return -errno;
|
||||
|
|
|
|||
|
|
@ -44,11 +44,15 @@ int snd_mixer_open(void **handle, int card, int device)
|
|||
snd_mixer_t *mixer;
|
||||
|
||||
*handle = NULL;
|
||||
|
||||
if (card < 0 || card >= SND_CARDS)
|
||||
return -EINVAL;
|
||||
sprintf(filename, SND_FILE_MIXER, card, device);
|
||||
if ((fd = open(filename, O_RDWR)) < 0) {
|
||||
snd_card_load(card);
|
||||
if ((fd = open(filename, O_RDWR)) < 0)
|
||||
return -errno;
|
||||
}
|
||||
if (ioctl(fd, SND_MIXER_IOCTL_PVERSION, &ver) < 0) {
|
||||
close(fd);
|
||||
return -errno;
|
||||
|
|
|
|||
|
|
@ -44,11 +44,15 @@ int snd_pcm_open(void **handle, int card, int device, int mode)
|
|||
snd_pcm_t *pcm;
|
||||
|
||||
*handle = NULL;
|
||||
|
||||
if (card < 0 || card >= SND_CARDS)
|
||||
return -EINVAL;
|
||||
sprintf(filename, SND_FILE_PCM, card, device);
|
||||
if ((fd = open(filename, mode)) < 0) {
|
||||
snd_card_load(card);
|
||||
if ((fd = open(filename, mode)) < 0)
|
||||
return -errno;
|
||||
}
|
||||
if (ioctl(fd, SND_PCM_IOCTL_PVERSION, &ver) < 0) {
|
||||
close(fd);
|
||||
return -errno;
|
||||
|
|
|
|||
|
|
@ -44,12 +44,16 @@ int snd_pcm_loopback_open(void **handle, int card, int device, int mode)
|
|||
snd_pcm_loopback_t *lb;
|
||||
|
||||
*handle = NULL;
|
||||
|
||||
if (card < 0 || card >= SND_CARDS)
|
||||
return -EINVAL;
|
||||
sprintf(filename, SND_FILE_PCM_LB, card, device,
|
||||
mode == SND_PCM_LB_OPEN_RECORD ? "r" : "p");
|
||||
if ((fd = open(filename, mode)) < 0) {
|
||||
snd_card_load(card);
|
||||
if ((fd = open(filename, mode)) < 0)
|
||||
return -errno;
|
||||
}
|
||||
if (ioctl(fd, SND_PCM_IOCTL_PVERSION, &ver) < 0) {
|
||||
close(fd);
|
||||
return -errno;
|
||||
|
|
|
|||
|
|
@ -44,11 +44,15 @@ int snd_rawmidi_open(void **handle, int card, int device, int mode)
|
|||
snd_rawmidi_t *rmidi;
|
||||
|
||||
*handle = NULL;
|
||||
|
||||
if (card < 0 || card >= SND_CARDS)
|
||||
return -EINVAL;
|
||||
sprintf(filename, SND_FILE_RAWMIDI, card, device);
|
||||
if ((fd = open(filename, mode)) < 0) {
|
||||
snd_card_load(card);
|
||||
if ((fd = open(filename, mode)) < 0)
|
||||
return -errno;
|
||||
}
|
||||
if (ioctl(fd, SND_RAWMIDI_IOCTL_PVERSION, &ver) < 0) {
|
||||
close(fd);
|
||||
return -errno;
|
||||
|
|
|
|||
|
|
@ -60,9 +60,14 @@ int snd_seq_open(void **handle, int mode)
|
|||
snd_seq_t *seq;
|
||||
|
||||
*handle = NULL;
|
||||
|
||||
sprintf(filename, SND_FILE_SEQ);
|
||||
if ((fd = open(filename, mode)) < 0) {
|
||||
/* try load all soundcard modules */
|
||||
snd_cards_mask();
|
||||
if ((fd = open(filename, mode)) < 0)
|
||||
return -errno;
|
||||
}
|
||||
if (ioctl(fd, SND_SEQ_IOCTL_PVERSION, &ver) < 0) {
|
||||
close(fd);
|
||||
return -errno;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue