2016-01-16 44 views
0

我只是乱搞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循环不应该连续复制内存吗?

回答

0

如果你正在做的是从另一个缓冲区复制样本,使用mmap是没有意义的;这与snd_pcm_writei()所做的完全相同。

无论如何,呼吁snd_pcm_mmap_begin()之前,你必须设置其最后一个参数,你打算写的,当它返回一个较小的数字,你应该写这个数字的帧数,而不是0

当你有多个通道时,一个帧比一个采样大。