Release();(p)=NULL;}}#defineV_RETURN(x){hr=x;" />

用C语言编写的MP3简易播放程序

#include
#include
#include
#include
#include
#include

#pragma comment( lib, "Strmiids.lib")
#pragma comment( lib, "winmm.lib" )

#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
#define V_RETURN(x) { hr = x; if( FAILED(hr) ) { return hr; } }
//////////////////////////////////////////////////////////////////////////
//变量定义:
IGraphBuilder* pGBuilder;
IMediaControl* pMControl;
IMediaPosition* pMPos;

//////////////////////////////////////////////////////////////////////////
HRESULT InitDirectShow()
{
HRESULT hr;

CoInitialize(NULL); //初始化COM
//创建各个对象
CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC, IID_IGraphBuilder, (void**)&pGBuilder);
V_RETURN(pGBuilder->QueryInterface(IID_IMediaControl, (void**)&pMControl));
V_RETURN(pGBuilder->QueryInterface(IID_IMediaPosition, (void**)&pMPos));
return S_OK;
}

HRESULT LoadMusicFile( char *path)
{
HRESULT hr;

CHAR strSoundPath[MAX_PATH]; //存储音乐所在路径
WCHAR wstrSoundPath[MAX_PATH]; //存储UNICODE形式的路径
strcpy(strSoundPath, path);
MultiByteToWideChar(CP_ACP, 0, strSoundPath, -1,wstrSoundPath, MAX_PATH);
V_RETURN(pGBuilder->RenderFile(wstrSoundPath, NULL)); //调入文件
return S_OK;
}

HRESULT Play()
{
HRESULT hr;

//播放MP3的方法十分简单:
V_RETURN(pMPos->put_CurrentPosition(0)); //移动到文件头
V_RETURN(pMControl->Run()); //播放
return S_OK;
}

HRESULT Stop()
{
HRESULT hr;

//最后,我们要停止播放音乐并释放各个对象:
V_RETURN(pMControl->Stop()); //停止播放
return S_OK;
}

void FreeDirectShow()
{
//释放对象
SAFE_RELEASE(pMControl);
SAFE_RELEASE(pMPos);
SAFE_RELEASE(pGBuilder);
CoUninitialize(); //释放COM
}

//////////////////////////////////////////////////////////////////////////
int main()
{
char cmd[255] = {NULL}, path[MAX_PATH] = {NULL};
if(FAILED(InitDirectShow()))
{
printf("初始化DirectShow失败!\n");
getch();
return 1;
}
while(1)
{
system("cls");
printf("程序修改者:李雷阳\n");
printf("使用方法--输入以下命令:\n#载入并播放音乐: p\n#停止播放: s\n#播放: r\n");
printf("#退出: e\n");
if(path[0])printf("\n已经载入的文件:%s\n", path);
printf("\n请输入命令:");
scanf("%s", cmd);
if(!stricmp(cmd, "p"))
{

printf("(注意:文件名后面要有相应文件类型后缀,例如:说好的幸福呢.mp3)\n");
printf("请输入文件名:");
scanf("%s", path);
printf("正在处理命令...\n", cmd, path);
if(FAILED(LoadMusicFile(path)))
{
printf("载入文件“%s”失败!\n", path);
getch();
path[0] = 0;
}
else Play();
}
else
{
printf("正在处理命令...\n", cmd, path);
if(!stricmp(cmd, "r"))
{
Stop();

Play();
}
else if(!stricmp(cmd, "s"))
Stop();
else if(!stricmp(cmd, "e"))
goto quit;
else
{
printf("无法识别的命令");
getch();
}
}
}
quit:
FreeDirectShow();
return 0;
}

相关文档
最新文档