ページ 1 / 1
DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月04日(金) 00:27
by gran
プログラム勉強中のgranといいます。
よろしくお願いします。
DirectXSDK(June2010)にある
DXUTのSDKsoundを使用して
音を鳴らそうと思っているのですが
音は鳴ります。
しかしVisualStudio2010の出力に
0x7551c41f で初回の例外が発生しました:
0x000006F4: NULL 参照ポインターがスタブに渡されました。
という文字が出ます。
これが原因なのかはわかりませんが
もう一度読み込もうとすると
「ヒープ領域が破壊されています」と出て落ちます。
コードは
コード:
static CSoundManager* sm = NULL;
コード:
sm = new CSoundManager();
sm->Initialize(DXUTGetHWND(), DSSCL_PRIORITY);
sm->SetPrimaryBufferFormat( 2, 22050, 16 );
sm->Initialize(DXUTGetHWND(), DSSCL_PRIORITY);を
コメントアウトすれば初回の例外は出ませんでしたが
これでは音は使えません。
どうすれば正しい書き方になるでしょうか。
どなたかよろしくお願いします。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月04日(金) 06:01
by へにっくす
gran さんが書きました:sm->Initialize(DXUTGetHWND(), DSSCL_PRIORITY);を
コメントアウトすれば初回の例外は出ませんでしたが
これでは音は使えません。
DXUTGetHWND()の戻り値がNULLになってるのでしょう。
以下のドキュメントをお読みください。
ウィンドウの作成
まあいきなり鳴らそうとするのではなくて、鳴らすための準備が必要なのだと思ってください。
できるなら、上記のページにある
「プログラミングガイド」-「DXUT」から順序良く読んだ方がよいです。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月06日(日) 23:26
by gran
へにっくすさん、返信ありがとうございます。
読ませていただきましたが一応
ウィンドウの生成処理などは
すべてメイン関数の方でやっていると思います。
以下コード
コード:
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#endif
DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );
DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );
DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );
DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );
DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );
DXUTSetCallbackFrameMove( OnFrameMove );
DXUTInit( true, true );
DXUTSetHotkeyHandling( true, true, true );
DXUTSetCursorSettings( true, true );
DXUTCreateWindow( L"window" );
DXUTCreateDevice( true, 640, 480 );
DXUTMainLoop();
return DXUTGetExitCode();
}
DXUTCreateWindow( L"window" );
これでウィンドウを生成したので
DXUTGetHWND() 関数で
持ってくることができていると思います。
しかしおっしゃる通り
デバッグモードで実行してみても
値はNULLでした。
正直まだよくわかりません。
どなたかお願いします。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月06日(日) 23:51
by gran
コードを改正します
コード:
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#endif
HRESULT hr;
DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );
DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );
DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );
DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );
DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );
DXUTSetCallbackFrameMove( OnFrameMove );
CSound* se[2];
CSoundManager* soundm;
DXUTInit( true, true );
DXUTSetHotkeyHandling( true, true, true );
DXUTSetCursorSettings( true, true );
DXUTCreateWindow( L"BAD DAY" );
DXUTCreateDevice( true, 640, 480 );
// 音関係
soundm = new CSoundManager();
V_RETURN( soundm->Initialize(DXUTGetHWND(), DSSCL_PRIORITY ));
V_RETURN( soundm->SetPrimaryBufferFormat( 2, 22050, 16 ));
DXUTMainLoop();
// 破棄
SAFE_DELETE( soundm );
return DXUTGetExitCode();
}
このコードで最初にウィンドウを確実に
作成してウィンドウハンドルをとれるようにしましたが
まだ
0x7551c41f で初回の例外が発生しました:
0x000006F4: NULL 参照ポインターがスタブに渡されました
が出てきます。
どなたかお願いします。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月07日(月) 14:08
by 雨ガエル
DXUTについてよく分かりませんが、
DXUTCreateWindow( L"タイトル", NULL, NULL, NULL, 0, 0 );
のように第二引数以上を指定してみてはどうですか?
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月07日(月) 21:58
by gran
雨ガエルさん、返答ありがとうございます。
しかし既に試している内容でした。
引き続きどなたかよろしくお願いします。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月08日(火) 01:42
by 雨ガエル
DXUTについて少し勉強してみました。
メッセージボックスで確認してみましたがどうでしょうか。
コード:
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
DXUTCreateWindow( L"DXUT_TEST" );
DXUTCreateDevice( true, 640, 480 );
TCHAR WindowTitle[10];
HWND hwnd = NULL;
hwnd = DXUTGetHWND();
if(hwnd != NULL)
{
GetWindowText( hwnd, WindowTitle, 10 );
MessageBox( hwnd, WindowTitle, L"ウィンドウタイトル", MB_OK );
}
FindClose(hwnd);
DXUTMainLoop();
return DXUTGetExitCode();
}
ウィンドウハンドルは取得できているようです。
一度このコードをためしてみてください。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月08日(火) 13:18
by gran
雨ガエルさん、返信ありがとうございます。
試してみましたところ
コード:
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#endif
HRESULT hr;
DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );
DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );
DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );
DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );
DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );
DXUTSetCallbackFrameMove( OnFrameMove );
DXUTInit( true, true );
DXUTSetHotkeyHandling( true, true, true );
DXUTSetCursorSettings( true, true );
DXUTCreateWindow( L"Window" );
DXUTCreateDevice( true, 640, 480 );
TCHAR WindowTitle[10];
HWND hwnd = NULL;
hwnd = DXUTGetHWND();
if(hwnd != NULL)
{
GetWindowText( hwnd, WindowTitle, 10 );
MessageBox( hwnd, WindowTitle, L"ウィンドウタイトル", MB_OK );
}
FindClose(hwnd);
// 音関係
CSoundManager* soundm; // サウンドマネージャー
soundm = new CSoundManager();
V_RETURN( soundm->Initialize(hwnd, DSSCL_PRIORITY )); // サウンドマネージャー初期化
//V_RETURN( soundm->SetPrimaryBufferFormat( 2, 22050, 16 ));
DXUTMainLoop(); // メインループ
// 破棄
SAFE_DELETE( soundm );
return DXUTGetExitCode();
}
となりました。
しかし期待通りの結果となり
メッセージボックスがでて来るだけで
0x7551c41f で初回の例外が発生しました:
0x000006F4: NULL 参照ポインターがスタブに渡されました
がでてきます。
まだ問題は解決していません。
どなたかよろしくお願いします。
Re: DXUTのSDKsoundで音を鳴らす
Posted: 2013年1月08日(火) 22:14
by へにっくす
gran さんが書きました:メッセージボックスがでて来るだけで
メッセージボックスが出たってことは、hwndはNULLではないってことだよね?
FindClose(hwnd)の一行をコメント化してみたらどうかな?
※なんでFindCloseがあるのか分かりません。。