ご無沙汰しております。かめのこにょこにょこと申します。
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 ) ;