DXUTのSDKsoundで音を鳴らす

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
gran

DXUTのSDKsoundで音を鳴らす

#1

投稿記事 by gran » 12年前

プログラム勉強中の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 );

コード:

	SAFE_DELETE( sm );
sm->Initialize(DXUTGetHWND(), DSSCL_PRIORITY);を
コメントアウトすれば初回の例外は出ませんでしたが
これでは音は使えません。

どうすれば正しい書き方になるでしょうか。
どなたかよろしくお願いします。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: DXUTのSDKsoundで音を鳴らす

#2

投稿記事 by へにっくす » 12年前

gran さんが書きました:sm->Initialize(DXUTGetHWND(), DSSCL_PRIORITY);を
コメントアウトすれば初回の例外は出ませんでしたが
これでは音は使えません。
DXUTGetHWND()の戻り値がNULLになってるのでしょう。
以下のドキュメントをお読みください。
ウィンドウの作成
まあいきなり鳴らそうとするのではなくて、鳴らすための準備が必要なのだと思ってください。
できるなら、上記のページにある
「プログラミングガイド」-「DXUT」から順序良く読んだ方がよいです。
written by へにっくす

gran

Re: DXUTのSDKsoundで音を鳴らす

#3

投稿記事 by gran » 12年前

へにっくすさん、返信ありがとうございます。

読ませていただきましたが一応
ウィンドウの生成処理などは
すべてメイン関数の方でやっていると思います。
以下コード

コード:


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でした。

正直まだよくわかりません。
どなたかお願いします。

gran

Re: DXUTのSDKsoundで音を鳴らす

#4

投稿記事 by gran » 12年前

コードを改正します

コード:

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 参照ポインターがスタブに渡されました
が出てきます。

どなたかお願いします。

アバター
雨ガエル
記事: 34
登録日時: 13年前
住所: 新潟
連絡を取る:

Re: DXUTのSDKsoundで音を鳴らす

#5

投稿記事 by 雨ガエル » 12年前

DXUTについてよく分かりませんが、
DXUTCreateWindow( L"タイトル", NULL, NULL, NULL, 0, 0 );
のように第二引数以上を指定してみてはどうですか?

gran

Re: DXUTのSDKsoundで音を鳴らす

#6

投稿記事 by gran » 12年前

雨ガエルさん、返答ありがとうございます。
しかし既に試している内容でした。

引き続きどなたかよろしくお願いします。

アバター
雨ガエル
記事: 34
登録日時: 13年前
住所: 新潟
連絡を取る:

Re: DXUTのSDKsoundで音を鳴らす

#7

投稿記事 by 雨ガエル » 12年前

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();
}
ウィンドウハンドルは取得できているようです。
一度このコードをためしてみてください。

gran

Re: DXUTのSDKsoundで音を鳴らす

#8

投稿記事 by gran » 12年前

雨ガエルさん、返信ありがとうございます。

試してみましたところ

コード:


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 参照ポインターがスタブに渡されました
がでてきます。

まだ問題は解決していません。
どなたかよろしくお願いします。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: DXUTのSDKsoundで音を鳴らす

#9

投稿記事 by へにっくす » 12年前

gran さんが書きました:メッセージボックスがでて来るだけで
メッセージボックスが出たってことは、hwndはNULLではないってことだよね?
FindClose(hwnd)の一行をコメント化してみたらどうかな?
※なんでFindCloseがあるのか分かりません。。
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る