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);
#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;
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)
- continue;
+ if ((fd = open(filename, O_RDWR)) < 0) {
+ snd_card_load(idx);
+ if ((fd = open(filename, O_RDWR)) < 0)
+ continue;
+ }
close(fd);
mask |= 1 << idx;
}
char filename[32];
snd_ctl_t *ctl;
- *handle = NULL;
+ *handle = NULL;
+
if (card < 0 || card >= SND_CARDS)
return -EINVAL;
sprintf(filename, SND_FILE_CONTROL, card);
- if ((fd = open(filename, O_RDWR)) < 0)
- return -errno;
+ 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;
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)
- return -errno;
+ 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;
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)
- return -errno;
+ 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;
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)
- return -errno;
+ 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;
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)
- return -errno;
+ 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;
snd_seq_t *seq;
*handle = NULL;
+
sprintf(filename, SND_FILE_SEQ);
- if ((fd = open(filename, mode)) < 0)
- return -errno;
+ 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;