On Mon, 24 Jun 2002, Joshua Haberman wrote:

> * Jaroslav Kysela ([EMAIL PROTECTED]) wrote:
> > On Mon, 24 Jun 2002, Paul Davis wrote:
> > 
> > > >Maybe this is what the "default" device is intended for, but can it
> > > >accommodate more than one card?  I happen to have a sound card built into
> > > >my motherboard and another in a PCI slot -- how do I tell XMMS which one
> > > >to use?
> > > 
> > > an excellent context for the question. 
> > > 
> > > i want to extend the question just a little. it seems from watching a
> > > few friends who use windows audio apps that its conventional there to
> > > name audio output options after the physical hardware. so you see
> > > things like "Terratec XWP" and "Ensoniq PCM" and so forth. This is
> > > nice because its what a lot of users think in terms of.
> > > 
> > > in ALSA, we really don't see such naming at all. thats fine with me,
> > > but it leads me to wonder. the reason that the names are useful is
> > > that they don't move around when you change the install order for the
> > > modules (for example). so, the "Ensoniq PCM" is always the "Ensoniq
> > > PCM" whether its the first card or the second.
> > > 
> > > Now, AFAICT, Windows doesn't make it very easy to deal with multiple
> > > "Ensoniq PCM" devices whereas ALSA does. However, there does seem to
> > > be something "missing" when we present users with
> > > 
> > >    plughw:1,0
> > > 
> > > as the name of suitably flexible device for general purpose audio on
> > > the second card in the absence of a ~/.asoundrc file ....
> > > 
> > > So I'm left wondering what naming scheme to use to get a more flexible
> > > way of referring to cards *without* using an ~/.asoundrc
> > > file. Alternatively, how to autogenerate the file so that it provides
> > > nice names?
> > 
> > I think that you've forgot that we can identify hardware devices over the 
> > control interface. Look for snd_ctl_pcm_next_device() and snd_ctl_pcm_info()
> > functions. It's easy to use this information with combination of PCM names 
> > like 'hw:CARD,DEVICE,SUBDEVICE' and 'plughw:*'.
> 
> I didn't know about these functions.  Here is what I came up with:
> 
> joshua@birdie:~/code$ cat alsa_devices.c 
> 
> #include <alsa/asoundlib.h>
> 
> int main() {
>     snd_ctl_t *ctl;
>     snd_pcm_info_t *info;
>     char *cardname;
>     char alsaname[100];
>     char *devicename;
>     int device;
>     int card_idx = -1;
>     int device_idx;
> 
>     snd_pcm_info_malloc(&info);
> 
>     while( snd_card_next(&card_idx) == 0 && card_idx >= 0 ) {
>         snd_card_get_name(card_idx, &cardname);
>         printf("card %d: %s\n", card_idx, cardname);
> 
>         device_idx = -1;
>         sprintf(alsaname, "hw:%d", card_idx);
>         snd_ctl_open(&ctl, alsaname, 0);
>         while( snd_ctl_pcm_next_device(ctl, &device_idx) == 0  && device_idx >= 0 ) {

You're missing here initialization of device, subdevice and stream, so you 
get only name for the first PCM device. Look for snd_pcm_info_set_*() 
functions.

>             snd_ctl_pcm_info(ctl, info);
>             devicename = snd_pcm_info_get_name(info);
>             printf("\tdevice %d: %s\n", device_idx, devicename);
>         }
>     }
> }
> joshua@birdie:~/code$ ./alsa_devices 
> card 0: Sound Blaster Live!
>         device 0: EMU10K1
>         device 1: EMU10K1
>         device 2: EMU10K1
>         device 3: EMU10K1
> card 1: SiS SI7012
>         device 0: SiS SI7012
> 
> This is useful (though the subdevice names provide no information).
> Using a process similar to this, it would be easy to write a program like
> this:
> 
> foreach card:
>     tell the user "I discovered a card named $card"
>     if the user has more than one card named this, emit a beep to disambiguate
>     ask the user what to call this card
>     add to ~/.asoundrc: "pcm.$users_name { type hw  card $num }"
> 
> But this leaves two problems:
>     1. ~/.asoundrc becomes invalid if drivers are loaded in a different order

Well, you can also determine the id of card (it's a string - something 
like abstract alias, user can pass this alias via the driver modules). See 
snd_ctl_card_info_get_id() function.

>     2. How can applications get a list of the cards the user defined?
> 
> What would be even nicer is if the symbolic names above ("Sound Blaster
> Live!" and "SiS SI7012" could be automatically aliased to the hw:$x:0
> entries, so that an application could call:
> 
>     snd_pcm_open( "Sound Blaster Live!", SND_PCM_STREAM_PLAYBACK, 0 );

Use the card id (alias) for this case. Example:

snd_pcm_open( "plughw:CARD=\"SB_Live\"", SND_PCM_STREAM_PLAYBACK, 0 );

                                                Jaroslav

-----
Jaroslav Kysela <[EMAIL PROTECTED]>
Linux Kernel Sound Maintainer
ALSA Project  http://www.alsa-project.org
SuSE Linux    http://www.suse.com



-------------------------------------------------------
Sponsored by:
ThinkGeek at http://www.ThinkGeek.com/
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to