トップページ > 記事閲覧
サウンドの再生について
名前:丈槍由紀 日時: 2016/02/15 02:27

ゲーム内でのアクションに合わせて、ファイルから読みこんでおいた音声を再生する実装をしたのですが、 連続して同じサウンドハンドルを再生しようとすると前の再生が止まってしまうのですが、これは仕様でしょうか? ChangeNextPlay〜系の関数のリファレンスを見ると同じサウンドハンドルでも同時再生できているようですが。。。 再生モードはDX_PLAYTYPE_BACKを使用しています。 また、現在は再生の毎にDuplicateSoundMem()で複製してから再生することで対応しているのですが、データを共有しているとはいえむやみにハンドルを増やしても問題ないのでしょうか?
メンテ

Page: 1 |

Re: サウンドの再生について ( No.1 )
名前:管理人 日時:2016/02/15 03:36

はい、仕様です リファレンスには載っていませんが、LoadSoundMem には『同時に再生できる音の数』を指定する為の 第二引数があって、デフォルトでは 3 となっていますので、3音より多い数を同時に再生すると、 古い音から再生が止まります なので、例えば 6音まで同時に再生したい場合は int SoundHandle ; SoundHandle = LoadSoundMem( "ファイル名", 6 ) ; というように、第二引数に 6 を渡してみてください > また、現在は再生の毎にDuplicateSoundMem()で複製してから再生することで対応しているのですが、 > データを共有しているとはいえむやみにハンドルを増やしても問題ないのでしょうか? 問題ありませんが、DuplicateSoundMem で増やしたサウンドハンドルも通常のサウンドハンドルと 同じなので、不要になったら DeleteSoundMem で削除する必要があります 適切に DeleteSoundMem で削除されている限りは何回 DuplicateSoundMem でハンドルを増やしても 問題ありませんが、逆に複製して再生したまま削除しないで放置すると、どんどんサウンドハンドルが 溜まり、何れ DuplicateSoundMem が失敗するようになります 再生が完了するのを待って DeleteSoundMem を呼ぶのが面倒、という場合はこちらの 『再生が終了したら自動的にサウンドハンドルを削除してくれる』機能を使うと便利です // サウンドハンドルの再生が終了したら自動的にハンドルを削除するかどうかを設定する int SetPlayFinishDeleteSoundMem( int DeleteFlag, int SoundHandle ) ; PlaySoundMem で再生を開始した後、この関数を呼んで再生終了後の削除を予約します PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ; SetPlayFinishDeleteSoundMem( TRUE, SoundHandle ) ; 再生する前に SetPlayFinishDeleteSoundMem を呼んでしまうと、再生を開始する前に サウンドハンドルが削除されてしまう可能性がありますので注意してください
メンテ
Re: サウンドの再生について ( No.2 )
名前:丈槍由紀 日時:2016/02/16 21:33

返信遅れてすみません 今回はSetPlayFinishDeleteSoundMemで実装することにしました 画像ハンドルなどの認識もすこし取り違えていたようなので、勉強になりました。 これからはちゃんとdelete系の関数を利用しようと思います しかし、手元で確認した以上、LoadSoundMemのバッファ数を増やす引数がうまく動作しませんでした (再生中に2つめを再生し始めた時点で1つめの再生が止まり、同時に2つ以上再生されない様) .NET版をC#で使っています
メンテ
Re: サウンドの再生について ( No.3 )
名前:管理人 日時:2016/02/21 04:23

> しかし、手元で確認した以上、LoadSoundMemのバッファ数を増やす引数がうまく動作しませんでした > (再生中に2つめを再生し始めた時点で1つめの再生が止まり、同時に2つ以上再生されない様) バッファ数を増やしても同時に二つ以上再生されないという音は、 LoadSoundMem で読み込む前に SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE ) ; などを実行して ストリーミング再生タイプの音として読み込まれていますでしょうか? バッファ数の指定によって同時に二つ以上再生できるようにするためには、ストリーミングタイプではない SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMNOPRESS ) ; で読み込む必要がありますので、 もしそうでしたらストリーミングタイプではない SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMNOPRESS ) ; で 読み込むことでバッファ数の指定通りに同時に二つ以上再生できるようになると思います 因みにストリーミング再生タイプは CPU 負荷が高く、効果音など沢山同時に再生される可能性のある音の 再生には不向きですので、もし効果音をストリーミングタイプで読み込まれていましたら、 非ストリーミングタイプの DX_SOUNDDATATYPE_MEMNOPRESS で読み込むようにしてみてください m(_ _)m
メンテ
Re: サウンドの再生について ( No.4 )
名前:丈槍由紀 日時:2016/02/21 14:39

>バッファ数を増やしても同時に二つ以上再生されないという音は、 >LoadSoundMem で読み込む前に SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE ) ; などを実行して >ストリーミング再生タイプの音として読み込まれていますでしょうか? 特にそのようなことはないですね。。 確認用C#プロジェクトを用意しました ソースコードや音声ファイル、Log.txtなども同梱してあります お手数とは思いますが、ダウンロードして確認いただけると幸いです パスはDxLibです w×3 .dotup.org/uploda/w×3 .dotup.org748492.zip.html (w×3を復元してお願いします)
メンテ
Re: サウンドの再生について ( No.5 )
名前:管理人 日時:2016/02/22 01:42

確認用プロジェクトを用意していただきありがとうございます、現象を確認できました 調べてみたところ、半年ほど前から LoadSoundMem のバッファ数を増やす引数がバグで 正常に機能していなかったようです( 確認のために使用していた音が短くて同時に 再生されているか正しく判断できていませんでした… orz ) バッファ数の指定が有効になるように修正したバージョンをアップしましたので お手数で申し訳ありませんが、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: サウンドの再生について ( No.6 )
名前:丈槍由紀(解決) 日時:2016/02/24 20:10

修正ありがとうございました 無事動作を確認でき、すっきりしました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存