我只是乱搞alsa库,并不能真正弄清楚如何使用直接写入进行回放。我正在使用访问类型mmap交错。 我正在尝试写一个方波。Alsalib mmap直接写入
我创建了一个用于保存方波的短路缓冲区。我用snd_pcm_writei测试过它,它工作。
我然后调用snd_pcm_begin并使用从区域给出的指针写入设备:
while(1){
int msg;
frames_available = snd_pcm_avail_update(handle);
snd_pcm_mmap_begin(handle,&areas,&offset,&limit_frames);
frames_to_write = frames;//frames is the size of the buffer in frames
if(frames_to_write > limit_frames)
frames_to_write = 0;
int offset_frames = (areas[0].first + offset*areas[0].step)/16;
short* write_ptr = (short*)areas[0].addr + offset_frames;
//fill the buffer with stuff
for(int i =0; i < frames_to_write;i++){
write_ptr[i] = buffer[i];
}
msg = snd_pcm_mmap_commit(handle,offset,frames_to_write);
}
产生的声音是波涛汹涌不久之后被切断。它会被截断,因为limit_frame达到0.我注意到,即使有frames_available,limit_frames也会保持为0。
编辑: 我用memcpy()而不是一个for循环,并解决了choppiness。尽管如此,仍然被切断。现在我很好奇为什么memcpy()解决了这个问题。 for循环和memcpy和for循环不应该连续复制内存吗?