トップページ > 過去ログ > 記事閲覧
SetCreateSoundDataType()で音切れ
名前:Sura 日時: 2008/03/11 17:12

お世話になります。 SetCreateSoundDataType()によって再生方法を設定すると 音が途中で途切れる現象が確認できました。 上記の関数の引数にDX_SOUNDDATATYPE_MEMPRESSを入れ、 PlaySoundMem()をDX_PLAYTYPE_NORMAL及びDX_PLAYTYPE_BACKとして実行すると 音声が途中で途切れました。 私の環境が問題かもしれませんが、 もしよろしければお時間があるときにご検討願います。 以下、サンプルコード #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int iMusicHandle; // 音声ファイル再生用ハンドル if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } iMusicHandle = LoadSoundMem("Sample.ogg"); // 音声ファイルを読み込みハンドルを取得 PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); // バックグラウンド再生させる WaitKey(); //入力待ち DeleteSoundMem(iMusicHandle); // 読み込んだ音声を開放する SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS); // 再生形式をDX_SOUNDDATATYPE_MEMPRESSにする iMusicHandle = LoadSoundMem("Sample.ogg"); // 再度音声ファイルを読み込みハンドルを取得 PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); // バックグラウンド再生させるが途中で途切れる WaitKey(); //入力待ち DeleteSoundMem(iMusicHandle); // 読み込んだ音声を開放する DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Page: 1 |

Re: SetCreateSoundDataType()で音切れ ( No.1 )
名前:かたぱると 日時:2008/03/11 21:09

試していないのでなんとも言えませんが ProcessMessageを呼び出していないからではないでしょうか? #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int iMusicHandle; // 音声ファイル再生用ハンドル if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } iMusicHandle = LoadSoundMem("Sample.ogg"); // 音声ファイルを読み込みハンドルを取得 PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); // バックグラウンド再生させる while( CheckHitKeyAll() == 0 ) // 入力待ち { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } } DeleteSoundMem(iMusicHandle); // 読み込んだ音声を開放する SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS); // 再生形式をDX_SOUNDDATATYPE_MEMPRESSにする iMusicHandle = LoadSoundMem("Sample.ogg"); // 再度音声ファイルを読み込みハンドルを取得 PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); // バックグラウンド再生させる while( CheckHitKeyAll() == 0 ) // 入力待ち { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } } DeleteSoundMem(iMusicHandle); // 読み込んだ音声を開放する DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } のようにして試してみてはどうでしょうか。
Re: SetCreateSoundDataType()で音切れ ( No.2 )
名前:Sura 日時:2008/03/11 20:53

>>かたぱるとさん ご返事ありがとうございます。 提供いただいたコードを実行してみましたが やはり同じ現象が再現されてしまいました。 >ProcessMessageを呼び出していないからではないでしょうか? についてですがDX_PLAYTYPE_NORMALでも同じ不具合が確認できました。 また、前バージョン(DxLib2_21f)では確認されない現象だったもので 何か別の原因と思うのですがいかがでしょう?
Re: SetCreateSoundDataType()で音切れ ( No.3 )
名前:かたぱると 日時:2008/03/11 21:11

SetCreateSoundDataTypeの説明文から抜粋 この関数で DX_SOUNDDATATYPE_NOMEMPRESS 以外の選択をした場合は、 以後 ProcessMessage の呼び出し間隔を0.2秒以上空けないようにして下さい。 (0.2秒以上空け続けると再生中の音が途切れる現象が発生します) とあるのでもしかしたらこのあたりが関係してそうですね。 0.2秒以上は音楽鳴らすだけだからかからないとは思いたいですが…。
Re: SetCreateSoundDataType()で音切れ ( No.4 )
名前:Sura 日時:2008/03/11 21:49

