⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 themci.cpp

📁 完整的MP3播放器源码
💻 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 + -