/*------------------------------------------------------------
DirectMusic サンプルプログラム
2007 Copyright(C) Toru
ToruのDirectXプログラミング講座
URL : http://toruweb.web.fc2.com/
Mail : toru_website@hotmail.com
--------------------------------------------------------------*/
#define STRICT
// インクルード
#include
#include
#include
// インターフェイス解放
#define RELEASE(p) { if(p){(p)->Release();p=NULL;} }
// アプリケーション情報
HINSTANCE g_hInst; // インスタンスハンドル
HWND g_hWnd; // ウインドウハンドル
CHAR g_szAppName[] = "DirectMusic Sample"; // アプリケーション名
// DirectMusicの変数
IDirectMusicPerformance8* g_lpPerformance = NULL; // パフォーマンス
IDirectMusicLoader8* g_lpLoader = NULL; // ローダー
IDirectMusicSegment8* g_lpSegment = NULL; // セグメント
CHAR szFileName[] = "bgm.mid"; // 再生するファイル
// メッセージ関数の定義
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam );
// アプリケーションの初期化
BOOL InitApp( HINSTANCE hInst, INT nCmdShow )
{
// インスタンスハンドル保存
g_hInst = hInst;
// COMの初期化
HRESULT hr = CoInitialize( NULL );
if( FAILED(hr) )
{
DXTRACE_ERR( "COMの初期化に失敗", hr );
return FALSE;
}
// ウインドウクラスの登録
WNDCLASS wc;
ZeroMemory( &wc, sizeof(wc) );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.lpszClassName = "Main Window";
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wc.hInstance = hInst;
wc.style = CS_BYTEALIGNCLIENT | CS_VREDRAW|CS_HREDRAW;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
if( ! RegisterClass(&wc) )
{
DXTRACE_MSG( "ウインドウクラスの登録に失敗" );
return FALSE;
}
// メインウインドウの作成
g_hWnd = CreateWindowEx( 0, "Main Window", g_szAppName,
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
(HWND)NULL, (HMENU)NULL, hInst, (LPSTR)NULL);
if( g_hWnd == NULL )
{
DXTRACE_MSG( "メインウインドウ作成に失敗" );
return FALSE;
}
// メインウインドウの表示
ShowWindow( g_hWnd, nCmdShow );
UpdateWindow( g_hWnd );
return TRUE;
}
// DirectMusicの初期化
BOOL InitDMusic()
{
HRESULT hr;
// パフォーマンスの作成
hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
IID_IDirectMusicPerformance8, (LPVOID*)&g_lpPerformance );
if( FAILED(hr) )
{
DXTRACE_ERR( "DirectMusicPerformance8オブジェクトの作成に失敗", hr );
return FALSE;
}
// パフォーマンスの初期化
hr = g_lpPerformance->InitAudio(
NULL, // IDirectMusicインターフェイスは不要
NULL, // IDirectSoundインターフェイスは不要
g_hWnd, // ウィンドウハンドル
DMUS_APATH_SHARED_STEREOPLUSREVERB, // デフォルトのオーディオパスタイプ
64, // パフォーマンスチャンネルの数
DMUS_AUDIOF_ALL, // シンセサイザの機能
NULL ); // オーディオパラメータにはデフォルトを使用
if( FAILED(hr) )
{
DXTRACE_ERR( "DirectMusicPerformance8の初期化に失敗", hr );
return FALSE;
}
// ローダーの作成
hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,
IID_IDirectMusicLoader8, (LPVOID*)&g_lpLoader );
if( FAILED(hr) )
{
DXTRACE_ERR( "DirectMusicLoader8オブジェクトの作成に失敗", hr );
return FALSE;
}
// ローダーの初期化(検索パスをカレントディレクトリに設定)
CHAR strPath[ MAX_PATH ];
DWORD i = GetCurrentDirectory( MAX_PATH, strPath );
if( i==0 || MAX_PATHSetSearchDirectory( GUID_DirectMusicAllTypes, wstrSearchPath, FALSE );
if( FAILED(hr) )
{
DXTRACE_ERR( "検索パスの設定に失敗", hr );
return FALSE;
}
// セグメント作成
WCHAR wstrFileName[ MAX_PATH ];
MultiByteToWideChar( CP_ACP, 0, szFileName, -1, wstrFileName, MAX_PATH );
hr = g_lpLoader->LoadObjectFromFile( CLSID_DirectMusicSegment, IID_IDirectMusicSegment8,
wstrFileName, (LPVOID*)&g_lpSegment );
if( FAILED(hr) )
{
DXTRACE_ERR( "セグメントのロードに失敗", hr );
return FALSE;
}
// MIDIファイルの場合は、パラメータを設定する
hr = g_lpSegment->SetParam( GUID_StandardMIDIFile, 0xFFFFFFFF, 0, 0, NULL );
if( FAILED(hr) )
{
DXTRACE_ERR( "セグメントのパラメータ設定に失敗", hr );
return FALSE;
}
// バンドのダウンロード
hr = g_lpSegment->Download( g_lpPerformance );
if( FAILED(hr) )
{
DXTRACE_ERR("セグメント1のバンドのダウンロードに失敗", hr);
return FALSE;
}
// セグメントの再生
g_lpPerformance->PlaySegmentEx(
g_lpSegment, // 演奏するセグメント
NULL, // 使用しない
NULL, // トランザクション用
0, // フラグ
0, // 開始タイム、0 は即時
NULL, // セグメント状態を受け取るポインタ
NULL, // 停止するオブジェクト
NULL // オーディオパス、デフォルトでない場合
);
return TRUE;
}
// DirectMusicの終了処理
BOOL ReleaseDMusic()
{
HRESULT hr;
// 演奏停止
if( g_lpPerformance )
{
hr = g_lpPerformance->Stop( NULL, NULL, 0, 0 );
if( FAILED(hr) )
DXTRACE_ERR( "全セグメントの演奏停止に失敗", hr );
}
// セグメントのアンロード
if( g_lpSegment )
{
hr = g_lpSegment->Unload( g_lpPerformance );
if( FAILED(hr) )
DXTRACE_ERR( "セグメントのアンロードに失敗", hr );
}
// セグメントを開放
RELEASE( g_lpSegment );
// ローダを開放
RELEASE( g_lpLoader );
// パフォーマンスを解放
if( g_lpPerformance )
{
hr = g_lpPerformance->CloseDown();
if( FAILED(hr) )
DXTRACE_ERR( "IDirectMusicPerformance8::CloseDownに失敗", hr );
}
RELEASE( g_lpPerformance );
return TRUE;
}
// アプリケーションの終了処理
BOOL EndApp()
{
// COMを解放
CoUninitialize();
return TRUE;
}
// ウインドウ処理
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam )
{
switch( msg )
{
// ウインドウが破棄される
case WM_DESTROY:
PostQuitMessage( 0 );
break;
// その他のメッセージ
default:
return DefWindowProc( hWnd, msg, wParam, lParam );
}
return 0L;
}
// メイン
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow)
{
MSG msg;
// アプリケーションの初期化
if( InitApp( hInst, nCmdShow ) )
{
// DirectMusicの初期化
if( InitDMusic() )
{
// メッセージループ
while( GetMessage( &msg, 0, 0, 0 ) )
{
if( msg.message == WM_QUIT )
break;
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
}
// DirectMusicの終了処理
ReleaseDMusic();
// アプリケーションの終了処理
EndApp();
return msg.wParam;
}
- Last Update 2007/1/21
- Copyright © 2002-2007 Toru. All Rights Reserved.
- toru_website@hotmail.com