今天给各位分享本地上传音乐网站源码分享的知识,其中也会对上传歌曲网站进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
我在开发《518抽奖软件》的时候,需要播放音效,渲染氛围。开始用了一些dshow组件,只是播放少数几种音乐,到后来换到bass.lib可以支持绝大多数音乐格式,而且用起来挺流畅稳定。具体代码和组件如下。
basslib部分,你可网上搜索“DC-BassSourceMod1.5.2.1”,下载后解压缩就包含了所有组件dll。然后把这些放在软件所在文件夹里即可。
dshow部分主要是一个类的源码,当然到商业软件的话,要有更详细的地方,例如wma的播放需要的组件。下面只给出最基本的源码:
头文件h
classMuzGraph
{
public:
MuzGraph();
~MuzGraph();
HRESULTbuild(constWCHAR*file,HWNDhwnd,LONGmsg,LONGmsgData,constWCHAR*dev);
private:
HRESULTbuild_bass(constWCHAR*file,HWNDhwnd,LONGmsg,LONGmsgData,constWCHAR*dev);
HRESULTbuild_wma(constWCHAR*file,HWNDhwnd,LONGmsg,LONGmsgData,constWCHAR*dev);
public:
HRESULTrun();
voidpause();
voidstop();
intgetLength();
intgetPos();
voidsetPos(intpos);
boolisEnd();
voidsetTimeFormat();
voidsetVolume(intvolume);
public:
WCHARm_file[MAX_PATH];
IMediaEventEx*m_pME;
IGraphBuilder*m_pGB;
IMediaControl*m_pMC;
IMediaSeeking*m_pMS;
private:
BOOLm_bBuilded;
IBasicAudio*m_pBA;
//DCBassSourceMod.ax
IBaseFilter*m_source;
IBaseFilter*m_renderer;
//CLSID_WMAsfReaderCLSID_CWMADecMediaObject
IBaseFilter*m_wmaSource;
IBaseFilter*m_wmaDec;
};
?
CPP文件
MuzGraph::MuzGraph()
{
memset(m_file,0,sizeof(m_file));
m_bBuilded=FALSE;
m_pGB=0;
m_pMC=0;
m_pME=0;
m_pMS=0;
m_pBA=0;
m_source=m_renderer=0;
m_wmaSource=m_wmaDec=0;
}
MuzGraph::~MuzGraph()
{
if(m_bBuilded)
{
m_pME->SetNotifyWindow(NULL,0,0);
if(m_source)m_pGB->RemoveFilter(m_source);
if(m_renderer)m_pGB->RemoveFilter(m_renderer);
if(m_wmaSource)m_pGB->RemoveFilter(m_wmaSource);
if(m_wmaDec)m_pGB->RemoveFilter(m_wmaDec);
if(m_source)m_source->Release();
if(m_renderer)m_renderer->Release();
if(m_wmaSource)m_wmaSource->Release();
if(m_wmaDec)m_wmaDec->Release();
m_pMC->Release();
m_pME->Release();
m_pMS->Release();
m_pBA->Release();
m_pGB->Release();
m_bBuilded=FALSE;
}
}
HRESULTMuzGraph::run()
{
returnm_pMC->Run();
}
voidMuzGraph::pause()
{
HRESULThr;
hr=m_pMC->Pause();
}
voidMuzGraph::stop()
{
HRESULThr;
hr=m_pMC->Stop();
}
intMuzGraph::getPos()
{
HRESULThr;
LONGLONGpos=0;
hr=m_pMS->GetCurrentPosition(&pos);
return(pos/10/1000);
}
voidMuzGraph::setPos(intpos)
{
HRESULThr;
if(pos<0)pos=0;
elseif(pos>getLength())pos=getLength();
LONGLONGcurPos=(LONGLONG)pos*10*1000;//!!
hr=m_pMS->SetPositions(&curPos,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning);
}
intMuzGraph::getLength()
{
LONGLONGnowPos=0;
LONGLONGendPos=0;
m_pMS->GetPositions(&nowPos,&endPos);
return(endPos/10/1000);
}
boolMuzGraph::isEnd()
{
LONGLONGnowPos=0;
LONGLONGendPos=0;
m_pMS->GetPositions(&nowPos,&endPos);
return(nowPos>=endPos);
}
voidMuzGraph::setTimeFormat()
{
HRESULThr;
hr=m_pMS->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
}
voidMuzGraph::setVolume(intvolume)
{
HRESULThr;
hr=m_pBA->put_Volume(volume);
}
staticHRESULTFS_Load(IFileSourceFilter*pFS,constWCHAR*file)
{
HRESULThr=E_FAIL;
__try{hr=pFS->Load(file,NULL);}
__except(EXCEPTION_EXECUTE_HANDLER){;}
returnhr;
}
HRESULTMuzGraph::build(constWCHAR*file,HWNDhwnd,LONGmsg,LONGmsgData,constWCHAR*dev)
{
HRESULThr_bass=build_bass(file,hwnd,msg,msgData,dev);
if(!FAILED(hr_bass))
returnhr_bass;
HRESULThr_wma=build_wma(file,hwnd,msg,msgData,dev);
if(!FAILED(hr_wma))
returnhr_wma;
returnhr_bass;
}
HRESULTMuzGraph::build_bass(constWCHAR*file,HWNDhwnd,LONGmsg,LONGmsgData,constWCHAR*dev)
{
HRESULThr=NOERROR;
IPin*o_source=0;
IPin*i_renderer=0;
lstrcpy(m_file,file);
//——————————————————————–
hr=CoCreateInstance(CLSID_FilterGraph,0,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGB);
if(!m_pGB)
gotoFAIL;
m_pGB->QueryInterface(IID_IMediaControl,(void**)&m_pMC);
m_pGB->QueryInterface(IID_IMediaEventEx,(void**)&m_pME);
m_pGB->QueryInterface(IID_IMediaSeeking,(void**)&m_pMS);
//——————————————————————–
m_renderer=g_app.get_renderer(dev);
if(!m_renderer)
{
if(_wcsicmp(dev,DEF_DEV)!=0)
m_renderer=g_app.get_renderer(DEF_DEV);
if(!m_renderer)
{
hr=0x80040256;//无法播放音频流:没有音频硬件,或硬件不响应。
gotoFAIL;
}
}
//——————————————————————–
//0x80070002:系统找不到指定的文件
m_source=g_app.get_source();
if(!m_source){hr=E_FAIL;gotoFAIL;}
IFileSourceFilter*pFS=NULL;
hr=m_source->QueryInterface(IID_IFileSourceFilter,(void**)&pFS);
if(!pFS)gotoFAIL;
if(PathFileExists(file)&&!PathIsDirectory(file))
Tfuns::open_perm(file);
hr=FS_Load(pFS,file);
pFS->Release();
if(FAILED(hr))gotoFAIL;
//——————————————————————–
hr=m_pGB->AddFilter(m_source,L”source”);
if(FAILED(hr))gotoFAIL;
hr=m_pGB->AddFilter(m_renderer,L”renderer”);
if(FAILED(hr))gotoFAIL;
o_source=Tfuns::getPinByIndex(m_source,PINDIR_OUTPUT,0);
if(!o_source){hr=E_FAIL;gotoFAIL;}
i_renderer=Tfuns::getPinByIndex(m_renderer,PINDIR_INPUT,0);
if(!i_renderer){hr=E_FAIL;gotoFAIL;}
hr=m_pGB->ConnectDirect(o_source,i_renderer,0);
if(FAILED(hr))gotoFAIL;
o_source->Release();
o_source=0;
i_renderer->Release();
i_renderer=0;
//——————————————————————–
hr=m_pGB->QueryInterface(IID_IBasicAudio,(void**)&m_pBA);
m_pME->SetNotifyWindow((OAHWND)hwnd,msg,msgData);
m_bBuilded=TRUE;
returnNOERROR;
FAIL:
if(o_source){
o_source->Release();
o_source=0;
}
if(i_renderer){
i_renderer->Release();
i_renderer=0;
}
if(m_source){
m_pGB->RemoveFilter(m_source);
m_source->Release();
m_source=0;
}
if(m_renderer){
m_pGB->RemoveFilter(m_renderer);
m_renderer->Release();
m_renderer=0;
}
if(m_pMC){
m_pMC->Release();
m_pMC=0;
}
if(m_pME){
m_pME->Release();
m_pME=0;
}
if(m_pMS){
m_pMS->Release();
m_pMS=0;
}
if(m_pGB){
m_pGB->Release();
m_pGB=0;
}
returnhr;
}
HRESULTMuzGraph::build_wma(constWCHAR*file,HWNDhwnd,LONGmsg,LONGmsgData,constWCHAR*dev)
{
HRESULThr=NOERROR;
IPin*o_source=0;
IPin*i_dec=0;
IPin*o_dec=0;
IPin*i_renderer=0;
lstrcpy(m_file,file);
//——————————————————————–
hr=CoCreateInstance(CLSID_FilterGraph,0,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGB);
if(!m_pGB)
gotoFAIL;
m_pGB->QueryInterface(IID_IMediaControl,(void**)&m_pMC);
m_pGB->QueryInterface(IID_IMediaEventEx,(void**)&m_pME);
m_pGB->QueryInterface(IID_IMediaSeeking,(void**)&m_pMS);
//——————————————————————–
m_renderer=g_app.get_renderer(dev);
if(!m_renderer)
{
if(_wcsicmp(dev,DEF_DEV)!=0)
m_renderer=g_app.get_renderer(DEF_DEV);
if(!m_renderer)
{
hr=0x80040256;//无法播放音频流:没有音频硬件,或硬件不响应。
gotoFAIL;
}
}
//——————————————————————–
hr=CoCreateInstance(CLSID_WMAsfReader,0,CLSCTX_INPROC,IID_IBaseFilter,(void**)&m_wmaSource);
if(FAILED(hr))gotoFAIL;
hr=CoCreateInstance(CLSID_DMOWrapperFilter,0,CLSCTX_INPROC,IID_IBaseFilter,(void**)&m_wmaDec);
if(FAILED(hr))gotoFAIL;
IDMOWrapperFilter*pWrapper=NULL;
hr=m_wmaDec->QueryInterface(IID_IDMOWrapperFilter,(void**)&pWrapper);
if(!pWrapper)gotoFAIL;
hr=pWrapper->Init(CLSID_WMAudioDecoderDMO,CLSID_LegacyAmFilterCategory);
pWrapper->Release();
if(FAILED(hr))gotoFAIL;
IFileSourceFilter*pFS=NULL;
hr=m_wmaSource->QueryInterface(IID_IFileSourceFilter,(void**)&pFS);
if(!pFS)gotoFAIL;
if(PathFileExists(file)&&!PathIsDirectory(file))
Tfuns::open_perm(file);
hr=FS_Load(pFS,file);
pFS->Release();
if(FAILED(hr))gotoFAIL;
//——————————————————————–
hr=m_pGB->AddFilter(m_wmaSource,L”wmaSource”);
if(FAILED(hr))gotoFAIL;
hr=m_pGB->AddFilter(m_wmaDec,L”wmaDec”);
if(FAILED(hr))gotoFAIL;
hr=m_pGB->AddFilter(m_renderer,L”renderer”);
if(FAILED(hr))gotoFAIL;
o_source=Tfuns::getPinByIndex(m_wmaSource,PINDIR_OUTPUT,0);
if(!o_source){hr=E_FAIL;gotoFAIL;}
i_dec=Tfuns::getPinByIndex(m_wmaDec,PINDIR_INPUT,0);
if(!i_dec){hr=E_FAIL;gotoFAIL;}
o_dec=Tfuns::getPinByIndex(m_wmaDec,PINDIR_OUTPUT,0);
if(!o_dec){hr=E_FAIL;gotoFAIL;}
i_renderer=Tfuns::getPinByIndex(m_renderer,PINDIR_INPUT,0);
if(!i_renderer){hr=E_FAIL;gotoFAIL;}
hr=m_pGB->ConnectDirect(o_source,i_dec,0);
if(FAILED(hr))gotoFAIL;
hr=m_pGB->ConnectDirect(o_dec,i_renderer,0);
if(FAILED(hr))gotoFAIL;
o_source->Release();
o_source=0;
i_dec->Release();
i_dec=0;
o_dec->Release();
o_dec=0;
i_renderer->Release();
i_renderer=0;
//——————————————————————–
hr=m_pGB->QueryInterface(IID_IBasicAudio,(void**)&m_pBA);
m_pME->SetNotifyWindow((OAHWND)hwnd,msg,msgData);
m_bBuilded=TRUE;
returnNOERROR;
FAIL:
if(o_source){
o_source->Release();
o_source=0;
}
if(i_dec){
i_dec->Release();
i_dec=0;
}
if(o_dec){
o_dec->Release();
o_dec=0;
}
if(i_renderer){
i_renderer->Release();
i_renderer=0;
}
if(m_wmaSource){
m_pGB->RemoveFilter(m_wmaSource);
m_wmaSource->Release();
m_wmaSource=0;
}
if(m_wmaDec){
m_pGB->RemoveFilter(m_wmaDec);
m_wmaDec->Release();
m_wmaDec=0;
}
if(m_renderer){
m_pGB->RemoveFilter(m_renderer);
m_renderer->Release();
m_renderer=0;
}
if(m_pMC){
m_pMC->Release();
m_pMC=0;
}
if(m_pME){
m_pME->Release();
m_pME=0;
}
if(m_pMS){
m_pMS->Release();
m_pMS=0;
}
if(m_pGB){
m_pGB->Release();
m_pGB=0;
}
returnhr;
}
关于本地上传音乐网站源码分享到此分享完毕,希望能帮助到您。
