📄 fsmidi.cpp
字号:
// FsMidi.cpp: implementation of the CFsMidi class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FsMidi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFsMidi::CFsMidi(): CMIDI()
{
m_hBufferReturnEvent = ::CreateEvent(0, FALSE, FALSE, TEXT("Wait For Buffer Return"));
ASSERT(m_hBufferReturnEvent != 0);
}
CFsMidi::~CFsMidi()
{
Stop(FALSE);
if(m_hBufferReturnEvent)
::CloseHandle(m_hBufferReturnEvent);
}
// Operation
DWORD CFsMidi::PlayMidi(HWND hwnd,char* MidiFile)
{
// 开启MIDI的硬件设备,我们使用一般内定值
mciOpenParms.lpstrDeviceType = "sequencer";
// 这个参数就是要播放的MIDI文件名
CString sPath;
GetModuleFileDir(sPath);
sPath += MidiFile;
mciOpenParms.lpstrElementName = (LPCSTR)sPath;
//mciOpenParms.lpstrElementName = IDR_MIDI_BK;
// 使用Message的方式来播放MIDI而不是STRING的方式
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &mciOpenParms))
return (dwReturn);
// The device opened successfully; get the device ID.
wDeviceID = mciOpenParms.wDeviceID;
// Check if the output port is the MIDI mapper.
mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
// 为了达成重复播放的目的,必须让我们的程序能够接收到
// MM_MCINOTIFY的讯息,这个函数调用的方式,就是传递
// WM_PLAY讯息给装置,叫它开始播放。
mciPlayParms.dwCallback = (DWORD) hwnd;
if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,
(DWORD)(LPVOID) &mciPlayParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
return (0L);
};
void CFsMidi::ReplayMidi()
{
mciSendCommand(wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);
mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);
}
void CFsMidi::StopMidi()
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
}
bool CFsMidi::GetModuleFileDir(CString &str)
{
CString appPath;
DWORD dw = ::GetModuleFileName(NULL, appPath.GetBuffer(MAX_PATH), MAX_PATH);
//注:使用该API函数得到的是程序文件完整路径文件名,去掉文件名后才是路径。
if (dw <= 0)
return false;
appPath.ReleaseBuffer();
int n = appPath.ReverseFind('\\');
str = appPath.Left(n);
TCHAR c = str.GetAt(n - 1);
if(c != '\\') // add '\' to the string trail
str += '\\';
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -