我开始为我的想法创建一个概念证明,在这一点上,我需要一些关于如何开始的指导.
我需要对麦克风输入进行采样,并实时处理该信号(想想Auto-Tune,但是现场工作),而不是"录音"一段时间.
我正在做的是"一种""MIDI转换器的麦克风输入",所以它需要非常快速地响应.
我在线调查了一下,显然要走的路是DirectSound或WaveIn*API函数.现在,根据我读到的内容,WaveIn API将让我填充一定大小的缓冲区,这对于录制和后期处理来说很好,但我想知道......我该如何进行实时处理?
我是否使用10ms缓冲区并自己保留一个50ms或100ms的圆形阵列,并且我得到一个每10ms触发一次分析的功能?(可以访问最新的100毫秒输入,其中只有10毫秒是新的)
我在这里错过了什么吗?
另外,DirectSound是如何完成的?它是否比常规的Win32 API提供了任何改进的功能?
DirectSound和Wave API最终都为您提供了可以处理的音频数据缓冲区.这些缓冲区的大小可以变化,但实际上,您需要将延迟保持在10mS以下才能进行有用的实时处理.这意味着处理到达缓冲区的10mS内的数据,减去它到达音频硬件和到达缓冲区之间的时间,这取决于驱动程序.出于这个原因,我建议一次处理不超过5mS的数据.
两者之间的主要架构差异在于,使用DirectSound,您可以分配一个循环缓冲区,然后由DirectSound音频驱动程序填充,而Wave API将获取一个预先分配的WAVEHDR缓冲区队列,这些缓冲区将被填充,返回给应用程序然后再循环.两种API都有各种通知方法,例如窗口消息或事件.但是,对于低延迟处理,维护专用流线程并等待新数据到达可能是可取的.
出于各种原因,我建议使用WaveSound而不是Wave API进行新的开发 - 实现更低的延迟肯定会更容易.
无论您选择哪种方法进行捕获,一旦获得数据,只需将其传递给处理算法并等待下一个缓冲区准备就绪.只要您能够比到达时更快地处理数据,那么您将进行(伪)实时分析.
还有其他API可能更合适.看一下ASIO,Kernel Streaming(仅适用于XP - 我不会打扰),以及Vista中的新功能,即Core Audio API.