我正在研究一种语音转换器,它应该在缓冲区返回应用程序之前操纵波形音频输入设备的输入缓冲区。
waveInOpen() - 函数提供了4个选项,当waveInAddBuffer()提供的缓冲区被填充时会被通知。
选项包括CALLBACK_EVENT,CALLBACK_FUNCTION,CALLBACK_THREAD,CALLBACK_WINDOW。
为了让我的波形操作能够正常工作,我已经尝试了几件事,但尚未找到可靠而干净的解决方案。
到目前为止工作的是拦截waveInAddBuffer() - 使用Detours调用。我正在保存waveInAddBuffer()使用的所有WAVEHDR指针,每次调用该函数时,我将程序延迟几毫秒,并搜索在延迟期间填充的波形缓冲区。 这并不可靠,因为每个应用程序的缓冲区大小不同,因此没有适用于每个应用程序的延迟时间。
我真的很感谢新的想法!
编辑: 继承了我尝试过的其他事情:
大多数应用程序在调用实际相互排斥的waveInOpen()时设置多个标志。因此,您永远无法确定实际使用的是哪种回调方法。 (例如:标志CALLBACK_EVENT | CALLBACK_FUNCTION | CALLBACK_WINDOW都已设置。)
当设置了CALLBACK_WINDOW标志时,我使用了SetWindowLongPtr()函数来创建一个子类窗口,该窗口在应用程序窗口之前接收到MM_WIM_DATA消息。不幸的是,这没有用,我的子类窗口永远不会被调用。
我创建了一个自定义回调函数,当设置了CALLBACK_FUNCTION标志时,我用应用程序的回调函数替换它。 这没有用,因为我的功能永远不会被调用。我想这是因为我的函数是在应用程序的地址空间之外的DLL中定义的。
我尝试过的其他一些事情并没有奏效,因为我做了一些从未有过的尝试,因为我对注射和钩子知之甚少。我学到了很多东西,但我无法总结我所尝试过的一切,因为它没有帮助我。