How to detect if any sound plays on a windows xp machine
Is it possible to detect if any sound plays on a windows xp machine? Help in any language would be useful. I basically need to write a program that runs all the time and outputs some text to a file whenever a sound plays. I don't need any specific information about the开发者_高级运维 sound, just whether a sound is playing. I don't care whether the speakers are actually powered on or anything like that.
The question was easy, but the answer is difficult. You'll need to utilize DirectSound to achieve your purpose. I haven't tested my solution yet, but you can try to call IDirectSoundBuffer8::GetStatus(), then check the return value of pdwStatus parameter. According to MSDN, DSBSTATUS_PLAYING
is set if the buffer is being heard.
Since you didn't tell about programming language you are using, I implement the following example using my favorite language, 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;
UPDATE
I just found a VB forum discussed about how to detect silence (no output of sound card). Download DetSilence.zip. In the DXRecord_GotWavData
Sub, modify the constants SilencePercent
and NonSilencePercent
to the values you need.
I ended up approaching this in an unconventional manner. First I installed Virtual Audio Cable (http://www.ntonyx.com/vac.htm) and configured it as my primary sound device. I then configured the recording device to record the sound from the primary output device. This basically means I can hit "record" and it will record anything going to the sound card. Then I used a perl module, Win32::SoundRec to record sound to a file. I periodically check the wav file for activity and if there is some, I know sound was playing. I used another perl module, Audio::Wav, to parse the WAV file and look for activity (silence vs. non-silence).
精彩评论