トップページ > 記事閲覧
iOS版で自前ミキシングを無効にすると、DeleteSoundMemがハングする
名前:かめのこ 日時: 2025/04/10 00:25

ご無沙汰しております。かめのこにょこにょこと申します。 iOS版のソースコードを、自前ミキシングを無効にするよう改造してDXライブラリを自前ビルドした際、 この自前ビルドをしたDXライブラリを使って次のサンプルプログラムをビルド、実行すると、DeleteSoundMem から次の処理が実行されません。 #include "DxLib.h" int main() { int SHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // LoadSoundMem で読み込む音データの再生時間を2倍にする SetCreateSoundTimeStretchRate( 2.0f ) ; // test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します SHandle = LoadSoundMem( "test.wav" ) ; // 読みこんだ音をノーマル再生します(『PlaySoundMem』関数使用) PlaySoundMem( SHandle , DX_PLAYTYPE_NORMAL ) ; // サウンドハンドルの削除 DeleteSoundMem( SHandle ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } DxLib Linux版でも同様に自前ミキシングを無効にするよう改造しているようなので、同様の問題が発生する可能性があります。 github.com/dragoon2014/dxlib-for-linux/blob/main/0100-Sound-cpp.patch 原因はある程度見当がついており、自力での解決ができそうではありますが、なかなか作業時間が取れないので、修正に関しては追ってお知らせします。 もし管理者様にこの修正に関して力添えただけるようでしたら幸いでございます。 iOS版ではすでに自前ミキシングが行われており、この現象が発生しないようですが、自身の開発している HTML5版のほかにも影響がありそうなので、 この掲示板での投稿をもって共有させていただきました。 以下より原因調査のメモを共有いたします。 - - - - - - - - - CriticalSection_Lock に次のログ出力処理を仕掛けて取得したログです。 DWORD_PTR ThreadID = Thread_GetCurrentId() ; static const char *LastFilePath = NULL ; static int LastLineNo = 0 ; if (LastFilePath != FilePath || LastLineNo != LineNo) { LastFilePath = FilePath ; LastLineNo = LineNo ; printf( "CriticalSection_Lock: %s %d (pCSection: %p, Thread:%d)\n", FilePath, LineNo, pCSection, ThreadID ) ; } CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 688 (pCSection: 0x4fd884, Thread:48169520) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 625 (pCSection: 0x4fd768, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 390 (pCSection: 0x69eebc, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 636 (pCSection: 0x69ee90, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 518 (pCSection: 0x2917644, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/DxASyncLoad.cpp 1051 (pCSection: 0x2dd694, Thread:6970352) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 625 (pCSection: 0x4fd768, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 390 (pCSection: 0x69eebc, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 636 (pCSection: 0x69ee90, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 518 (pCSection: 0x2917644, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 256 (pCSection: 0x69ee90, Thread:48036160) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/HTML5/DxSoundHTML5.cpp 666 (pCSection: 0x4fd768, Thread:48169520) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/DxASyncLoad.cpp 1051 (pCSection: 0x2dd694, Thread:6970352) index.js:9972:14 CriticalSection_Lock: /home/owner/Repository/DxLibForHTML5/src/DxHandle.cpp 391 (pCSection: 0x4fd768, Thread:6970352) DxSoundHTML5.cpp 636行目 (関数 ALBufferPlayThreadFunction) と 256行目 (関数 SoundBuffer_Sub_PlaySoundBufferList) で同じ Mutex に対してロックを取得しようとしており、 サウンド再生スレッドがハング、それにつられて別のスレッドもハングしていることが原因とみています。 CRITICALSECTION_LOCK( &SoundSysData.PF.PlaySoundBufferCriticalSection ) ;
メンテ

Page: 1 |

Re: iOS版で自前ミキシングを無効にすると、DeleteSoundMemがハングする ( No.1 )
名前:かめのこ 日時:2025/04/10 23:35

pthread_mutex_init で PTHREAD_MUTEX_RECURSIVE を指定しているのに変だと思いましたら、メモリ破壊を起こしていたようです。 取り急ぎ報告まで。
メンテ
Re: iOS版で自前ミキシングを無効にすると、DeleteSoundMemがハングする ( No.2 )
名前:管理人 日時:2025/04/11 04:30

