現在プログラムで音楽をロードして流す作業を行っています。理由あって、音楽のファイル名は別のテキストファイルで保存しています。これはプレイヤーが音楽を追加する仕様だからです。
音楽をロードするのにLoadSoundMem関数を使いますが、ロードが失敗した時にフラグを回収し、成功したらフラグを立てるようにしました。音楽ファイルが存在する時はロードに成功し、流すこともできます。ここまでは順調でした。
音楽ファイルをフォルダから取り出してわざとロードを失敗させようとしました。ところがフラグが立ったままで再生はエラーが出る(ロードできないので当たり前ですが…)のでデバックしてみました。
すると失敗するはずのロード関数の返り値が-1ではなかったのです。
これは画像ファイルでやってみても同じでした。
これは仕様なのでしょうか?また音楽ファイルがあるかないかを判断するにはどういう方法がありますか?長々とすみません。
VC++ 2008 EE
Windows 7
Loadの返り値
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: Loadの返り値
そのロード関数がなにか書いてもらわないとコメント出来ないです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: Loadの返り値
Log.txtにはどんなエラーが記録されていますか?
それとLoadGraphも-1が返っこずに何らかのエラーが出るんでしょうか?
それとLoadGraphも-1が返っこずに何らかのエラーが出るんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: Loadの返り値
わざと音楽を削除してロード失敗させたときのログです。
1:システムの情報を出力します
1: DXライブラリ Ver3.08c
1: 論理プロセッサの数 : 8
1: OS Windows7 ( Build 7601 Service Pack 1 )
102: CPU動作速度:大体3.39GHz
102: MMX命令を使用します
102: SSE命令が使用可能です
102: SSE2命令が使用可能です
103: CPUベンダ:GenuineIntel
104: CPU名: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
104:COMの初期化... 成功しました
105:メモリ総量:8174.68MB 空きメモリ領域:5951.63MB
107:タイマーの精度を検査します
107:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
107: パフォーマンスカウンターを使用します タイマー精度 : 3312.832000 KHz
108: ソフトの二重起動検査... 二重起動はされていませんでした
108:ウインドウクラスを登録します... 登録に成功しました
109:ウインドウモード起動用のウインドウを作成します
118:ウインドウの作成に成功しました
149:IMEを無効にしました
149:ウインドウスタイルをウインドウモード用に変更します... 完了
151:DirectInput関係初期化処理
151: DirectInput7 の取得中... 成功
156: 引き続き初期化処理... 初期化成功
157: ジョイパッドの初期化...
161: 入力装置を見つけました
161: デバイスの登録名:JC-PS101U
162: デバイスの製品登録名:JC-PS101U
162: 周期的エフェクトの作成に失敗しました。
162: ジョイパッドの追加は正常に終了しました
163: ジョイパッドの初期化は正常に終了しました
163: マウスデバイスの初期化... 初期化成功
163: キーボードデバイスの初期化... 初期化成功
164:DirectInput 関連の初期化は正常に終了しました
164:DirectSound の初期化を行います
165:DirectSound インターフェースの取得を行います.... 成功
166:引き続きインターフェースの初期化処理... 成功
194: DirectSound デバイスを列挙します
194: モジュール名: ドライバ記述:プライマリ サウンド ドライバー
194: モジュール名:{0.0.0.00000000}.{0442093e-524e-457a-bfc0-7f5a6497b8c2} ドライバ記述:スピーカー (Realtek High Definition Audio)
195: モジュール名:{0.0.0.00000000}.{1b02ea8f-bfb0-4992-9faf-8a8124fba997} ドライバ記述:Realtek Digital Output (Realtek High Definition Audio)
195: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
195: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
195: 利用可能サンプリング精度
195: プライマリ 16bit = OK 8bit = OK
196: セカンダリ 16bit = OK 8bit = OK
196: 利用可能チャンネル
196: プライマリ MONO = OK STEREO = OK
196: セカンダリ MONO = OK STEREO = OK
196:DirectSound の初期化は正常に終了しました
197:DirectDraw オブジェクトの取得を行います.... 成功
199:引き続き初期化処理... 初期化に成功しました
210:IDirect3D9Ex オブジェクトを取得します.... 成功
211:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します
508:成功
509:Driver:nvd3dum.dll Description:NVIDIA GeForce GTX 560
509:画面のフォーマットは D3DFMT_X8R8G8B8 です
509:Zバッファのフォーマットは D3DFMT_D16 です
509:16bit カラーフォーマットは D3DFMT_R5G6B5 です
510:32bit カラーフォーマットは D3DFMT_X8R8G8B8 です
510:アルファ付き 16bit カラーフォーマットは D3DFMT_A4R4G4B4 です
510:アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
510:アルファテスト用 16bit カラーフォーマットは D3DFMT_A1R5G5B5 です
510:アルファテスト用 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
511:DXT1テクスチャフォーマットはD3DFMT_DXT1 です
511:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です
511:DXT3テクスチャフォーマットはD3DFMT_DXT3 です
511:DXT4テクスチャフォーマットはD3DFMT_DXT4 です
511:DXT5テクスチャフォーマットはD3DFMT_DXT5 です
512:描画用 16bit カラーフォーマットは D3DFMT_R5G5B5 です
512:描画用 32bit カラーフォーマットは D3DFMT_X8R8G8B8 です
512:描画用アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
512:描画用ABGR整数16ビット型カラーフォーマットは D3DFMT_A16B16G16R16 です
512:描画用ABGR浮動小数点16ビット型カラーフォーマットは D3DFMT_A16B16G16R16F です
512:描画用ABGR浮動小数点32ビット型カラーフォーマットは D3DFMT_A32B32G32R32F です
513:描画用1チャンネル整数8ビット型カラーフォーマットは D3DFMT_L8 です
513:描画用1チャンネル整数16ビット型カラーフォーマットは D3DFMT_L16 です
513:描画用1チャンネル浮動少数点16ビット型カラーフォーマットは D3DFMT_R16F です
513:描画用1チャンネル浮動少数点32ビット型カラーフォーマットは D3DFMT_R32F です
513:描画用2チャンネル整数8ビット型カラーフォーマットは D3DFMT_A8B8G8R8 です
514:描画用2チャンネル整数16ビット型カラーフォーマットは D3DFMT_G16R16 です
514:描画用2チャンネル浮動少数点16ビット型カラーフォーマットは D3DFMT_G16R16F です
514:描画用2チャンネル浮動少数点32ビット型カラーフォーマットは D3DFMT_G32R32F です
514:同時にレンダリングできるバッファの数:4
514:最大テクスチャサイズ 幅:8192 高さ:8192
514:テクスチャステージテンポラリレジスタ:使用可
515:減算合成のハードウェア対応:ネイティブ
515:ハードウェア頂点シェーダーバージョンコード:300
515:エミュレーション頂点シェーダーバージョンコード:エミュレーション無し
515:ピクセルシェーダーバージョンコード:300
520:バックバッファロック転送の時間:48nsec 一時的な描画可能バッファを使用した転送の時間:316nsec
520:バックバッファロックを使用します
520:Zバッファを作成します.... 成功
527:プログラマブルシェーダーを使用します
574:フォントの初期化を行います
574:フォントの初期化は正常に終了しました
587:文字コードバッファの初期化を行います... 完了しました
672:右記のWAVファイルのロードに失敗しました:c:\Users\xxx\Documents\Visual Studio 2008\Projects\xxx\Music\Kalimba.mp3 画像名はプログラム側でわざと変更しロードを失敗させました。その場合も-1が返ってこず、ハンドルらしき値が入っていましたが、もちろん表示できませんでした。ちなみにハンドルを入れる変数はロード前に初期化してみましたがやはりハンドルらしき値が入ります。softya(ソフト屋) さんが書きました:それとLoadGraphも-1が返っこずに何らかのエラーが出るんでしょうか?
Dango San
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: Loadの返り値
私のところでは試した見たところLoadSoundMem並びにLoadGraphはファイルがないと-1エラーとなります。
なので、状況を再現できるソースコードを見せてもらえないでしょうか?
ちなみに私の環境はVC++2008 DXライブラリ Ver3.08c です。
なので、状況を再現できるソースコードを見せてもらえないでしょうか?
ちなみに私の環境はVC++2008 DXライブラリ Ver3.08c です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: Loadの返り値
状況を再現するプログラムの作成をしようとしたらかなり時間が必要とするのでその前に確認をします。
別のプロジェクトでロードするだけのプログラムを組んでみます。これで-1が返ってきたらプログラムに問題があるので少々お時間ください。
またログを見て気付いたのですがDxLibが更新されていなかったので更新しました。しかし返り値は変わらず-1以外を返してきます。
別のプロジェクトでロードするだけのプログラムを組んでみます。これで-1が返ってきたらプログラムに問題があるので少々お時間ください。
またログを見て気付いたのですがDxLibが更新されていなかったので更新しました。しかし返り値は変わらず-1以外を返してきます。
Dango San
Re: Loadの返り値
再現しようとしましたが、どうもロード失敗時に-1が返らないプログラムは組めませんでした。
つまり普通にロードするだけのプログラムではきちんと-1が返ってくるということなんですが、テキストファイルからファイル名を取り出してロードするだけなのになぜきちんと-1が返らないのか全く分かりません。
それから今気づいたのですが…非同期読み込み仕様の範囲内で例の症状が出てます。非同期以外ではきちんと-1が返ってきました。
つまり普通にロードするだけのプログラムではきちんと-1が返ってくるということなんですが、テキストファイルからファイル名を取り出してロードするだけなのになぜきちんと-1が返らないのか全く分かりません。
それから今気づいたのですが…非同期読み込み仕様の範囲内で例の症状が出てます。非同期以外ではきちんと-1が返ってきました。
Dango San
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: Loadの返り値
「非同期読み込み仕様」って事はSetUseASyncLoadFlag( TRUE );で使っているということでしょうか?
それであればファイルが無くてもすぐに-1は返りません。非同期とはファイルのopenも含めて読み込むタイミングをDXライブラリに任せるということなのでLoadSoundMem並びにLoadGraphした直後はファイルの存在は確認されていないことになります。
非同期の場合はハンドルでCheckHandleASyncLoad()を使いFALSEか-1が返ることを確認してください。
【補足】
すぐに確認したいならFileRead_openの同期モードでファイルの存在確認を行う方法もあります。※ FileRead_closeを忘れない様にしてください。
あとFileRead_sizeでファイルサイズを確認してもよいでしょう。
ただ、何のために非同期読込しているのかが気になります。
GetASyncLoadNum()で同期完了の確認はされていますよね?
それであればファイルが無くてもすぐに-1は返りません。非同期とはファイルのopenも含めて読み込むタイミングをDXライブラリに任せるということなのでLoadSoundMem並びにLoadGraphした直後はファイルの存在は確認されていないことになります。
非同期の場合はハンドルでCheckHandleASyncLoad()を使いFALSEか-1が返ることを確認してください。
【補足】
すぐに確認したいならFileRead_openの同期モードでファイルの存在確認を行う方法もあります。※ FileRead_closeを忘れない様にしてください。
あとFileRead_sizeでファイルサイズを確認してもよいでしょう。
ただ、何のために非同期読込しているのかが気になります。
GetASyncLoadNum()で同期完了の確認はされていますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: Loadの返り値
ファイルが存在しているかは非同期読み込みが終わった後別に確認の関数とかを用意した方がよさそうですね。やってみます。
はい、しています。softya(ソフト屋) さんが書きました:GetASyncLoadNum()で同期完了の確認はされていますよね?
Dango San