3

我开始为我的想法创建概念验证,此时,我需要一些关于我应该如何开始的指导。

我需要对麦克风输入进行采样,并实时处理该信号(想想自动调谐,但要实时工作),而不是“录制”一段时间。

我正在做的是“一种”“麦克风输入到 MIDI 转换器”,因此它需要快速响应。

我在网上调查了一下,显然要走的路是 DirectSound 或 WaveIn* API 函数。现在,根据我阅读的内容,WaveIn API 将让我填充一定大小的缓冲区,这对于录制和后期处理来说是很好的,但我想知道......我如何进行实时处理?

我是否使用 10ms 缓冲区并自己保持循环 50ms 或 100ms 数组,并且我得到一个每 10ms 触发一次分析的函数?(可以访问最新的100ms的输入,其中只有10ms是新的)

我在这里错过了什么吗?

另外,DirectSound 是如何做到的?与常规 Win32 API 相比,它是否为我提供了任何改进的功能?

4

1 回答 1

8

DirectSound 和 Wave API 最终都为您提供了填充了您可以处理的音频数据的缓冲区。这些缓冲区的大小可以变化,但实际上您需要将延迟保持在 10 毫秒以下才能进行有用的实时处理。这意味着在数据到达缓冲区的 10 毫秒内处理数据,减去数据到达音频硬件和到达缓冲区之间的时间,这取决于驱动程序。出于这个原因,我建议一次处理不超过 5 毫秒的数据。

两者之间的主要架构差异在于,使用 DirectSound,您分配一个循环缓冲区,然后由 DirectSound 音频驱动程序填充,而 Wave API 采用预先分配的 WAVEHDR 缓冲区队列,这些缓冲区被填充、返回到应用程序然后回收。两种 API 都有多种通知方法,例如窗口消息或事件。但是,对于低延迟处理,可能建议维护一个专用的流线程并等待新数据到达。

出于各种原因,我会推荐 DirectSound 而不是 Wave API 进行新开发 - 它肯定会更容易实现更低的延迟。

无论您选择哪种方法进行捕获,一旦您获得数据,您只需将其传递给您的处理算法并等待下一个缓冲区准备好。只要您能够比数据更快地处理数据,那么您就可以进行(伪)实时分析。

还有一些可能更合适的替代 API。看看ASIO、 Kernel Streaming (仅适用于 XP - 我不会打扰)以及 Vista 中的新功能Core Audio APIs

于 2008-11-03T13:23:36.827 回答