【发布时间】:2011-03-21 02:21:58
【问题描述】:
我有一个应用程序,我没有用于播放音频的源代码,但缺少加速或暂时静音音频播放的功能。我正在尝试通过注入 dll 并连接 waveOutOpen、waveOutWrite 来添加这两个功能(并分别阻止播放或尝试 waveOutSetPlaybackRate 以实现静音和加速)。但是我有几个问题。
让我们先谈谈“静音”按钮,因为这是我的第一笔业务: 我将函数的钩子版本称为 MyWaveOut...
1) 我可以毫无问题地挂钩这些函数,并且我看到它们在 dbgView 日志语句中被调用。我的第一次尝试是拦截waveOutWrite 函数调用,如果按下我的“静音”按钮只是在MyWaveOutWrite 函数中返回MMSYSERR_NOERROR 而不是调用真正的waveOutWrite。这正确地阻止了音频播放,但是当我关闭“静音”时遇到问题。当我禁用静音时,音频不再播放,实际上钩子函数(也不是真正的函数)被钩子进程再次调用。
我的第一个怀疑是我在调用 WaveOutOpen 时没有调用应用程序注册的回调 waveOutProc。因此,我还挂钩了 waveOutOpen 并保留并将 waveOutProc 的地址切换到 MyWaveOutProc 并添加逻辑以在 MyWaveOutWrite 中返回相同的 MMSYSERR_NOERROR 之前调用真正的 waveOutProc。这产生了奇怪的结果,导致播放视觉效果非常快地向前跳跃,但是我遇到了同样的问题,即音频没有返回(MyWaveOutWrite 函数再也没有调用过)。
2)
至于音频加速部分,我尝试使用 waveOutSetPlaybackRate 但这只是返回了 MSYSERR_NOTSUPPORTED 所以我走到了死胡同。挂钩 GetTickCount 和 QueryPerformanceCounter 对音频播放完全没有影响,如果禁用音频,视觉播放指示器会快速向前跳,但是当启用音频设备时,视觉似乎甚至绑定到音频播放的速率.
如果有遇到这些问题的人提供任何帮助,我们将不胜感激。我通常不使用 Windows 音频,所以这对我来说是一种学习体验。
谢谢
【问题讨论】: