我正在尝试使用ALSA从USB音频设备获取输入,并将其作为一系列有符号短整型值写入磁盘。但结果是有效数据块与大量零块交错出现。我猜测我的缓冲设置不正确,没有正确使用内存映射。
当所有的工作都完成后,我循环遍历pCID并写入磁盘。每行一个值。
我所尝试的:
- 采样率:8K(由设备强制)
- 缓冲区大小:2048
- 周期大小:512
- 一个通道
该设备似乎已经正确打开并接受各种参数。在一些设置之后,循环运行如下:
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并写入磁盘。每行一个值。