它是使用DirectShow播放MP3的封装类,要使用该功能,您需要安装DirectMedia SDK,你可以随便使用该代码,希望对您有用。

该封装类只有一个文件:mp3.h,源代码如下:

// MP3.h

#include

#include

#include

class Mp3

{

private:

IBaseFilter * pif;

IGraphBuilder * pigb;

IMediaControl * pimc;

IMediaEventEx * pimex;

bool ready;

public:

Mp3();

~Mp3();

void Load(LPSTR filename);

void Cleanup();

void Play();

void Pause();

void Stop();

};

// MP3.cpp

#include "Mp3.h"

Mp3::Mp3()

{

pif = NULL;

pigb = NULL;

pimc = NULL;

pimex = NULL;

ready = false;

CoInitialize(NULL);

}

Mp3::~Mp3()

{

Cleanup();

}

void Mp3::Cleanup()

{

CoUninitialize();

if (pimc)

pimc->Stop();

if(pif)

{

pif->Release();

pif = NULL;

}

if(pigb)

{

pigb->Release();

pigb = NULL;

}

if(pimc)

{

pimc->Release();

pimc = NULL;

}

if(pimex)

{

pimex->Release();

pimex = NULL;

}

}

void Mp3::Load(LPSTR szFile)

{

WCHAR wFile[MAX_PATH];

MultiByteToWideChar(CP_ACP, 0, szFile, -1, wFile, MAX_PATH);

if (SUCCEEDED(CoCreateInstance( CLSID_FilterGraph,

NULL,

CLSCTX_INPROC_SERVER,

IID_IGraphBuilder,

(void **)&this->pigb)))

{

pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);

pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);

if (SUCCEEDED(pigb->RenderFile(wFile, NULL)))

{

ready = true;

}

}

}

void Mp3::Play()

{

if (ready)

{

pimc->Run();

}

}

void Mp3::Pause()

{

if (ready)

{

pimc->Pause();

}

}

void Mp3::Stop()

{

if (ready)

{

pimc->Stop();

}

}

//Alan

//-----

//alankemp@

来源:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