2015-10-03 166 views
1

我使用AVFoundationMusicPlayer在遊戲中播放MIDI音樂,我定期撥打MusicPlayerSetPlayRateScalar設置節奏。我最近將遊戲從Objective-C移植到了Swift中,從那以後,我幾次打電話給這個函數後,我一直在掛起/凍結。當凍結髮生,我暫停執行,我的主線程總是坐在下面的狀態:MusicPlayerSetPlayRateScalar在__psynch_mutexwait中導致掛起/凍結

* thread #1: libsystem_kernel.dylib`__psynch_mutexwait + 8, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP * frame #0: libsystem_kernel.dylib`__psynch_mutexwait + 8 frame #1: libsystem_pthread.dylib`_pthread_mutex_lock_wait + 96 frame #2: AudioToolbox`CAMutex::Lock() + 52 frame #3: AudioToolbox`SequencePlayer::SetTempoScaleFactor(double) + 36 frame #4: AudioToolbox`MusicPlayerSetPlayRateScalar + 136

CPU使用率跳轉到100%的時候出現這種情況,和內存的使用率開始穩步增長。我沒有任何其他線程可以運行。其他線程活動變化,但這裏有一個例子(其他線程的堆棧跟蹤的最高級別):

thread #5: libsystem_kernel.dylib`kevent_qos + 8, queue = 'com.apple.libdispatch-manager' thread #6: libsystem_kernel.dylib`__semwait_signal + 8, name = 'gputools.smt_poll.0x126fe8680' thread #10: libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.coreaudio.AQClient' thread #11: libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'AudioStreamerImpl::sIOWorkerProcess' thread #12: libc++abi.dylib`__cxa_decrement_exception_refcount + 32, name = 'AURemoteIO::IOThread' thread #13: libsystem_kernel.dylib`mach_msg_trap + 8, name = 'AURemoteIO::IOThread'

我已經猜到了某種僵局給出的互斥體和信號量,但CPU和內存使用模式似乎表明否則。我怎樣才能進一步調試呢?

(順便說一句,調試器有時會崩潰,當我在這種情況下做bt all,但我懷疑的關聯。)

+0

我打算猜測在背景上會出現某種C++ voodoo,這使得Swift無法做到這一點。有沒有可能使用新的AVAudioSequencer代替? – matt

+0

@matt Woah,我還沒有聽說過'AVAudioSequencer'(不出意外,因爲目前還沒有API文檔)。我剛剛使用它重寫了我的音樂播放器(約有1/4的代碼),並且凍結消失了。真棒! – phu

+0

很高興來到這裏!我已經給出了我的評論作爲答案,所以我們可以關閉這一個。很高興,這工作。 – matt

回答

1

的東西,蘋果的鄉親在WWDC說2015核心音頻視頻讓我覺得有很多的C++ voodoo會在幕後這樣的領域中出現,因此除非你採取了一定的預防措施(我不明白它們是什麼),否則Swift無法與之交互。在這種情況下,如果你不需要向後兼容太多,你可能想嘗試使用新的AVAudioSequencer。我發現它非常簡單可靠。