>かたぱるとさん 再度のご返事ありがとうございます。 と同時の言葉足らずで申し訳ありません。 実はRe:(No.2)の >また、前バージョン(DxLib2_21f)では確認されない現象だったもので はProcessMessageを呼んでの上です。 同時にScreenFlipも呼んでおり リフレッシュレート毎には実行されるはずなので >(0.2秒以上空け続けると再生中の音が途切れる現象が発生します) ではないと考えております。 ただ、あまりにも余分なコード除いたサンプルコードを 提示してしまって誤解を与えてしまいました。 コードの概要 #include"Dxlib.h" int iMusicHandle; void LoadAndPlayMusic1(TCHAR*); void LoadAndPlayMusic2(TCHAR*); int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { if(DxLib_Init() == -1) return -1; while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { if(CheckHitKey(KEY_INPUT_NUMPAD1)) LoadAndPlayMusic1("Sample.ogg"); if(CheckHitKey(KEY_INPUT_NUMPAD2)) LoadAndPlayMusic2("Sample.ogg"); } DxLib_End(); return 0; } void LoadAndPlayMusic1(TCHAR *str) { DeleteSoundMem(iMusicHandle); SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS); iMusicHandle = LoadSoundMem(str); PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); } void LoadAndPlayMusic2(TCHAR *str) { DeleteSoundMem(iMusicHandle); SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS); iMusicHandle = LoadSoundMem(str); PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); }
Re: SetCreateSoundDataType()で音切れ ( No.5 )
名前:優柔不断 日時:2008/03/13 19:14

実行してみましたが、全く問題ありませんでした。 ただ、このようなコードは実行する意味があるかもしれません。 #include"Dxlib.h" int iMusicHandle; void LoadAndPlayMusic1(TCHAR*); void LoadAndPlayMusic2(TCHAR*); int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { int tm,white; if(DxLib_Init() == -1) return -1; tm=GetNowCount(); white=GetColor(255,255,255); while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { DrawFormatString(0,0,white,"%dms",GetNowCount()-tm); tm=GetNowCount(); if(CheckHitKey(KEY_INPUT_X)) LoadAndPlayMusic1("Sample.ogg"); if(CheckHitKey(KEY_INPUT_C)) LoadAndPlayMusic2("Sample.ogg"); ClearDrawScreen(); Sleep(1); } DxLib_End(); return 0; } void LoadAndPlayMusic1(TCHAR *str) { DeleteSoundMem(iMusicHandle); SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS); iMusicHandle = LoadSoundMem(str); PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); } void LoadAndPlayMusic2(TCHAR *str) { DeleteSoundMem(iMusicHandle); SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS); iMusicHandle = LoadSoundMem(str); PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); } ループ一回の時間を測定します。すいません、ゲームパッドではなくてキーボード指定にしました。 XでDX_SOUNDDATATYPE_MEMPRESS、CでDX_SOUNDDATATYPE_MEMNOPRESSとなります。
Re: SetCreateSoundDataType()で音切れ ( No.6 )
名前:Sura 日時:2008/03/13 23:10

