📄 soundplay.cpp
字号:
//-----------------------------------------------------------------------------
// 名称: CreateDevice.cpp
//
// 功能: 这个文件创建了一个Direct3D对象和一个Direct3D设备,并使用一个窗口作为
// 渲染目标表面。
//
//-----------------------------------------------------------------------------
// 包含DirectMusic头文件
#include <d3d8.h>
#include <dmusicc.h>
#include <dmusici.h>
// Windows类的名称宏定义
#define MY_WINCLASS_NAME "DirectMusic"
// 定义全局变量
IDirectMusicLoader8* g_pLoader = NULL;
IDirectMusicPerformance8* g_pPerformance = NULL;
IDirectMusicSegment8* g_pSegment = NULL;
//-----------------------------------------------------------------------------
// 名称: SoundInit()
// 功能: 初始化声音播放环境的函数,函数中创建了DirectMusic的载入器对象和
// DirectMusic的演奏对象
// 函数返回E_FAIL表示失败,返回E_OK表示成功。
//-----------------------------------------------------------------------------
HRESULT SoundInit()
{
// 初始化COM
CoInitialize(NULL);
// 创建一个载入器对象
CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,
IID_IDirectMusicLoader8, (void**)&g_pLoader );
// 创建一个演奏对象
CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
IID_IDirectMusicPerformance8, (void**)&g_pPerformance );
// 初始化演奏对象
g_pPerformance->InitAudio( NULL, NULL, NULL,
DMUS_APATH_SHARED_STEREOPLUSREVERB, 64,
DMUS_AUDIOF_ALL, NULL );
return S_OK;
}
//-----------------------------------------------------------------------------
// 名称: SoundLoad()
// 功能: 载入一个声音文件。文件为:
// \Windows安装目录\media\The Microsoft Sound.wav
//-----------------------------------------------------------------------------
VOID SoundLoad()
{
CHAR strPath[MAX_PATH];
GetWindowsDirectory( strPath, MAX_PATH );
strcat( strPath, "\\media" );
// 下面的代码设置查找目录
WCHAR wstrSearchPath[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, strPath, -1,
wstrSearchPath, MAX_PATH );
g_pLoader->SetSearchDirectory( GUID_DirectMusicAllTypes,
wstrSearchPath, FALSE );
// 从文件载入声音到一个声音段对象中
WCHAR wstrFileName[MAX_PATH] = L"The Microsoft Sound.wav";
if( FAILED( g_pLoader->LoadObjectFromFile( CLSID_DirectMusicSegment,
IID_IDirectMusicSegment8,
wstrFileName,
(LPVOID*) &g_pSegment ) ) )
{
MessageBox( NULL, "Media not found, sample will now quit",
"DirectMusic Tutorial", MB_OK );
return;
}
}
//-----------------------------------------------------------------------------
// 名称: SoundPlay()
// 功能: 播放声音文件
//-----------------------------------------------------------------------------
VOID SoundPlay()
{
// 载入声音段到演奏中
g_pSegment->Download( g_pPerformance );
// 设置这个声音段为循环播放
g_pSegment->SetRepeats(DMUS_SEG_REPEAT_INFINITE);
// 播放声音段
g_pPerformance->PlaySegment( g_pSegment, 0, 0, NULL);
}
//-----------------------------------------------------------------------------
// 名称: SoundClean()
// 功能: 释放所有的DirectMusic资源
//-----------------------------------------------------------------------------
VOID SoundClean()
{
// 停止声音播放,并关闭演奏
g_pPerformance->Stop( NULL, NULL, 0, 0 );
g_pPerformance->CloseDown();
// 清除载入器、演奏和声音段对象
g_pLoader->Release();
g_pPerformance->Release();
g_pSegment->Release();
// 关闭COM
CoUninitialize();
return;
}
//-----------------------------------------------------------------------------
// 名称: MsgProc()
// 功能: Windows的消息处理函数
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// 名称: WinMain()
// 功能: Windows主函数,程序启动时,从这里开始执行
//-----------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 定义一个Windows类,指定消息的处理函数为MsgProc
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, (struct HBRUSH__ *)GetStockObject(BLACK_BRUSH), NULL,
MY_WINCLASS_NAME, NULL };
// 注册这个窗口类
RegisterClassEx( &wc );
// 创建应用程序窗口
HWND hWnd = CreateWindow( MY_WINCLASS_NAME, "3D游戏编程——播放声音文件",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// 调用SoundInit函数进行DirectMusic对象的创建
if( SUCCEEDED( SoundInit( ) ) )
{
// 显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// 载入声音
SoundLoad();
// 播放声音
SoundPlay();
// 程序主循环,进行窗口消息的分发,消息的处理在MsgProc函数中完成
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
// 调用SoundClean函数清除DirectMusic对象
SoundClean();
// 注销窗口类
UnregisterClass( MY_WINCLASS_NAME, wc.hInstance );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -