⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soundplay.cpp

📁 是《3D游戏编程》的代码 买了这本书
💻 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 + -