我想使我的虛擬樂器應用程序能夠在應用程序處於後臺時使用(通過MIDI鍵盤)。這可以通過將UIBackgroundModes設置爲「audio」並將AudioSessions的類別設置爲AVAudioSessionCategoryPlayback來正常工作。此外,爲了允許與音樂播放器應用混合,我設置了屬性kAudioSessionProperty_OverrideCategoryMixWithOthers。如何使用kAudioSessionProperty_OverrideCategoryMixWithOthers
爲節省電池能量,建議讓用戶在不需要的情況下關閉後臺操作。所以我的應用程序中有一個開關,用於在類別AVAudioSessionCategoryAmbient和類別AVAudioSessionCategoryPlayback(使用kAudioSessionProperty_OverrideCategoryMixWithOthers)之間切換。代碼是這樣的(錯誤處理省略):
NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient;
[session setCategory:category error:nil];
if (category == AVAudioSessionCategoryPlayback) {
UInt32 allowMixing = true;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
}
現在的問題:假設音樂應用程序正在後臺播放。用戶在前臺(通過MIDI鍵盤)彈奏虛擬樂器以伴隨音樂播放器,並決定開始另一個應用程序,比如幻燈片放映,以欣賞爲什麼要彈奏樂器。所以他/她進入我的應用程序的設置視圖,並激活後臺操作。然後執行上面的代碼。 Boom,音樂應用程序變得沉默。據我瞭解,kAudioSessionProperty_OverrideCategoryMixWithOthers屬性只能設置後設置類別,但當我將類別設置爲AVAudioSessionCategoryPlayback,音樂播放器被系統沉默,然後我有機會設置kAudioSessionProperty_OverrideCategoryMixWithOthers。
這是發生了嗎?有什麼可以做的嗎?我試圖在更改類別之前/之後禁用/激活會話,但這會導致其他問題。
馬庫斯
爲什麼你沒有傳遞到SETACTIVE?根據文檔: '參數 beActive 使用YES來激活您的應用程序的音頻會話或NO來停用它。' http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html 或者我錯過了什麼? – Marc 2013-01-17 10:28:44
我首先將NO設置爲setActive以禁用音頻會話,然後更改屬性並最終將YES傳遞給setActive以再次激活音頻會話。 – 2013-01-30 08:51:19
感謝您的幫助,對不起,我的答覆遲了一點。我在另一個應用程序中遇到了同樣的問題(使用不同的音頻類別AVAudioSessionCategoryPlayAndRecord)。事實證明,原因不是我如何配置和激活會話,而是在設置會話屬性之前初始化了音頻圖。當我第一次設置會話屬性(與其他人混合)時,然後創建音頻圖形,並在稍後將會話設置爲活動狀態,然後其他應用程序的聲音不會靜音。 – masi 2014-02-07 09:52:27