[alsa-devel] Retrieving the number of input channels on a sound card
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(); }
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@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é
At Wed, 8 Jun 2011 16:20:10 -0300, André Prado wrote:
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);
Well, this isn't always correct, unfortunately. If the device supports multiple channels (many do it indeed), the situation becomes complicated.
You can get the minimum and maximum values in the configuration space even before determining to the single one, via snd_pcm_hw_params_get_channels_{min|max}(). Or check whether the given channels are supported via snd_pcm_hw_params_test_channels().
Takashi
2011/6/8 André Prado andreprado88@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é _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
participants (2)
-
André Prado
-
Takashi Iwai