2012-04-16 14 views
7

我想使我的虛擬樂器應用程序能夠在應用程序處於後臺時使用(通過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。

這是發生了嗎?有什麼可以做的嗎?我試圖在更改類別之前/之後禁用/激活會話,但這會導致其他問題。

馬庫斯

回答

16

你可以做到這一點。其原理是首先停用音頻會話,設置音頻會話的所有屬性,然後設置活動音頻會話。這樣,在其他應用程序中播放的音樂將不會消失。

// Initialize audio session 
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 

// Active your audio session 
[audioSession setActive: NO error: nil]; 

// Set audio session category 
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; 

// Modifying Playback Mixing Behavior, allow playing music in other apps 
OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 

propertySetError = AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryMixWithOthers, 
         sizeof (allowMixing), 
         &allowMixing); 

// Active your audio session 
[audioSession setActive: YES error: nil]; 

此解決方案適用於我。但是根據你的描述,你提到你在更改類別之前/之後嘗試激活/停用會話,但導致其他問題。你是否以與上述完全相同的方式進行了停用/激活?如果是這樣,請提供更多關於其他問題的信息,也許我可以提供幫助。

+0

爲什麼你沒有傳遞到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

+0

我首先將NO設置爲setActive以禁用音頻會話,然後更改屬性並最終將YES傳遞給setActive以再次激活音頻會話。 – 2013-01-30 08:51:19

+2

感謝您的幫助,對不起,我的答覆遲了一點。我在另一個應用程序中遇到了同樣的問題(使用不同的音頻類別AVAudioSessionCategoryPlayAndRecord)。事實證明,原因不是我如何配置和激活會話,而是在設置會話屬性之前初始化了音頻圖。當我第一次設置會話屬性(與其他人混合)時,然後創建音頻圖形,並在稍後將會話設置爲活動狀態,然後其他應用程序的聲音不會靜音。 – masi 2014-02-07 09:52:27

17

由於iOS的6.0你可以使用

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; 
+1

並返回到非混合: '[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:0 error:nil];' – StilesCrisis 2016-02-24 00:22:29

-6

我有M0rph3v5不同意。

爲withOptions參數的唯一有效值爲AVAudioSessionInterruptionOptionShouldResume

+1

你錯了:http://developer.apple.com/library/ios/documentation/ AVCoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html#// apple_ref/doc/c_ref/AVAudioSessionCategoryOptions – Joshua 2013-04-27 12:30:50

+0

在xcode中試用它。如果您使用AVAudioSessionInterruptionOptionShouldResume以外的其他任何內容,則會出現編譯錯誤。 – 2013-05-08 21:23:14