int gscAction( void )
{
#pragma option(mbcs)
#pragma code("winmm.dll")
static BOOL bPlaying = FALSE;
static HWAVEOUT hWaveOut;
if(QRR) // 如果QRR为1,则开始播放音频
{
if(!bPlaying) // 如果之前没有在播放,则开始播放
{
bPlaying = TRUE;
WAVEFORMATEX wf;
memset(&wf, 0x00, sizeof(WAVEFORMATEX));
wf.wFormatTag = WAVE_FORMAT_PCM;
wf.nChannels = 1;
wf.nSamplesPerSec = 44100;
wf.nAvgBytesPerSec = 88200;
wf.nBlockAlign = 2;
wf.wBitsPerSample = 16;
DWORD dwFlags = SND_FILENAME | SND_ASYNC | SND_LOOP;
if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &wf, NULL, 0, CALLBACK_NULL) == MMSYSERR_NOERROR)
{
waveOutSetVolume(hWaveOut, 0xFFFF); // 设置音量为最大
if(waveOutPrepareHeader(hWaveOut, NULL, 0) == MMSYSERR_NOERROR)
{
if(waveOutWrite(hWaveOut, (const PWAVEHDR)"c:\\Alarm03.wav", sizeof(WAVEHDR)) == MMSYSERR_NOERROR)
{
waveOutGetVolume(hWaveOut, (LPDWORD)&dwFlags); // 获取当前音量
dwFlags &= 0xFFFF; // 只保留低16位,即左右声道的音量值
dwFlags |= dwFlags << 16; // 将左右声道的音量值分别赋给高低16位
waveOutSetVolume(hWaveOut, dwFlags); // 恢复音量
}
}
}
}
}
else // 如果QRR为0,则停止播放音频
{
if(bPlaying) // 如果之前在播放,则停止播放
{
bPlaying = FALSE;
waveOutReset(hWaveOut);
waveOutUnprepareHeader(hWaveOut, NULL, 0);
waveOutClose(hWaveOut);
hWaveOut = NULL;
}
}
#pragma code()
return 0;
} |