Alsa api:如何在c中使用mmap?

时间:2015-05-16 18:33:11

标签: c mmap alsa

我目前正在使用snd_pcm_writei来播放之前加载到短(16位PCM格式)数组中的声音文件。为了播放这个声音,我创建了一个包含句点(或片段)的缓冲区(短*)。然后,我使用while循环来调用snd_pcm_writei,它给了我那行:

int err = snd_pcm_writei(handle, buffer, frames);

理解它是如何工作的很简单,一切正常,我能听到声音。但是,我想尝试使用mmap而不是writei,但我并没有真正理解它。 我面临着缺乏文档和明确的例子。 任何人都可以解释mmap如何与alsa一起工作,以及如何将我的代码转换为使用mmap的代码?基本上,我仍然喜欢使用缓冲区来播放我的数组中的内容(所以这是一个大小为一个句点的短数组)。感谢。

1 个答案:

答案 0 :(得分:1)

首先,您需要将访问类型设置为MMAP类型之一(通常为SND_PCM_ACCESS_MMAP_INTERLEAVED而不是SND_PCM_ACCESS_RW_INTERLEAVED)。

如果要写入缓冲区,请使用要写入的帧数调用snd_pcm_mmap_begin()。如果此函数成功,它将返回指向缓冲区(areas[0].addr或非交错或复杂访问类型的多个指针)的指针,缓冲区(offset)的偏移量,以及您有多少帧实际上可以写。

编写样本后,使用您编写的实际帧数调用snd_pcm_mmap_commit()

请注意,将样本从您自己的缓冲区复制到设备的缓冲区时,使用mmap是没有意义的( snd_pcm_writei()已经相同一样)。 只有在动态生成样本并且可以将它们直接写入设备的缓冲区时,才能减少延迟。