>>優柔不断さん ご返事ありがとうございます。 >実行してみましたが、全く問題ありませんでした。 そうですか。もしかすると環境の違いで出てくる不具合かもしれませんね。 一応、私の環境では、 VCEE2008 及び BCC5.51 双方とも不具合が発生しました。 戴いたコードを実行してみました。以下結果です。 VCEE2008 DX_SOUNDDATATYPE_MEMPRESS: 32[ms] DX_SOUNDDATATYPE_MEMNOPRESS: 57[ms] BCC5.51 DX_SOUNDDATATYPE_MEMPRESS: 49[ms] DX_SOUNDDATATYPE_MEMNOPRESS: 81[ms] 以下、冗長で恐縮ですが環境を示します。 "Log.txt" 0:システムの情報を出力します 0: DXライブラリ Ver2.24b 0: OS WindowsXP ( Build 2600 Service Pack 2 ) 100: CPU動作速度:大体1.87GHz 100: MMX命令を使用します 101: CPUベンダ:AuthenticAMD 102: CPU名:AMD Athlon(tm) 64 X2 Dual Core Processor 4600+ 102:COMの初期化... 成功しました 109:メモリ総量:1023.23MB 空きメモリ領域:658.91MB 109:タイマーの精度を検査します 110:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 110: パフォーマンスカウンターを使用します タイマー分解能 : 2403110.000000 KHz 110: ソフトの二重起動検査... 二重起動はされていませんでした 111:ウインドウクラスを登録します... 登録に成功しました 112:フルスクリーンモード用のウインドウを作成します 142:カーソルを不可視にしました 142:IMEを無効にしました 344:DirectInput関係初期化処理 344: DirectInput7 の取得中... 成功 378: 引き続き初期化処理... 初期化成功 379: ジョイパッドの初期化... 382: 入力装置を見つけました 384: デバイスの登録名:JC-PS101U 384: デバイスの製品登録名:JC-PS101U 385: 周期的エフェクトの作成に失敗しました。 387: ジョイパッドの追加は正常に終了しました 388: ジョイパッドの初期化は正常に終了しました 388: マウスデバイスの初期化... 初期化成功 389: キーボードデバイスの初期化... 初期化成功 390:DirectInput 関連の初期化は正常に終了しました 391:DirectSound の初期化を行います 391:DirectSound インターフェースの取得を行います.... 成功 395:引き続きインターフェースの初期化処理... 成功 493: DirectSound デバイスを列挙します 495: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 495: モジュール名: ALCXWDM.SYS ドライバ記述:Realtek AC97 Audio 496: 最大サンプリングレート:192.00KHz 最小サンプリングレート:0.10KHz 496: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 497: 利用可能サンプリング精度 497: プライマリ 16bit = OK 8bit = OK 498: セカンダリ 16bit = OK 8bit = OK 498: 利用可能チャンネル 499: プライマリ MONO = OK STEREO = OK 499: セカンダリ MONO = OK STEREO = OK 500:DirectSound の初期化は正常に終了しました 500:DirectDraw 関連の初期化を行います 500: DirectDraw オブジェクトの取得を行います.... 成功 507: 引き続き初期化処理... 初期化に成功しました 510: ビデオカードの情報 510: 画面モード変更処理を開始します 571: ウインドウスタイルをフルスクリーンモード用に変更します... 完了 573: 画面モードの変更処理を開始します 640 x 480 16 bit 574: 画面解像度を変更します... 成功しました 709: 画面モードの変更は正常に終了しました 710: カラー情報 712: A:00000000 B:0000f800 G:000007e0 B:0000001f 713: 出力画面用の DirectDrawSurface を作成します 740: 各スクリーンメモリの配置位置 741: PrimaryBuffer : VIDEOMEMORY 742: BaskBuffer : VIDEOMEMORY 743: 出力画面用の DirectDrawSurface の作成は正常に終了しました 743: Direct3D 関連の初期化を行います 744: Direct3Dオブジェクトを取得します 751: Direct3Dオブジェクトを取得しました 752: 3Dデバイスを作成します... 3Dデバイスの作成に成功しました 763: テクスチャ最大幅:4096 最小幅:1 764: 描画制限: D_D3DPTEXTURECAPS_POW2 = 1 D_D3DPTEXTURECAPS_SQUAREONLY = 0 764: テクスチャピクセルフォーマット 765: 通常グラフィック用 765: BIT:16 RED:5 GREEN:6 BLUE:5 766: RED:00f800 GREEN:0007e0 BLUE:00001f 766: BIT:32 RED:8 GREEN:8 BLUE:8 766: RED:ff0000 GREEN:00ff00 BLUE:0000ff 767: アルファチャンネル付きグラフィック用 767: BIT:16 ALPHA:4 RED:4 GREEN:4 BLUE:4 767: ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f 768: BIT:32 ALPHA:8 RED:8 GREEN:8 BLUE:8 768: ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff 770: Direct3D 関連の初期化は正常に終了しました 770: グラフィック管理系の初期化を行います 771: 3Dグラフィック描画機能を使用します 772: フォントの初期化を行います 775: フォントの初期化は正常に終了しました 776: グラフィック管理系の初期化は正常に終了しました 1788: サーフェス間転送には BitBlt を使用します 1788: BitBlt:33391μs BltFast:973796μs 1789: スキャンラインの数:480 1891: 1フレーム当たりの時間は 13 msecです 1893: Tri00:13 msec 1894: Tri01:15 msec 1894: Tri02:15 msec 1896: Tri03:13 msec 1897: 画面モード変更処理は正常に終了しました 1904: オーバーレイサーフェスを使用します    UYVY 1906: DirectDraw 関連の初期化は正常に終了しました 1909: 文字コードバッファの初期化を行います... 完了しました 25155: DirectDraw 関連の終了処理をおこないます 25157: フォントの初期化を行います 25160: フォントの初期化は正常に終了しました 25161: グラフィック管理系の終了処理は正常に終了しました 25161: Direct3D 関連の終了処理を行います 25165: 3Dデバイスの削除は正常に終了しました 25166: Direct3D 関連の終了処理は正常に終了しました 25166: メインサーフェスを破棄をします... 完了しました 25179: DirectDrawオブジェクトを解放します 25466: DirectDrawオブジェクトを解放しました 25467: DirectDraw 関連の終了処理は正常に終了しました 25479: DirectInput 関連の終了処理... 完了 25492: DirectSound の終了処理は正常に終了しました 25747: ウインドウを閉じようとしています 25752: ウインドウが破棄されようとしています 25753: ソフトを終了する準備が整いました 26172: 26172: Alloc memory dump Total size:0(0.000kb) Alloc num:0 26173: 使用サンプルファイル"Sample.ogg"のプロパティ(SoundPlayerLilith Ver.0.991よる確認) FileType Ogg Vorbis FileSize 71538 Bytes PlaySize 1147244 Bytes PlayTime 0:06.503 BitRate 87 kbps (VBR) BitsPerSample 16 bits SampleRate 44100 Hz Mode Stereo
Re: SetCreateSoundDataType()で音切れ ( No.7 )
名前:Sura 日時:2008/03/14 00:15

