[alsa-devel] Why my linux OS has only 8 sound cards ? How can I modify it ?

Takashi Iwai tiwai at suse.de
Tue Nov 8 16:57:34 CET 2011


At Tue, 8 Nov 2011 07:43:26 -0800,
Linus Torvalds wrote:
> 
> Chris - you need to pick a better set of people to ask. A mailing
> list, right maintainer etc.
> 
> Takashi, any idea? Do we have some 8-sound-card limit somewhere?
> 
> I do see that we have that odd
> 
>         if (card && card->number >= 8)
>                 return 0; /* ignore silently */
> 
> in sound/core/sound_oss.c: snd_register_oss_device(), but it has no
> comments. The thing goes back to 2005 with the commit log entry of
> "[ALSA] dynamic minors (6/6): increase maximum number of sound cards",
> but the value '8'isn't explained.

ALSA itself can support 32 cards when CONFIG_SND_DYNAMIC_MINORS is
set, which assumes the use of udev.  Most of modern distros set this
already.  That's why Chris got already more than 8 devices seen in
ALSA side.

The above code is, however, about OSS-emulation.  And I guess it's
just a left-over of the old static limitation.  Actually OSS could
support up to 16 cards (in theory).

Below is an untested fix patch.  Does it work?


thanks,

Takashi

> 
>                 Linus
> 
> 
> On Tue, Nov 8, 2011 at 12:30 AM, Chris Shen <chris2shen at gmail.com> wrote:
> > Hi,everyone!
> >   My  version of kernel is linux-2.6.35 .And my board has 10 sounds
> > cards.After system was up,I used the comand "aplay -l ".Then console
> > would display this:
> > **** List of PLAYBACK Hardware Devices ****
> > card 0: imx3stack [imx-3stack], device 0: WM8731 WM8731-0 []
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 1: default [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 2: default_1 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 3: default_2 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 4: default_3 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 5: default_4 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 6: default_5 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 7: default_6 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 8: default_7 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > card 9: default_8 [C-Media USB Headphone Set  ], device 0: USB Audio
> > [USB Audio]
> >  Subdevices: 1/1
> >  Subdevice #0: subdevice #0
> > But,when I used the command "ls /dev/dsp*" ,the console display:
> > /dev/dsp   /dev/dsp2  /dev/dsp4  /dev/dsp6
> > /dev/dsp1  /dev/dsp3  /dev/dsp5  /dev/dsp7
> > when the board is up ,I found have this err "unable to register OSS
> > mixer device 8:0" and "unable to register OSS mixer device 9:0" .
> > I think the kernel's max sound cards is 8 .How can I modify it ?
> > Thank you!
> >
> 

---
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] ALSA: Fix the card number limit of OSS-emulation

There are left-over codes from the ancient days with the static device
number limitation of 8.  Actaully OSS can support up to 16 cards.

Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
 sound/core/sound_oss.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/sound/core/sound_oss.c b/sound/core/sound_oss.c
index c700920..075fc86 100644
--- a/sound/core/sound_oss.c
+++ b/sound/core/sound_oss.c
@@ -111,7 +111,7 @@ int snd_register_oss_device(int type, struct snd_card *card, int dev,
 	int register1 = -1, register2 = -1;
 	struct device *carddev = snd_card_get_device_link(card);
 
-	if (card && card->number >= 8)
+	if (card && card->number >= SNDRV_MINOR_OSS_DEVICES)
 		return 0; /* ignore silently */
 	if (minor < 0)
 		return minor;
@@ -170,7 +170,7 @@ int snd_unregister_oss_device(int type, struct snd_card *card, int dev)
 	int track2 = -1;
 	struct snd_minor *mptr;
 
-	if (card && card->number >= 8)
+	if (card && card->number >= SNDRV_MINOR_OSS_DEVICES)
 		return 0;
 	if (minor < 0)
 		return minor;
-- 
1.7.7



More information about the Alsa-devel mailing list