int CSoundPlayer::InitSndDevice()
{
memset(&m_Format, 0, sizeof(m_Format));
m_Format.nSamplesPerSec = m_MAX_FREQUENCY;
m_Format.nChannels = STEREO;
m_Format.wBitsPerSample = 16;
m_Format.nBlockAlign = (m_Format.nChannels * m_Format.wBitsPerSample + 7) / 8;
m_Format.nAvgBytesPerSec = m_Format.nBlockAlign * m_Format.nSamplesPerSec;
m_Format.wFormatTag = WAVE_FORMAT_PCM;
UINT res = waveOutOpen(&m_hWaveOut, m_DeviceID, &m_Format, (DWORD_PTR) waveOutProc,(DWORD_PTR) this, CALLBACK_FUNCTION);
if (MMSYSERR_NOERROR != res)
{
ShowError((int)res, "Error waveOutOpen");
return -1;
}
memset(&m_MainSndBuffer, 0, sizeof(m_MainSndBuffer));
memset(&m_ExtSndBuffer, 0, sizeof(m_ExtSndBuffer));
m_hMainWaveHdr.dwFlags = 0;
m_hExtWaveHdr.dwFlags = 0;
m_hMainWaveHdr.dwLoops = m_hExtWaveHdr.dwLoops = 0;
m_hMainWaveHdr.lpData = m_MainSndBuffer;
m_hExtWaveHdr.lpData = m_ExtSndBuffer;
m_hMainWaveHdr.dwBufferLength = m_hExtWaveHdr.dwBufferLength = PLAYING_SOUND_BUFF_SIZE;
res = waveOutPrepareHeader(m_hWaveOut, &m_hMainWaveHdr, sizeof(m_hMainWaveHdr));
if (MMSYSERR_NOERROR != res)
{
ShowError((int)res, "Error with waveOutPrepareHeader N1");
return -1;
};
res = waveOutPrepareHeader(m_hWaveOut, &m_hExtWaveHdr, sizeof(m_hExtWaveHdr));
if (MMSYSERR_NOERROR != res)
{
ShowError((int)res, "Error with waveOutPrepareHeader N2");
return -1;
};
return 0;
}
//-----------------------------------------------------------------------------
void CSoundPlayer::StartPlay()
{
MMRESULT res = waveOutWrite(m_hWaveOut, &m_hMainWaveHdr, sizeof(m_hMainWaveHdr));
if (MMSYSERR_NOERROR != res) { ShowError(res, "Error with waveOutWrite"); };
m_LoopNumIsPlaying = 0;
res = waveOutWrite(m_hWaveOut, &m_hExtWaveHdr, sizeof(m_hExtWaveHdr));
if (MMSYSERR_NOERROR != res) { ShowError(res, "Error with waveOutWrite"); };
return;
}
//-----------------------------------------------------------------------------
void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD dwParam1, DWORD dwParam2)
{
dwParam1; // compiler warning :[]
dwParam2;
WAVEHDR *main_header = &((CSoundPlayer*)dwInstance)->m_hMainWaveHdr;
WAVEHDR *ext_header = &((CSoundPlayer*)dwInstance)->m_hExtWaveHdr;
char *main_buff = ((CSoundPlayer*)dwInstance)->m_MainSndBuffer;
char *ext_buff = ((CSoundPlayer*)dwInstance)->m_ExtSndBuffer;
if ((WOM_DONE == uMsg) && ((CSoundPlayer*)dwInstance)->m_DoWriteBuffer)
{
if (!(((CSoundPlayer*)dwInstance)->m_LoopNumIsPlaying % 2)) // even
{
memset(main_buff, 0, PLAYING_SOUND_BUFF_SIZE);
MMRESULT res = waveOutWrite(hwo, main_header, sizeof(*main_header));
if (MMSYSERR_NOERROR != res) {
ShowError(res, "Error waveOutWrite");
};
}
else
{
memset(ext_buff, 0, PLAYING_SOUND_BUFF_SIZE);
MMRESULT res = waveOutWrite(hwo, ext_header, sizeof(*ext_header));
if (MMSYSERR_NOERROR != res) {
ShowError(res, "Error waveOutWrite");
};
}
((CSoundPlayer*)dwInstance)->m_LoopNumIsPlaying++;
((CSoundPlayer*)dwInstance)->m_PacketsCounter++;
if (((CSoundPlayer*)dwInstance)->m_PacketsCounter == 0)
((CSoundPlayer*)dwInstance)->GetNextPosition();
}
else
{
((CSoundPlayer*)dwInstance)->m_LoopNumIsPlaying += 0;
}
};
//-------------------------------------------------------------------------------------