?? sound.cpp
字號:
//sound.cpp
#include<windows.h>
#include<dmusici.h>
#pragma comment(lib,"dxguid")
#pragma comment(lib,"strmiids")
IDirectMusicLoader8* pLoader=NULL;
IDirectMusicPerformance8* pPerf=NULL;
IDirectMusicSegment8* pSeg=NULL;
HWND hWnd1;
const int MAX_FILE_LENGTH=128;
WCHAR UnicodeFile[MAX_FILE_LENGTH];
MUSIC_TIME mtime;
#define CHECKERR(x) {if(FAILED(hr)){MessageBox(NULL,x,"err",MB_OK);return false;}}
void PAUSE()
{
pPerf->GetTime(NULL, &mtime);//得到暫停的位置
pPerf->Stop(NULL,//要停止的段,NULL表示全部段都停止
NULL,//段狀態
0,//多少時間后停止,0表示立即
0//標志
);
}
void PLAY()
{
pSeg->SetStartPoint(mtime);//播放點
pPerf->PlaySegmentEx(pSeg,
NULL,
NULL,
DMUS_SEGF_REFTIME,
0,
NULL,
NULL,
NULL
);
pSeg->SetStartPoint(0);
}
void REPLAY()
{
pPerf->PlaySegmentEx(pSeg,//要播放的段
NULL,//保留,必須為NULL
NULL,//pTransiton
0,//播放的標志
0,//開始的位置
NULL,//用與接收段狀態的指針,如果不需要,就為NULL
NULL,//使用默認
NULL//默認的AudioPath
);
}
void RELEASE()
{
pPerf->CloseDown();
pSeg->Release();
pPerf->Release();
pLoader->Release();
CoUninitialize();
EndDialog(hWnd1,0);
}
int INITSOUND()//HINSTANCE hInst,HINSTANCE hInstPrev,LPSTR lpCmdLine,int nCmdShow
{
HRESULT hr=CoInitialize(NULL);
CHECKERR("CoInitalize");
hr=CoCreateInstance(CLSID_DirectMusicLoader, //組件的GUID
NULL, //不是創建集合
CLSCTX_INPROC, //創建的環境
IID_IDirectMusicLoader8, //接口的GUID
(void**)&pLoader); //被創建的接口指針
CHECKERR("CoCreate pLoader");
hr=CoCreateInstance(CLSID_DirectMusicPerformance, //組件的GUID
NULL, //不是創建集合
CLSCTX_INPROC, //創建的環境
IID_IDirectMusicPerformance8, //接口的GUID
(void**)&pPerf); //被創建的接口指針
CHECKERR("CoCreate pPerf");
hr=pPerf->InitAudio(
NULL,//DirectMusic對象的指針,因為不需要我們管理,所以讓它自動進行
NULL,//DirectSound對象的指針,同上
hWnd1,//窗口句柄
DMUS_APATH_SHARED_STEREOPLUSREVERB,//聲音通道(AudioPath)類型:立體聲+混響
64, //音樂通道數
DMUS_AUDIOF_ALL, //聲卡的所有特性
NULL // DMUS_AUDIOPARAMS對象的指針
);
CHECKERR("Init Audio");
MultiByteToWideChar(
CP_ACP,//ASCII碼
0,//
"test.mid",//要轉換的ascii字符串
-1,//要轉換的字節數,-1表示以'\0'結尾的字符串
UnicodeFile,//轉換后UNICODE存放的地方
MAX_FILE_LENGTH);
pLoader->LoadObjectFromFile(
CLSID_DirectMusicSegment, //組件的GUID
IID_IDirectMusicSegment8, //接口的GUID
UnicodeFile,//文件名,注意用Unicode
(void**)&pSeg//音樂要裝到的段
);
int looptimes=1;
pSeg->SetRepeats(looptimes); //重復的次數,如果是DMUS_SEG_REPEAT_INFINITE則為無限
pSeg->Download( pPerf );//使用DLS,把MID數據轉換成數字化的音樂數據
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -