[alsa-devel] Retrieving the number of input channels on a sound card
André Prado
andreprado88 at gmail.com
Wed Jun 8 21:20:10 CEST 2011
I Found it out.. hope it helps someone.
snd_pcm_t *capture_handle;
snd_pcm_hw_params_t *hw_params;
snd_pcm_open( &capture_handle, str, SND_PCM_STREAM_PLAYBACK, 0 );
snd_pcm_hw_params_malloc (&hw_params);
snd_pcm_hw_params_any(capture_handle, hw_params);
unsigned int num_canais = 0;
int ret;
ret = snd_pcm_hw_params_get_channels(hw_params, &num_canais);
printf("Number of channels: %i\n",num_canais);
2011/6/8 André Prado <andreprado88 at gmail.com>:
> Hello. I am new to Alsa programming and i want to get the number of
> input channels on an audio device.
> I am reading a lot of tutorials and documentations but i am struggling
> to do this.
>
> Here is a code i've saw to Lists the hardware names of MIDI output
> device/sub-devices. I've understood it. But i want to get the number
> of input channels.
>
> Any help is appreciated. THanks
>
> // listmidi.c
> // Lists the hardware names of MIDI output device/sub-devices
> // upon each ALSA sound card in the system.
> //
> // Compile as:
> // gcc -o listmidi listmidi.c -lasound
>
> #include <stdio.h>
> #include <string.h>
> #include <alsa/asoundlib.h>
>
> int main(int argc, char **argv)
> {
> register int err;
> int cardNum;
>
> // Start with first card
> cardNum = -1;
>
> for (;;)
> {
> snd_ctl_t *cardHandle;
>
> // Get next sound card's card number. When "cardNum" == -1, then ALSA
> // fetches the first card
> if ((err = snd_card_next(&cardNum)) < 0)
> {
> printf("Can't get the next card number: %s\n", snd_strerror(err));
> break;
> }
>
> // No more cards? ALSA sets "cardNum" to -1 if so
> if (cardNum < 0) break;
>
> // Open this card's control interface. We specify only the card
> number -- not
> // any device nor sub-device too
> {
> char str[64];
>
> sprintf(str, "hw:%i", cardNum);
> if ((err = snd_ctl_open(&cardHandle, str, 0)) < 0)
> {
> printf("Can't open card %i: %s\n", cardNum, snd_strerror(err));
> continue;
> }
> }
>
> {
> int devNum;
>
> // Start with the first MIDI device on this card
> devNum = -1;
>
> for (;;)
> {
> snd_rawmidi_info_t *rawMidiInfo;
> register int subDevCount, i;
>
> // Get the number of the next MIDI device on this card
> if ((err = snd_ctl_rawmidi_next_device(cardHandle, &devNum)) < 0)
> {
> printf("Can't get next MIDI device number: %s\n",
> snd_strerror(err));
> break;
> }
>
> // No more MIDI devices on this card? ALSA sets "devNum" to -1 if so.
> // NOTE: It's possible that this sound card may have no MIDI
> devices on it
> // at all, for example if it's only a digital audio card
> if (devNum < 0) break;
>
> // To get some info about the subdevices of this MIDI device
> (on the card), we need a
> // snd_rawmidi_info_t, so let's allocate one on the stack
> snd_rawmidi_info_alloca(&rawMidiInfo);
> memset(rawMidiInfo, 0, snd_rawmidi_info_sizeof());
>
> // Tell ALSA which device (number) we want info about
> snd_rawmidi_info_set_device(rawMidiInfo, devNum);
>
> // Get info on the MIDI outs of this device
> snd_rawmidi_info_set_stream(rawMidiInfo, SND_RAWMIDI_STREAM_OUTPUT);
>
> i = -1;
> subDevCount = 1;
>
> // More subdevices?
> while (++i < subDevCount)
> {
> // Tell ALSA to fill in our snd_rawmidi_info_t with info
> on this subdevice
> snd_rawmidi_info_set_subdevice(rawMidiInfo, i);
> if ((err = snd_ctl_rawmidi_info(cardHandle, rawMidiInfo)) < 0)
> {
> printf("Can't get info for MIDI output subdevice
> hw:%i,%i,%i: %s\n", cardNum, devNum, i, snd_strerror(err));
> continue;
> }
>
> // Print out how many subdevices (once only)
> if (!i)
> {
> subDevCount = snd_rawmidi_info_get_subdevices_count(rawMidiInfo);
> printf("\nFound %i MIDI output subdevices on card
> %i\n", subDevCount, cardNum);
> }
>
> // NOTE: If there's only one subdevice, then the subdevice
> number is immaterial,
> // and can be omitted when you specify the hardware name
> printf((subDevCount > 1 ? " hw:%i,%i,%i\n" : "
> hw:%i,%i\n"), cardNum, devNum, i);
> }
> }
> }
>
> // Close the card's control interface after we're done with it
> snd_ctl_close(cardHandle);
> }
>
> snd_config_update_free_global();
> }
>
> --
> Att
> André
>
--
Att
André
More information about the Alsa-devel
mailing list