お久しぶりです > iOS版のソースコードを、自前ミキシングを無効にするよう改造してDXライブラリを自前ビルドした際、 > この自前ビルドをしたDXライブラリを使って次のサンプルプログラムをビルド、実行すると、DeleteSoundMem から次の処理が実行されません。 iOS版は自前ミキシングに完全に移行していて OpenAL をメインで使用する従来のコードは未メンテナンスなので正常に動作しなくてもおかしくは無い状態です… 調べるのに少し時間がかかりそうなので週末に確認してみます > DxSoundHTML5.cpp 636行目 (関数 ALBufferPlayThreadFunction) と 256行目 (関数 SoundBuffer_Sub_PlaySoundBufferList) で同じ Mutex に対してロックを取得しようとしており、 > サウンド再生スレッドがハング、それにつられて別のスレッドもハングしていることが原因とみています。 複数のスレッドで同じデータに対してアクセスしようとするのを防ぐのが Mutex の役目なので、 同時に Mutex のロックを取得しようとするのは普通の動作です( 後からロックしようとした方は 先にロックした方がロックを解除するまで待たされます ) 問題なのは先に Mutex のロックを取得した処理がいつまでもロックを解除しないことなので、 CriticalSection_Unlock でもログ出力をするようにしてロックを取得したのに解除していない 箇所が無いかを確認する必要があると思います > pthread_mutex_init で PTHREAD_MUTEX_RECURSIVE を指定しているのに変だと思いましたら、メモリ破壊を起こしていたようです。 すみません、こちらはどちらの箇所についての言及でしょうか?
メンテ
Re: iOS版で自前ミキシングを無効にすると、DeleteSoundMemがハングする ( No.3 )
名前:かめのこ 日時:2025/04/11 23:17

原因が判明しました。プラットフォーム固有のサウンドシステムデータ構造体中のクリティカルセクション PlaySoundBufferCriticalSection に対する初期化処理/解放処理が漏れていました。 次の1行をサウンド初期化関数 InitializeSoundSystem_PF_Timing0 (DxSoundiOS.cpp 704行目〜) に追加したところ、DeleteSoundMem より後の処理が実行されるようになりました。 CriticalSection_Initialize( &SoundSysData.PF.PlaySoundBufferCriticalSection ) > 複数のスレッドで同じデータに対してアクセスしようとするのを防ぐのが Mutex の役目なので、 > 同時に Mutex のロックを取得しようとするのは普通の動作です( 後からロックしようとした方は > 先にロックした方がロックを解除するまで待たされます ) > > pthread_mutex_init で PTHREAD_MUTEX_RECURSIVE を指定しているのに変だと思いましたら、メモリ破壊を起こしていたようです。 > > すみません、こちらはどちらの箇所についての言及でしょうか? 関数 CriticalSection_Initialize (DxThreadiOS.cpp 310行目付近〜) 中の以下の処理を指したつもりでした // 再帰ロック可能にする if( pthread_mutexattr_settype( &pCSection->Mutexattr, PTHREAD_MUTEX_RECURSIVE ) != 0 ) { goto ERR ; } PTHREAD_MUTEX_RECURSIVE を指定することで、クリティカルセクションを取得した後、同一のスレッドがそのクリティカルセクションを再度取得する場合は ブロックしないようにできるそうです。(この不具合の原因調査で初めて知りました。) 今回、pthread_mutex の内部変数の変化を追いながらデバッグを行っており、フラグ PTHREAD_MUTEX_RECURSIVE が途中からリセットされているように見えたのでメモリ破壊と勘違いいたしました。 失礼いたしました。
メンテ
Re: iOS版で自前ミキシングを無効にすると、DeleteSoundMemがハングする ( No.4 )
名前:管理人 日時:2025/04/12 02:40

> 原因が判明しました。プラットフォーム固有のサウンドシステムデータ構造体中のクリティカルセクション PlaySoundBufferCriticalSection に対する初期化処理/解放処理が漏れていました。 > 次の1行をサウンド初期化関数 InitializeSoundSystem_PF_Timing0 (DxSoundiOS.cpp 704行目〜) に追加したところ、DeleteSoundMem より後の処理が実行されるようになりました。 ご情報ありがとうございます なんと、ご指摘いただいた初期化どころか後始末もしていませんでした… InitializeSoundSystem_PF_Timing0 に初期化、TerminateSoundSystem_PF_Timing1 に後始末の処理を追加しました 修正後のソースをこちらにアップしましたので、もしご必要でしたらダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース > 今回、pthread_mutex の内部変数の変化を追いながらデバッグを行っており、フラグ PTHREAD_MUTEX_RECURSIVE が途中からリセットされているように見えたのでメモリ破壊と勘違いいたしました。 > 失礼いたしました。 なるほど、了解しました
メンテ
Re: iOS版で自前ミキシングを無効にすると、DeleteSoundMemがハングする ( No.5 )
名前:かめのこ (解決) 日時:2025/04/13 23:36

> ご情報ありがとうございます > なんと、ご指摘いただいた初期化どころか後始末もしていませんでした… > InitializeSoundSystem_PF_Timing0 に初期化、TerminateSoundSystem_PF_Timing1 に後始末の処理を追加しました > 修正後のソースをこちらにアップしましたので、もしご必要でしたらダウンロードしてください m(_ _;m 早速の改修ありがとうございます。修正後のソースを早速活用させていただきます。
メンテ

Page: 1 |

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

   クッキー保存