我有一个应用程序,我没有播放音频的源代码,但缺乏加速或暂时静音音频播放的功能。我试图通过注入一个dll并挂钩waveOutOpen,waveOutWrite(以及分别阻止播放或尝试使用waveOutSetPlaybackRate进行静音和加速)来添加这两个功能。但是我有几个问题。
让我们先谈谈“静音”按钮,因为这是我的第一个业务订单: 我将把函数的钩子版本称为MyWaveOut ......
1) 我能够挂钩函数没问题,我看到它们在dbgView日志语句中被调用。我的第一次尝试是拦截waveOutWrite函数调用,如果按下我的“静音”按钮只是在MyWaveOutWrite函数中返回MMSYSERR_NOERROR而不是调用真正的waveOutWrite。这可以正确防止音频播放,但是当我关闭“静音”时遇到问题。当我禁用静音时,音频不会再次播放,事实上,被钩住的进程再次调用被钩住的函数(也不是真正的函数)。
我的第一个怀疑是,当调用WaveOutOpen时,我没有调用应用程序注册的回调waveOutProc。因此我也挂了waveOutOpen并保持并将waveOutProc的地址切换到MyWaveOutProc并添加逻辑来调用真正的waveOutProc,然后在MyWaveOutWrite中返回相同的MMSYSERR_NOERROR。这有奇怪的结果导致播放视觉快速向前跳,但后来我遇到了同样的问题,音频没有返回(MyWaveOutWrite函数再也没有调用)。
2)
至于音频加速部分,我尝试使用waveOutSetPlaybackRate,但这只是返回了MSYSERR_NOTSUPPORTED,所以我到达了死胡同。挂起GetTickCount和QueryPerformanceCounter对音频播放完全没有影响,如果音频被禁用,视觉播放指示器将快速向前跳过,但是当音频设备启用时,视觉似乎甚至被绑定到音频播放的速率
对于遇到这些问题的人有任何帮助,我们将不胜感激。我通常不使用Windows音频,所以对我来说这是一种学习经历。
由于
答案 0 :(得分:0)
建议采用不同的方法。
这假设操作系统来自Vista Kernnel或更高版本。 在这些操作系统中有一个pr应用程序音量控制,可以更简单地将其静音,然后使用任何挂钩。