📄 multimedia.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Multimedia.cpp
#include "stdafx.h"
#include "Multimedia.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
CMultimedia::CMultimedia()
{
m_pGraphBuilder = NULL;
m_pMediaControl = NULL;
m_pMediaEvent = NULL;
m_pBasicVideo = NULL;
m_pBasicAudio = NULL;
m_pVideoWindow = NULL;
m_pMediaSeeking = NULL;
m_dwObjectTableEntry = 0;
}
/////////////////////////////////////////////////////////////////////////////
//
CMultimedia::~CMultimedia()
{
Release();
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::Create(void)
{
if(!m_pGraphBuilder)
{
if(SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&m_pGraphBuilder)))
{
AddToObjectTable();
return QueryInterfaces();
}
m_pGraphBuilder = 0;
}
int err = GetLastError();
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::QueryInterfaces(void)
{
if(m_pGraphBuilder)
{
HRESULT hr = NOERROR;
hr |= m_pGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
hr |= m_pGraphBuilder->QueryInterface(IID_IMediaEventEx, (void **)&m_pMediaEvent);
hr |= m_pGraphBuilder->QueryInterface(IID_IBasicVideo, (void **)&m_pBasicVideo);
hr |= m_pGraphBuilder->QueryInterface(IID_IBasicAudio, (void **)&m_pBasicAudio);
hr |= m_pGraphBuilder->QueryInterface(IID_IVideoWindow, (void **)&m_pVideoWindow);
hr |= m_pGraphBuilder->QueryInterface(IID_IMediaSeeking, (void **)&m_pMediaSeeking);
if(m_pMediaSeeking)
{
m_pMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
}
return SUCCEEDED(hr);
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
void CMultimedia::Release(void)
{
if(m_pMediaSeeking)
{
m_pMediaSeeking->Release();
m_pMediaSeeking = NULL;
}
if(m_pMediaControl)
{
m_pMediaControl->Release();
m_pMediaControl = NULL;
}
if(m_pMediaEvent)
{
m_pMediaEvent->Release();
m_pMediaEvent = NULL;
}
if(m_pBasicVideo)
{
m_pBasicVideo->Release();
m_pBasicVideo = NULL;
}
if(m_pBasicAudio)
{
m_pBasicAudio->Release();
m_pBasicAudio = NULL;
}
if(m_pVideoWindow)
{
m_pVideoWindow->put_Visible(OAFALSE);
m_pVideoWindow->put_MessageDrain((OAHWND)NULL);
m_pVideoWindow->put_Owner(OAHWND(0));
m_pVideoWindow->Release();
m_pVideoWindow = NULL;
}
RemoveFromObjectTable();
if (m_pGraphBuilder)
{
m_pGraphBuilder->Release();
m_pGraphBuilder = NULL;
}
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::Attach(IGraphBuilder * inGraphBuilder)
{
Release();
//
if(inGraphBuilder)
{
inGraphBuilder->AddRef();
m_pGraphBuilder = inGraphBuilder;
AddToObjectTable();
return QueryInterfaces();
}
return true;
}
/////////////////////////////////////////////////////////////////////////////
//
IGraphBuilder * CMultimedia::GetGraph(void)
{
return m_pGraphBuilder;
}
/////////////////////////////////////////////////////////////////////////////
//
IMediaEventEx * CMultimedia::GetEventHandle(void)
{
return m_pMediaEvent;
}
/////////////////////////////////////////////////////////////////////////////
// Connect filter from the upstream output pin to the downstream input pin
bool CMultimedia::ConnectFilters(IPin * inOutputPin, IPin * inInputPin,
const AM_MEDIA_TYPE * inMediaType)
{
if(m_pGraphBuilder && inOutputPin && inInputPin)
{
HRESULT hr = m_pGraphBuilder->ConnectDirect(inOutputPin, inInputPin, inMediaType);
return SUCCEEDED(hr) ? true : false;
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
void CMultimedia::DisconnectFilters(IPin * inOutputPin)
{
if(m_pGraphBuilder && inOutputPin)
{
HRESULT hr = m_pGraphBuilder->Disconnect(inOutputPin);
}
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::SetDisplayWindow(HWND inWindow)
{
if(m_pVideoWindow)
{
// long lVisible;
// m_VideoWindow->get_Visible(&lVisible);
// Hide the video window first
m_pVideoWindow->put_Visible(OAFALSE);
m_pVideoWindow->put_Owner((OAHWND)inWindow);
RECT rcWindow;
::GetClientRect(inWindow, &rcWindow);
m_pVideoWindow->put_Left(0);
m_pVideoWindow->put_Top(0);
m_pVideoWindow->put_Width(399);//rcWindow.right - rcWindow.left);
m_pVideoWindow->put_Height(rcWindow.bottom - rcWindow.top/*-MP_BAR_HEIGHT*/);
m_pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
m_pVideoWindow->put_MessageDrain((OAHWND)inWindow);
// Restore the video window
if(inWindow != NULL)
{
// m_VideoWindow->put_Visible(lVisible);
m_pVideoWindow->put_Visible(OATRUE);
}
else
{
m_pVideoWindow->put_Visible(OAFALSE);
}
return true;
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::ResizeVideoWindow(long inLeft, long inTop, long inWidth, long inHeight)
{
if(m_pVideoWindow)
{
long lVisible = OATRUE;
m_pVideoWindow->get_Visible(&lVisible);
// Hide the video window first
m_pVideoWindow->put_Visible(OAFALSE);
m_pVideoWindow->put_Left(inLeft);
m_pVideoWindow->put_Top(inTop);
m_pVideoWindow->put_Width(inWidth);
m_pVideoWindow->put_Height(inHeight);
// Restore the video window
m_pVideoWindow->put_Visible(lVisible);
return true;
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::GetVideoSize(long &lWidth, long &lHeight)
{
if(m_pBasicVideo)
{
m_pBasicVideo->GetVideoSize(&lWidth, &lHeight);
return true;
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::SetNotifyWindow(HWND inWindow)
{
if(m_pMediaEvent)
{
m_pMediaEvent->SetNotifyWindow((OAHWND)inWindow, WM_MULTIMEDIA_NOTIFY, 0);
return true;
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
void CMultimedia::HandleEvent(WPARAM wParam, LPARAM lParam)
{
if(m_pMediaEvent)
{
LONG eventCode = 0, eventParam1 = 0, eventParam2 = 0;
while (SUCCEEDED(m_pMediaEvent->GetEvent(&eventCode, &eventParam1, &eventParam2, 0)))
{
m_pMediaEvent->FreeEventParams(eventCode, eventParam1, eventParam2);
switch (eventCode)
{
case EC_COMPLETE:
break;
case EC_USERABORT:
case EC_ERRORABORT:
break;
default:
break;
}
// only care about the eventCode now.
*((int*)wParam) = eventCode;
break;
}
}
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::Run(void)
{
if(m_pGraphBuilder && m_pMediaControl)
{
if(!IsRunning())
{
if(SUCCEEDED(m_pMediaControl->Run()))
{
return true;
}
}
else
{
return true;
}
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::Stop(void)
{
if(m_pGraphBuilder && m_pMediaControl)
{
if(!IsStopped())
{
if(SUCCEEDED(m_pMediaControl->Stop()))
{
return true;
}
}
else
{
return true;
}
}
return false;
}
/////////////////////////////////////////////////////////////////////////////
//
bool CMultimedia::Pause(void)
{
if(m_pGraphBuilder && m_pMediaControl)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -