|
/******************************************************************************
* 定义宏模块 *
******************************************************************************/
#define MEDIAPLAYDLL_API _declspec(dllexport)
/******************************************************************************
* 头文件加载模块(头文件的加载顺序不能改变) *
******************************************************************************/
#include "stdafx.h"
#include
#include
#include
#include "MediaPlay.h"
#include "macdefine.h"
/******************************************************************************
* 全局变量定义模块 *
******************************************************************************/
// 当前播放状态
enum PLAYSTATE { psRUNNING, psPAUSED, psSTOPPED};
// Filter Graph组件接口
IGraphBuilder* ipGraBuilder = NULL;
// 播放控制接口
IMediaControl* ipMedControl = NULL;
// 随机定位接口
IMediaEventEx* ipMedEventEx = NULL;
// 视频相关接口
IVideoWindow* ipVidWindow = NULL;
IBasicVideo* ipBasVideo = NULL;
// 音频相关接口
IBasicAudio* ipBasAudio = NULL;
// IMediaEventEx接口,让应用程序及时处理Filter Graph Manager发出的事件
IMediaSeeking* ipMedSeeking = NULL;
// 播放的媒体文件是否仅有音频,初始化为否
bool g_bAudioOnly = false;
// 当前媒体文件的播放状态,初始化为"停止"
PLAYSTATE g_psCurrent=psSTOPPED;
// 增加 减少 音量时的基准音量,初始化为最大音量
int g_iBenchSound = MAX_SOUND;
/******************************************************************************
* 主函数实现模块 *
******************************************************************************/
/******************************************************************************
* 函数名称: DllMain() *
* 功能描述: 动态链接库的入口函数 *
* 输入参数: hModule 动态链接库的句柄 *
* ul_reason_for_call 动态链接库被调用的原因 *
* lpReserved 动态链接库初始化和释放的标记 *
* 输出参数: 无 *
* 返 回 值: true 成功 *
* false 失败 *
******************************************************************************/
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
// 初始化COM库
if(FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
RETAILMSG(1, (TEXT("CoInitialize Failed!\r\n")));
return false;
}
}
if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
// 卸载COM库
CoUninitialize();
}
return true;
}
/******************************************************************************
* 导出函数实现模块 *
******************************************************************************/
/******************************************************************************
* 函数名称: InitInterface() *
* 功能描述: 使用DirectShow播放媒体文件第一步:初始化DirectShow媒体播放接口 *
* 输入参数: lpFile 媒体文件的全路径( 包括扩展名) *
* 输出参数: 无 *
* 返 回 值: S_OK 初始化成功 *
* 非S_OK 初始化失败,无法播放此文件 *
******************************************************************************/
HRESULT InitInterface(LPTSTR lpFile)
{
int iFileLen = _tcslen(lpFile);
// 媒体文件路径不能为空
assert(iFileLen!=0);
TCHAR wFile[MAX_PATH];
HRESULT hr;
#ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0, lpFile, -1, wFile, MAX_PATH);
#else
if (iFileLen < MAX_PATH)
{
lstrcpy(wFile, lpFile);
}
else
{
return E_FAIL;
}
#endif
// 创建一个Filter Graph组件
JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&ipGraBuilder));
if (SUCCEEDED(hr))
{
// 使用智能链接构建Filter Graph
JIF(ipGraBuilder->RenderFile(wFile, NULL));
// 得到播放控制接口和随机定位接口
JIF(ipGraBuilder->QueryInterface(IID_IMediaControl, (void **)&ipMedControl));
JIF(ipGraBuilder->QueryInterface(IID_IMediaEventEx, (void **)&ipMedEventEx));
// 得到IMediaEventEx接口,以便让应用程序及时处理Filter Graph Manager发出的事件
JIF(ipGraBuilder->QueryInterface(IID_IMediaSeeking, (void **)&ipMedSeeking));
// 得到视频相关接口
JIF(ipGraBuilder->QueryInterface(IID_IVideoWindow, (void **)&ipVidWindow));
JIF(ipGraBuilder->QueryInterface(IID_IBasicVideo, (void **)&ipBasVideo));
// 得到音频相关接口
JIF(ipGraBuilder->QueryInterface(IID_IBasicAudio, (void **)&ipBasAudio));
}
return hr;
}
|
|