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

📄 multimedia.cpp

📁 EVC环境下用SDK开发WINCE的应用程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
// 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 + -