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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…