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

Takashi Iwai tiwai at suse.de
Wed Nov 9 09:10:11 CET 2011


[Please stop using HTML mail for posting to a ML...]

At Wed, 9 Nov 2011 10:24:41 +0800,
沈发旺 wrote:
> 
> Hi,Takashi Iwai :
>     * I used your patch ,but it also display this when I used the command
> "ls /dev/dsp*".*
> */dev/dsp   /dev/dsp2  /dev/dsp4  /dev/dsp6
> /dev/dsp1  /dev/dsp3  /dev/dsp5  /dev/dsp7*
> *It also display this when board up:*
> *input: C-Media USB Headphone Set   as
> /devices/platform/fsl-ehci.1/usb2/2-1/2-1.5/2-1.5:1.3/input/input7
> generic-usb 0003:0D8C:000C.0007: input: USB HID v1.00 Device [C-Media USB
> Headphone Set  ] on usb-fsl-ehci.1-1.5/input3
> usb 2-1.6: new full speed USB device using fsl-ehci and address 8
> unable to register OSS PCM device 8:0
> unable to register OSS mixer device 8:0
> input: C-Media USB Headphone Set   as
> /devices/platform/fsl-ehci.1/usb2/2-1/2-1.6/2-1.6:1.3/input/input8
> generic-usb 0003:0D8C:000C.0008: input: USB HID v1.00 Device [C-Media USB
> Headphone Set  ] on usb-fsl-ehci.1-1.6/input3
> usb 2-1.7: new full speed USB device using fsl-ehci and address 9
> unable to register OSS PCM device 9:0
> unable to register OSS mixer device 9:0
> input: C-Media USB Headphone Set   as
> /devices/platform/fsl-ehci.1/usb2/2-1/2-1.7/2-1.7:1.3/input/input9
> generic-usb 0003:0D8C:000C.0009: input: USB HID v1.00 Device [C-Media USB
> Headphone Set  ] on usb-fsl-ehci.1-1.7/input3
> **when the sound cards exceed 8 ,I found it return err from
> sound/sound_core.c:__sound_insert_unit( ) . I read this code and found
> modify the function of "register_sound_special_device " -> max_unit = 128 +
> chain; when I change to :** max_unit = 256 + chain, my board will display
> 10 sound cards :*

So it's a limitation in sound_core.c.  (BTW, 256+chain is wrong.
It should be simply 256.)

I vaguely remember why we left the limit 8 in ALSA side.  One reason
was that sound_core itself doesn't support more than 8, and we weren't
sure whether changing it would regress or not.  For example, don't
apps expect only a single digit after /dev/dsp?

OTOH, having 11 sound devices with OSS must be a rare case and I'm
sure a legacy system using OSS won't have such a configuration.
And fixing the code is basically a right thing.

That being said, I'm fine to change that part for the upstream, if no
one objects.


thanks,

Takashi

> /dev/dsp   /dev/dsp2  /dev/dsp4  /dev/dsp6  /dev/dsp8
> /dev/dsp1  /dev/dsp3  /dev/dsp5  /dev/dsp7  /dev/dsp9
> *Thank you vary mach !*
> 2011/11/9 Takashi Iwai <tiwai at suse.de>
> 
> > At Tue, 08 Nov 2011 18:37:53 +0100,
> > Clemens Ladisch wrote:
> > >
> > > Takashi Iwai wrote:
> > > > Linus Torvalds wrote:
> > > > > 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 ...
> > > > The above code is, however, about OSS-emulation.  And I guess it's
> > > > just a left-over of the old static limitation.
> > >
> > > Yes; I didn't change the limit in the OSS emulation because the minor
> > > number layout doesn't have space for all 32 cards, and extending the
> > > limit to 16 did not seem worth the effort for a 'legacy' interface.
> > >
> > > > Actually OSS could support up to 16 cards (in theory).
> > > >
> > > > Below is an untested fix patch.  Does it work?
> > >
> > > Not without increasing SNDRV_OSS_MINORS, too:
> >
> > Ah, good catch.  Below is the revised patch.
> >
> >
> > Takashi
> >
> > ---
> > 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>
> > ---
> > v2: fix SNDRV_OSS_MINORS, too
> >
> >  sound/core/sound_oss.c |    6 +++---
> >  1 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/sound/core/sound_oss.c b/sound/core/sound_oss.c
> > index c700920..e952833 100644
> > --- a/sound/core/sound_oss.c
> > +++ b/sound/core/sound_oss.c
> > @@ -35,7 +35,7 @@
> >  #include <linux/sound.h>
> >  #include <linux/mutex.h>
> >
> > -#define SNDRV_OSS_MINORS 128
> > +#define SNDRV_OSS_MINORS 256
> >
> >  static struct snd_minor *snd_oss_minors[SNDRV_OSS_MINORS];
> >  static DEFINE_MUTEX(sound_oss_mutex);
> > @@ -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