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

📄 player.cpp

📁 一款用与WINCE.0下播放MP3的播放软件,可以播放多中音频文件
💻 CPP
字号:
//#include "StdAfx.h"
#include <streams.h>
#include <initguid.h>
#include <strmif.h>
#include <control.h>

#include "player.h"

#define WM_GRAPHNOTIFY  WM_USER+13
#define ONE_SECOND 10000000


CPlayer::CPlayer(void)
{
	ghApp =0;

	pGraph = NULL;
	pMC = NULL;
	pBA = NULL;
	pMS = NULL;
	pMP = NULL;
	pME = NULL;

	play_state = STATE_STOP;
}
int CPlayer::Initialize(HWND wndplay,TCHAR *name)
{
//	LONG lWidth,lHeight;

	hr = S_OK;

	m_bFullscreen = FALSE;
	CoInitialize(NULL);

    JIF(CoCreateInstance(CLSID_FilterGraph, NULL,  CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph));
    JIF(pGraph->QueryInterface(IID_IMediaControl,  (void **)&pMC));

    // Build the graph. (IMPORTANT: Change string to a file on your system.)

    JIF(pGraph->QueryInterface(IID_IBasicAudio,    (void **)&pBA));
    JIF(pMC->QueryInterface(IID_IMediaSeeking,  (void **)&pMS));
    JIF(pGraph->QueryInterface(IID_IMediaPosition,  (void **)&pMP));
    JIF(pGraph->QueryInterface(IID_IMediaEventEx,  (void **)&pME));
	
	JIF(pGraph->RenderFile(name, NULL));

	play_state = STATE_INIT;

	return hr;
}

void CPlayer::release()
{
	DeleteFilters();
	SAFE_RELEASE(pGraph);
	SAFE_RELEASE(pMC);
    SAFE_RELEASE(pBA);
	SAFE_RELEASE(pMS);
	SAFE_RELEASE(pMP);
	SAFE_RELEASE(pME);

	play_state = STATE_RELEASE;	
	CoUninitialize();
}

void CPlayer::DeleteFilters()
{
	if (!pGraph)
		return;
	
	// -- Delete other filters
	HRESULT        hr = E_FAIL;
	FILTER_INFO    fiInfo;
	IEnumFilters*  pFilterEnum = NULL;
	
	hr = pGraph->EnumFilters(&pFilterEnum);
	if (FAILED(hr))
		return;
	
	int nFilterCount= 0;
	int nPos		= 0;
	

	while (S_OK == pFilterEnum->Skip(1)) {
		nFilterCount++;
	}
	
	IBaseFilter **ppFilters = reinterpret_cast<IBaseFilter **> (_alloca(sizeof(IBaseFilter*)*nFilterCount ) );
	pFilterEnum->Reset();
	
	while (S_OK == pFilterEnum->Next(1, &(ppFilters[nPos++]), NULL));
	SAFE_RELEASE(pFilterEnum);
	
	for (nPos = 0; nPos < nFilterCount; nPos++) {
		ppFilters[nPos]->QueryFilterInfo(&fiInfo);
// 		char name[80];
// 		WideCharToMultiByte(CP_ACP, 0, fiInfo.achName, -1, name, 80, NULL, NULL);
// 		printf("DeleteFilters() - %s\r\n", name);
// 		
		ULONG r1=ppFilters[nPos]->AddRef();
		ULONG r2=ppFilters[nPos]->Release();
		
		pGraph->RemoveFilter(ppFilters[nPos]);
		SAFE_RELEASE(ppFilters[nPos]);
	}
}

HRESULT CPlayer::play()
{
    HRESULT hr=S_OK;

	if(play_state != STATE_PAUSE)
	{
		REFERENCE_TIME     pos =0;   
		
		JIF(pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
			NULL, AM_SEEKING_NoPositioning));
	}
	
	JIF(pMC->Run());

	play_state = STATE_PLAY;

	return S_OK;
}

HRESULT CPlayer::pause()
{
	if(pMC)
	{
		JIF(pMC->Pause());
	
		play_state = STATE_PAUSE;
	}
	return S_OK;
}


HRESULT CPlayer::stop()
{
	LONGLONG pos=0;
	
	if(pMC)
	{
		JIF(pMC->Stop());

		play_state = STATE_STOP;

		JIF(pMS->SetPositions(&pos,   AM_SEEKING_AbsolutePositioning,
			NULL,   AM_SEEKING_NoPositioning));
	}	
	return S_OK;
}

HRESULT CPlayer::checkautostop()
{
	LONG evCode, evParam1, evParam2;
    HRESULT hr=S_OK;
	
    // Make sure that we don't access the media event interface
    // after it has already been released.
    if (!pME)
        return S_OK;
	
	if(SUCCEEDED(pME->GetEvent(&evCode, (LONG_PTR *) &evParam1,
		(LONG_PTR *) &evParam2, 0)))
    {
        // If this is the end of the clip, reset to beginning
        if(EC_COMPLETE == evCode)
        {
            LONGLONG pos=0;
			//printf("HandleGraphEvent  (EC_COMPLETE == evCode) \n");
			play_state = STATE_INIT;
			
			//release();
			// printf("HandleGraphEvent release \n");
        }
    }
	return S_OK;
}

HRESULT   CPlayer::GetMediaDuration(REFTIME&   llMediaLength) 
{ 
	llMediaLength = -1;

	JIF(pMP->get_Duration(&llMediaLength)); 
	
	return   S_OK; 
}

HRESULT   CPlayer::GetMediaCurrPos(REFTIME&   llMediaLength) 
{ 
	llMediaLength = -1;

	JIF(pMP->get_CurrentPosition(&llMediaLength));
	
	return   S_OK; 
} 

HRESULT   CPlayer::SetMediaPos(REFTIME   llMediaPos) 
{ 
	HRESULT   hr; 
	
	// first pause,then set position 
	hr = pause(); 
	if(hr   ==   S_OK) 
	{ 
		JIF(pMP->put_CurrentPosition(llMediaPos)); 
	} 
	else 
	{ 
		return   S_FALSE; 
	} 
	
	// begin play
	hr = play(); 
	if(hr!=S_OK) 
	{ 
		return   S_FALSE; 
	} 
	
	return   hr; 
} 
HRESULT   CPlayer::SetVolume(LONG lVolume) 
{
	HRESULT   hr; 
	hr = pBA->put_Volume(lVolume);
	return hr;
}

void Msg(TCHAR *szFormat, ...)
{
#if 0
    TCHAR szBuffer[1024];  // Large buffer for long filenames or URLs
    const size_t NUMCHARS = sizeof(szBuffer) / sizeof(szBuffer[0]);
    const int LASTCHAR = NUMCHARS - 1;
	
    // Format the input string
    va_list pArgs;
    va_start(pArgs, szFormat);
	
    // Use a bounded buffer size to prevent buffer overruns.  Limit count to
    // character size minus one to allow for a NULL terminating character.
    _vsntprintf(szBuffer, NUMCHARS - 1, szFormat, pArgs);
    va_end(pArgs);
	
    // Ensure that the formatted string is NULL-terminated
    szBuffer[LASTCHAR] = TEXT('\0');
	
    // Display a message box with the formatted string
    MessageBox(NULL, szBuffer, TEXT("Video player"), MB_OK);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -