如何检测Windows XP机器上是否播放任何声音

时间:2010-10-21 00:48:36

标签: windows perl delphi audio

是否可以检测Windows XP机器上是否有声音?任何语言的帮助都会很有用。我基本上需要编写一个一直运行的程序,并在播放声音时将一些文本输出到文件中。我不需要任何关于声音的具体信息,只需要播放声音。我不关心扬声器是否真的开机或类似的东西。

2 个答案:

答案 0 :(得分:4)

问题很简单,但答案很难。您需要利用DirectSound来实现您的目的。我还没有测试过我的解决方案,但您可以尝试调用IDirectSoundBuffer8::GetStatus(),然后检查 pdwStatus 参数的返回值。根据MSDN,如果正在听到缓冲区,则设置DSBSTATUS_PLAYING

由于您没有讲述您正在使用的编程语言,因此我使用我最喜欢的语言Delphi实现了以下示例。

  var
    dwStatus: DWORD;
    hResult: HRESULT;

  hResult := GetStatus(@dwStatus);
  if hResult = DS_OK then begin
    if dwStatus and DSBSTATUS_PLAYING <> 0 then
      ShowMessage('Sound card is playing sound now.');
  end;

更新

我刚刚发现了一个讨论how to detect silence的VB论坛(没有输出声卡)。下载DetSilence.zip。在DXRecord_GotWavData Sub中,将常量SilencePercentNonSilencePercent修改为您需要的值。

答案 1 :(得分:2)

我最终以非常规的方式接近了这一点。首先我安装了虚拟音频线(http://www.ntonyx.com/vac.htm)并将其配置为我的主要声音设备。然后我配置录音设备以录制主输出设备的声音。这基本上意味着我可以点击“记录”,它会记录任何进入声卡的内容。然后我使用perl模块Win32 :: SoundRec将声音录制到文件中。我定期检查wav文件的活动,如果有的话,我知道声音在播放。我使用另一个perl模块Audio :: Wav来解析WAV文件并寻找活动(沉默与非沉默)。