android平台下 AudioDecoderMp3 引起不可预测崩溃

AudioDecoderMp3::decodeToPcm方法工作在异步线程的,decodeToPcm方法里有调用_fileData = FileUtils::getInstance()->getDataFromFile(_url);最终会调用FileUtilsAndroid::getContents方法,而FileUtilsAndroid::getContents方法里会调用Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(EVENT_BEFORE_READ_FILE);
如果同时开始加载多个mp3文件,会出现偶尔会出现崩溃,或者其他不可预知问题。
@dumganhar 请帮忙看一下。

1赞

11-08 16:36:31.180 31078-31227/com.eyu.piano V/AudioPlayerProvider: AudioPlayerProvider::preloadEffect: (/data/user/0/com.eyu.piano/files/piano/res/music/sound_07.mp3)
11-08 16:36:31.180 31078-31227/com.eyu.piano V/AudioDecoderProvider: url:/data/user/0/com.eyu.piano/files/piano/res/music/sound_07.mp3, extension:.mp3
11-08 16:36:31.180 31078-31226/com.eyu.piano V/AudioPlayerProvider: AudioPlayerProvider::preloadEffect: (/data/user/0/com.eyu.piano/files/piano/res/music/sound_08.mp3)
11-08 16:36:31.180 31078-31226/com.eyu.piano V/AudioDecoderProvider: url:/data/user/0/com.eyu.piano/files/piano/res/music/sound_08.mp3, extension:.mp3
11-08 16:36:31.180 31078-31226/com.eyu.piano V/AudioDecoderMp3: Create AudioDecoderMp3
11-08 16:36:31.180 31078-31227/com.eyu.piano V/AudioDecoderMp3: Create AudioDecoderMp3
11-08 16:36:31.180 31078-31226/com.eyu.piano D/cocos2d-x debug info: [LUA-print] ASSERT FAILED ON LUA EXECUTE: _inDispatch should be 1 here.
stack traceback:
[string “/data/user/0/com.eyu.piano/files/piano/src/piano/battle/logic/SoundManager.luac”]:309: in function ‘preloadEffect’
[string “/data/user/0/com.eyu.piano/files/piano/src/piano/battle/logic/SoundManager.luac”]:64: in function ‘init’
[string “/data/user/0/com.eyu.piano/files/piano/src/piano/PianoGame.luac”]:116: in function ‘initGame’
[string “/data/user/0/com.eyu.piano/files/piano/src/piano/piano.luac”]:32: in main chunk
[C]: in function ‘require’
[string “src/launch/Launcher.luac”]:24: in function <[string “src/launch/Launcher.luac”]:17>
11-08 16:36:31.180 31078-31226/com.eyu.piano D/cocos2d-x debug info: FrameBuffer Status Error 0
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: skipped ID3 tag, new starting offset is 4096 (0x0000000000001000)
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: subsequent header is fffba260
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: found subsequent frame #2 at 4618
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: subsequent header is fffba060
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: found subsequent frame #3 at 5141
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: subsequent header is fffba260
11-08 16:36:31.180 31078-31227/com.eyu.piano V/mp3reader: found subsequent frame #4 at 5663

参考一下:https://github.com/cocos2d/cocos2d-x/pull/18165

或者升级到3.16

EventDispatcher应该是非线程安全的吧?

嗯,非线程安全。

为什么EventDispatcher允许跨线程调用,但是又不允许多线程同时调用。如果改为只允许gl线程调用,是不是会更好一点?

另外一个UrlAudioPlayer的问题,请帮忙看一下。
11-08 16:06:01.110 26733-26834/com.eyu.piano V/UrlAudioPlayer: UrlAudioPlayer::destroy() 0xad020518
11-08 16:06:01.240 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
11-08 16:06:01.260 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
11-08 16:06:01.290 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
11-08 16:06:01.330 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
11-08 16:06:01.380 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
11-08 16:06:01.480 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
11-08 16:06:01.480 26733-27094/com.eyu.piano W/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread 0xd0859930 (tid 27094) sees object 0xacf333c0 was locked by pthread 0xd7939930 (tid 26834) at frameworks/wilhelm/src/itf/IObject.c:411

这个是在UrlAudioPlayer::destroy()的时候出现,出现几率较低。只碰到了一次

嗯,你看我PR中直接用了函数调用,那个函数里面是直接设置一个静态变量,而且只有这个地方设置,所以不会造成线程问题。直接用EventDispatcher的确会有问题的。

这块的确[quote=“moziguang, post:7, topic:53010”]
另外一个UrlAudioPlayer的问题,请帮忙看一下。11-08 16:06:01.110 26733-26834/com.eyu.piano V/UrlAudioPlayer: UrlAudioPlayer::destroy() 0xad02051811-08 16:06:01.240 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 11011-08 16:06:01.260 26733-27094/com.eyu.piano E/libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:412: pthread_mutex_lock_timeout_np returned 110
[/quote]

这个问题目前没有太好的招,应该是play后在短时间内stop触发的系统底层死锁的问题。
目前只能通过上层游戏代码stop的时候稍微延时一点的方式绕过去。