我在寻找到使一些软件,使键盘的功能就像一个钢琴(例如,用户按“W”键和扬声器播放d注)。我可能会使用的OpenAL。我明白数字音频的基本知识,但在应对按键播放实时音频就会遇到麻烦解决了一些问题。

<强>这里的问题是:让我们说,我有10个音频缓冲器,每个缓冲器保持音频数据的一秒钟。如果我有他们通过扬声器播放之前,以填补缓冲区,那么我将将填充缓冲器中的一个或两个秒钟播放之前他们。这意味着,每当用户试图打一个音符,将有一个或按键和音符正在播放之间的两个第二延迟。

你如何解决这个问题?你只是让缓冲区尽可能的小,并填写他们尽可能晚?有一些技巧,我很想念?

有帮助吗?

解决方案

大多数软件合成器不使用在所有的多个缓冲区。

他们只是用那就是不断打一个单一的,小ringbuffer。

有一个高优先级的线程会尽可能经常检查当前的播放位置,并填写免费部分(例如,因为你的线程运行的最后时间已播放的部分)与声音数据ringbuffer的。

这会给你一个常数延迟,其仅由您的大小约束环缓冲器和声卡的输出等待时间(通常没有那么多)。

您甚至可以进一步降低您的等待时间:

在一个新的注释的情况下,要播放(例如,用户只是按一个键)您检查环形缓冲区内的当前播放位置,添加一些样本进行安全,然后重新渲染与声音数据新的声音的设置应用。

这是需要技巧的,如果你在运行基于时间的效果(延迟线,混响等),但它是可行的。只要保持你的基于时间的效果每毫秒左右最后的10个州的轨道。这将使它能够拿回10毫秒的时间。

其他提示

随着WinAPI的,你只能得到到目前为止,在延迟方面。通常你不能低于40-50ms这是很讨厌的。解决的办法是实现您的应用程序ASIO支持,使用户运行类似ASIO4ALL的背景。这带来的延迟降低到5毫秒,但有代价的:其他应用程序不能在同一时间播放声音

我知道这是因为我是一个FL Studio用户。

的解决方案是小的缓冲区,由实时线程频繁填充。你如何让小缓冲区(或有多满你让缓冲区成为一个环形缓冲区)是由操作系统的调度延迟的限制。您可能会发现10毫秒是可以接受的。

有在这里一些讨厌的陷阱的门外汉 - 特别是关于软件体系结构和线程安全。

您可以尝试在看看 JUCE - 这是用于编写音频软件跨平台框架,特别是 - 音频插件,如软合成器和效果。它包括两个样品插件和主机软件。它是在主机线程问题大多处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top