[alsa-devel] Problem capturing from sound board
André Prado
andreprado88 at gmail.com
Thu Jun 9 19:37:19 CEST 2011
Hello i am trying to do a simple program in order to capture the input
from the microphone in my OnBoard HDA Intel sound board.
However it doesnt work and gives me a segmentation fault. Any help is
appreciated.
#include <stdio.h>
#include <string.h>
#include <alsa/asoundlib.h>
int main(int argc, char** argv)
{
register int err;
int cardNum, totalCards;
totalCards = 0;
cardNum = -1;
short buf[128];
while(1)
{
snd_ctl_t *cardHandle;
printf("\n***********\n");
//Number of boards
if ((err = snd_card_next(&cardNum)) < 0)
{
printf("%s\n", snd_strerror(err));
break;
}
if(cardNum<0)
{
break;
}
++totalCards;
char str[64];
sprintf(str, "hw:%i", cardNum); (IS THIS THE RIGHT WAY TO NAME MY DEVICE?)
snd_pcm_t *capture_handle;
snd_pcm_hw_params_t *hw_params;
if(err = snd_pcm_open( &capture_handle, str,
SND_PCM_STREAM_CAPTURE, 0 ) < 0 )
{
printf(" %s\n", snd_strerror(err));
break;
}
snd_pcm_hw_params_malloc (&hw_params);
snd_pcm_hw_params_any(capture_handle, hw_params);
if(err = snd_pcm_hw_params_set_access(capture_handle, hw_params,
SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
printf("Nao e setar o acesso: %s\n", snd_strerror(err));
unsigned int num_canais = 0;
int ret;
if(err = snd_pcm_hw_params_get_channels_max(hw_params, &num_canais) < 0)
printf(" Nao e conseguir o numero de canais: %s\n", snd_strerror(err));
printf("Numero de canais: %i\n",num_canais);
// Configurando hardware
// Resampling
printf("Fim preparacao");
unsigned int resample = 1;
if (err = snd_pcm_hw_params_set_rate_resample(capture_handle,
hw_params, resample)<0)
printf("Erro setando o sample: %s\n", snd_strerror(err));
// Formato Little endian 16 bits
snd_pcm_hw_params_set_format (capture_handle, hw_params,
SND_PCM_FORMAT_S16_LE);
// Stereo
if (err = snd_pcm_hw_params_set_channels (capture_handle, hw_params, 2) < 0)
printf("Erro setando o numero de canais: %s\n", snd_strerror(err));
// Playback Rate
unsigned int actualRate = 44100;
if (err = snd_pcm_hw_params_set_rate_near (capture_handle,
hw_params, &actualRate, 0) < 0)
printf("Erro setando o rate de playback: %s\n", snd_strerror(err));
// Setando os valores configurados no hardware.
if (err = snd_pcm_hw_params (capture_handle, hw_params) < 0 )
printf("Erro setando o hardware: %s\n", snd_strerror(err));
// Tamanho do buffer recebido apos configurar o hardware
snd_pcm_uframes_t bufferSize;
snd_pcm_hw_params_get_buffer_size( hw_params, &bufferSize );
//printf( "Init: Buffer size = %s", bufferSize);
//_playbackFrames = bufferSize;
printf( "\nBits significantes para amostra linear = %i\n",
snd_pcm_hw_params_get_sbits(hw_params));
// Preparando para leitura
int i=0;
int d=0;
if ((err = snd_pcm_prepare (capture_handle)) < 0)
printf("cannot prepare audio interface for use (%s)\n",snd_strerror(err));
snd_pcm_hw_params_free (hw_params);
// if ((err = snd_pcm_readi (capture_handle, buf, 128)) != 128)
// printf( "read from audio interface failed (%s)\n", snd_strerror (err));
}
snd_config_update_free_global();
}
--
Att
André
More information about the Alsa-devel
mailing list