- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在使用 snd_pcm_writei 播放一个声音文件,该文件之前加载到一个短数组(16 位 PCM 格式)中。为了播放这个声音,我创建了一个缓冲区(短*),其中包含一个句点(或片段)。然后,我使用一个 while 循环来调用 snd_pcm_writei,它给了我那一行:
int err = snd_pcm_writei(handle, buffer, frames);
理解它的工作原理非常简单,一切正常,我能听到声音。但是,我想尝试使用 mmap 而不是 writei,但我不太明白。我面临着缺乏文档和清晰示例的问题。谁能解释 mmap 如何与 alsa 一起工作,以及如何将我的代码转换为使用 mmap 的代码?基本上,我仍然想使用缓冲区播放数组中的内容(因此是一个长度为一个周期的 short 数组)。谢谢。
最佳答案
首先,您需要将访问类型设置为 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()
已经这样做了)。只有在动态生成样本并将它们直接写入设备缓冲区时,才能减少延迟。
关于c - 阿尔萨 API : how to use mmap in c?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279326/
我是一名优秀的程序员,十分优秀!