Alsa Lib硬件参数设置

时间:2017-02-17 12:56:47

标签: c codec alsa libalsa

我试图用alsa库在我的linux(debian)嵌入式设备上录制声音。我的嵌入式硬件是[1],并根据其数据表第33页[2],

  

on-SOM TLV320AIC3106音频编解码器具有模拟音频信号。

和德州仪器音频编解码器的数据表[3],

  

支持8 kHz至96 kHz的速率

我使用alsa lib的示例应用程序代码,对于我没有更改代码的初始工作。在示例代码中,采样率设置为44100Hz。我成功录制了声音并播放完毕。现在,我想,我可以用alsa-lib录制声音,基于数据表,采样率为8000Hz。我将采样率设置为8000Hz,但在alsa配置中,它变为16000Hz。 我将采样率设置为8000Hz;

snd_pcm_hw_params_set_rate_near(handle, params, &(record_params->rate), &dir);
snd_pcm_hw_params_set_channels(handle, params, record_params->channel);
rc = snd_pcm_hw_params(handle, params);

但是在调用此方法之后;

snd_pcm_hw_params_get_period_time(params, &(record_params->rate), &dir);

它变为16000.上面没有其他方法调用。我的设置是错误还是编解码器不支持8kHz?

更新:当我将费率设置为16000时,它会更改为8000.我真的很困惑。

[1] = http://www.variscite.com/products/system-on-module-som/cortex-a9/dart-mx6-cpu-freescale-imx6

[2] = http://www.variscite.com/images/stories/DataSheets/DART-MX6/DART-MX6_v1_2_datasheet_v2_1.pdf

[3] = http://www.ti.com/lit/ds/symlink/tlv320aic3106.pdf

1 个答案:

答案 0 :(得分:0)

时间和时间是两回事。

PCM的周期基本上是在设备中断之间传输的帧数。它是这样做的,因为逐帧地将数据传输到设备将是非常低效的。

ALSA库允许设置周期大小,以微秒(使用snd_pcm_get_period_time)或帧数(使用snd_pcm_get_period_size)指定。

如果您正在尝试计算分配用于读取或写入PCM的大小缓冲区,则使用snd_pcm_get_period_size(返回一段时间内的帧数)会更直观,然后调用{ {1}},它将PCM的帧数转换为字节数。