alsa参数配置和声道分离

最近需要做一个超声的接收端,应用本来让一个同事写的,结果谢了2周一塌糊涂,无力吐槽了,哎,只能我上了,使用alsalib,对alsa的一些参数有了一定的了解,这里记录下,哈哈,直接上代码

rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0);  //首先要打开设备
    if (rc < 0)
    {  
        fprintf(stderr,  "unable to open pcm device: %s/n",  snd_strerror(rc));  
        exit(1);  
    }  
    snd_pcm_hw_params_alloca(&params);              //为硬件参数分配空间             
    snd_pcm_hw_params_any(handle, params);          //设置硬件参数默认值
    /* 下面这些参数是你想要DIY的 */  
    snd_pcm_hw_params_set_access(handle, params,  
    SND_PCM_ACCESS_RW_INTERLEAVED);                //设置为Interleaved模式

    snd_pcm_hw_params_set_format(handle, params,  
    SND_PCM_FORMAT_S16_LE);                      //设置采样结果为16bit小端

    snd_pcm_hw_params_set_channels(handle, params, 2);  //设置为双声道   即stereo,如果你想要分析单声道的音频可以设置为单声道,或者做声道分离的工作
    val = 96000;     //这里设置采样率96k,想想奈奎斯特定理,这个采样率可以还原48k的音频,哈哈,超声
    snd_pcm_hw_params_set_rate_near(handle, params,  &val, &dir);  
    /* Set period size to 32frames. */  
    frames = 1024; 
    snd_pcm_hw_params_set_period_size_near(handle,  params, &frames, &dir);   
    rc = snd_pcm_hw_params(handle, params);  //最后这里是将你设置的参数回写到硬件参数里  这样参数设置就结束了
    if (rc < 0) 
    {  
        fprintf(stderr,  "unable to set hw parameters: %s/n",  
        snd_strerror(rc));  
        exit(1);  
    }    

下面就可以进行录音了,可以去参阅alsa官网提供的example,但是有几个问题要注意,由于codec不同,支持的采样率也是有所差别的,一定要去看看你的codec源码中是否支持你要的采样频率,或者从datasheet中去确认下,曾经被坑过。

下面说说声道分离的那些事,前面设置采样为16bit小端还记得吧,双声道,意思就是

| 左声道16位 | 右声道16位 | 左声道16位 | 右声道16位 | 这样的格式,那么声道分离就简单了

void separateChannel(char * buffer, short *lefeChannel)
{
      int i = 0;
      for (i = 0; i < MAXBUFFERSIZE; i++)
      {
        *(lefeChannel+i) = *(short *)(buffer + 4 * i);    
      }
}

你可能感兴趣的:(alsa,声道分离,嵌入式音频,alsa参数配置,嵌入式)