📄 themci.cpp
字号:
#include "stdafx.h"
#include "TheMci.h"
/////////////////////////////////////////////////////////////////////////////
// CTheMci
HANDLE CTheMci::m_hEvent = 0; // casllback event
//
#define SWAP(x,y) ((x)^=(y)^=(x)^=(y))
void CALLBACK CTheMci::CallBackNoty(HWAVEOUT hWo, UINT uMsg,
DWORD dwInstance,
DWORD dwwParam,
DWORD dwlParam)
{
if(WOM_DONE == uMsg)
{
if(dwwParam)
{
LPWAVEHDR lpWaveHdr = (LPWAVEHDR) dwwParam;
waveOutUnprepareHeader(hWo, lpWaveHdr, sizeof(WAVEHDR));
SetEvent(CTheMci::m_hEvent);
}
}
}
BOOL CTheMci::Open(DWORD nFreq,
DWORD nChannels,
HWND notyMsg,
int nMsg,
DWORD nSampleLength,
int buffSize,
int nBuffers)
{
m_nBufs = 3;
BOOL bAllALocated = TRUE;
for(int i=0; i < 3;i++)
{
m_pWav[i] = new WAVEHDR;
memset(m_pWav[i],0,sizeof(WAVEHDR));
m_pWav[i]->lpData = new char[buffSize+20000];
if(m_bMode)
m_pWav[i]->dwFlags = nFreq;
bAllALocated &= (0 != m_pWav[i]->lpData);
}
if(!bAllALocated)
{
return FALSE;
}
m_bufSize = buffSize;
m_active = 0;
m_startGap = 0;
m_length = 0;
m_fex.wFormatTag = WAVE_FORMAT_PCM;
m_fex.wBitsPerSample = (WORD)nSampleLength;
m_fex.nChannels = 2;//(WORD)nChannels == 3 ? 1 : 2;
m_fex.nSamplesPerSec = nFreq;
m_fex.nAvgBytesPerSec = m_fex.nChannels * nFreq * 2 ;
m_fex.nBlockAlign = (WORD)(m_fex.nChannels * 2);
m_hEvent = CreateEvent(0,0,0,0);
if (MMSYSERR_NOERROR != waveOutOpen(&m_hwOut, WAVE_MAPPER,
(const tWAVEFORMATEX *) &m_fex,
(DWORD) CallBackNoty,
NULL, WAVE_ALLOWSYNC | CALLBACK_FUNCTION))
{
return TRUE;
}
// TRACE("MCi::Open\r\n");
return TRUE;
}
BYTE* CTheMci::GetBufferPtr(DWORD* nLength)
{
*nLength = m_bufSize/2;
return (BYTE*)m_pWav[2]->lpData;
}
BYTE* CTheMci::SingAndRetNextBuff(DWORD *pBytesToPlay)
{
size_t siz = sizeof(WAVEHDR);
int bytes = *pBytesToPlay<<1;
*pBytesToPlay = 0;
if(m_startGap > 1)
{
m_pWav[2]->dwBufferLength = bytes;
waveOutPrepareHeader(m_hwOut,m_pWav[2],siz);
waveOutWrite(m_hwOut, m_pWav[2], siz);
m_pWav[2]->dwUser = 1;
LPWAVEHDR temp = m_pWav[2];
m_pWav[2] = m_pWav[1];
m_pWav[1] = m_pWav[0];
m_pWav[0] = temp;
if(m_pWav[2]->dwUser)
WaitForSingleObject(m_hEvent,10000);
}
else
{
if(++m_startGap == 2)
{
m_pWav[0]->dwBufferLength = bytes;
waveOutPrepareHeader(m_hwOut,m_pWav[0],siz);
waveOutWrite(m_hwOut, m_pWav[0], siz);
m_pWav[0]->dwUser = 1;
LPWAVEHDR temp = m_pWav[2];
m_pWav[2] = m_pWav[1];
m_pWav[1] = m_pWav[0];
m_pWav[0] = temp;
m_pWav[0]->dwBufferLength = bytes;
waveOutPrepareHeader(m_hwOut,m_pWav[0],siz);
waveOutWrite(m_hwOut, m_pWav[0], siz);
m_pWav[0]->dwUser = 1;
}
else
{
LPWAVEHDR temp = m_pWav[2];
m_pWav[2] = m_pWav[1];
m_pWav[1] = m_pWav[0];
m_pWav[0] = temp;
}
}
return (BYTE*)m_pWav[2]->lpData;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -