📄 player.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 + -