皆様、 たびたび恐れ入ります。 どうやらサウンドファイルの問題であることがわかりました。 別のファイルで確認したところ不具合が発生しなかったためです。 お騒がせいたしました。 ただ、その顛末の報告をお許しください。 1.問題のあるサウンドファイルの判断 Windouws Media PlayerやSound Recorderではいずれも正常に再生できてしまうため 現状では上記のプログラムで確認するしかなかった。 2.問題のあるサウンドファイルの変換に伴う影響 問題のファイルをwav, mp3, oggいずれの形式に変換しても 不具合は発生し、正常なファイルは変換しても不具合は発生しなかった。 以上
Re: SetCreateSoundDataType()で音切れ ( No.8 )
名前:管理人 日時:2008/03/16 21:07

Suraさんの仰る通り、ある意味ではサウンドファイルが音切れの原因といえる かもしれませんが、wav や mp3 に変換しても問題が発生するというのが非常に気になります。 DXライブラリで正常に再生できない原因を調べてみたいので、宜しければ件の現象が 発生するサウンドファイルを BQE00322(あっとまーく)nifty.com まで送って頂け ないでしょうか?m(_ _)m
Re: SetCreateSoundDataType()で音切れ ( No.9 )
名前:Sura 日時:2008/03/16 23:25

管理人様 ありがとうございます。 早速E-Mailしました。(2008/3/16/23:00頃) ご確認のほど宜しくお願いいたします。
Re: SetCreateSoundDataType()で音切れ ( No.10 )
名前:管理人 日時:2008/03/17 01:18

メールを拝見しました。 サンプルプログラムまで同梱して頂いてありがとうございます。 結果ですが、私の環境でも音の途切れが再現しました、 なんで今まで気が付かなかったのだろうという程普通に・・・ 原因はサウンド関係のプログラムのある一文( CurPosition = 0 という記述 ) なのですが、何のための記述なのか謎で、この一文をコメントアウトすることに より途切れはなくなりました。(ログを見る限りでは昨年12月末頃書いたよう なのですが・・・全く覚えがなく・・・(汗)) 修正版をアップしましたので、宜しければお試しになってみてください。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: SetCreateSoundDataType()で音切れ ( No.11 )
名前:Sura 日時:2008/03/17 07:52

管理人様 お忙しいのにもかかわらず、素早い対応感謝いたします。 確認したところ、不具合が解消されていました。 誠にありがとうございます。

Page: 1 |