📄 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 + -