我是ALSA的新手,我设法在SND_PCM_ACCESS_RW_INTERLEAVED模式下播放了PCM声音。我的问题是,我只是找不到一种使该模式对我想做的事情有用的方法。 (如果有人可以告诉我怎么做,我将很高兴阅读)。我一直在阅读这种MMAP模式,但是要找到简单的示例并不容易。我想知道这是否是我需要的以及如何实现它。

我想做的是让我的小游戏(一个简单的太空射击游戏)在我拍摄或拍摄时立即播放声音。如果在播放另一种声音时敌人射击,则声音应根据需要加和饱和,但不应中断任何声音事件。换句话说,我需要能够编辑即将播放的字节。

在尝试MMAP的无用尝试(实际上不了解其工作原理;仅遵循模糊的理论说明)中,我像对SND_PCM_ACCESS_RW_INTERLEAVED一样进行了所有设置,但将其更改为SND_PCM_ACCESS_MMAP_INTERLEAVED。然后,我调用snd_pcm_avail_update,它似乎可以正常工作并返回大量可用帧。在那之后,我调用snd_pcm_mmap_begin,传递参数,之前用合理的数字(例如10)填充“框架”。该函数失败并返回错误代码-77。我还没找到这意味着什么。区域数组保持不变。

该错误是什么意思?在哪里可以获得错误列表?我该如何克服?是否有一个很好的,简单的示例,说明如何使用MMAP(或其他东西)执行或多或少执行我尝试执行的操作?

我感谢您的帮助 :)

最佳答案

错误时,ALSA返回负值。 77很可能是EBADFD,它指示设备处于无效状态(欠载/超载或根本不运行)。如果发生欠载,您可能使用的缓冲区大小太小。

无论如何,都无法修改已经提交给alsa驱动程序的音频数据(snd_pcm_mmap_commit / writei / writen)。立即获得声音的技巧只是使用非常小的缓冲区大小,
在将声音传递给alsa之前,您仍然必须手动将声音混合在一起。
这个问题的注释中有一个很好的mmap示例:Alsa api: how to use mmap in c?

话虽这么说,ALSA是此类应用程序的有效选择,但您不一定需要使用内存映射。读/写访问不会带来额外的延迟,它只会复制更多音频。

关于linux - 我需要ALSA提供MMAP才能同时播放游戏中的即时声音吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36906981/

10-11 22:09
查看更多