林试图使用ALSA从USB音频设备采取的输入,并将其写入到磁盘作为一系列signed short
值。我所得到的结果是看起来像是散布了大块零的有效数据块。我猜测我的缓冲区设置不正确,没有正确使用内存映射。拍摄 - 理解存储器映射
我试图:
- 采样率:8K(这是由设备被迫)
- 缓冲区大小:2048
- 周期大小:512
- 一个信道
该设备似乎被打开prope并且接受各种参数。一些设置后的循环运行为:
snd_pcm_avail_update
snd_pcm_mmap_begin
memcpy data from mmap buffer to array of short
snd_pcm_mmap_commit
的memcpy的是一个指针的短阵列,并且通过帧的数量递增返回的每个通。
在此记录几秒钟后,我将其关闭并将随后的缓冲区写入磁盘,作为每行上的单个短值。我期待的是在1200赫兹和2300赫兹之间变化的一秒或两秒PCM数据。我得到的是一些有很多零的数据。
我想知道的是:我的缓冲区和期限值是否合理?有没有人成功地使用ALSA的内存映射输出?
编辑:一些代码
const snd_pcm_channel_area_t *areas;
snd_pcm_uframes_t offset, frames, size;
short* pCID = (short*)malloc(50000 * sizeof(short));
short* ppCID = pCID;
while(size > 0)
{
frames = size;
snd_pcm_mmap_begin (device, &areas, &offset, &frames);
short* pd = (short*)areas[0].addr;
memcpy(ppCID, (pd + (offset*sizeof(short))), frames * sizeof(short));
ppCID += frames;
snd_pcm_mmap_commit(device, offset, frames);
size -= frames;
}
(为了清楚起见检查删除错误)
当一切都说过和做过通过PCID我环路和写入磁盘。每行一个值。