2010-10-22 44 views
2

Audio Session Cookbook有「Checking if Other Audio is Playing During App Launch」部分。iOS中,如何根據多任務處理其他音頻播放?

我使用MonoTouch的(但隨時給一個Objective-C的答案,該API是一樣的),所以從該文件的代碼看起來是這樣的:

bool otherAudioPlaying = AudioSession.OtherAudioIsPlaying; 
if(otherAudioPlaying) 
    AudioSession.Category = AudioSessionCategory.AmbientSound; 
else 
    AudioSession.Category = AudioSessionCategory.SoloAmbientSound; 

其結果是, ,如果我的應用程序是從iPod音樂播放開始的,那麼iPod音樂將繼續播放並阻止我使用硬件音頻解碼器(我不需要)。如果我的應用程序啓動時沒有播放iPod音樂,則可以使用硬件解碼器。

我可以再使用的otherAudioPlaying值,以確定是否要開始播放自己的音樂。

現在工作在不支持多任務的舊版操作系統就好了。但通過多任務處理,用戶可以離開我的應用程序(將其作爲背景),在iPod上播放音樂,然後重新輸入我的應用程序。然後,他們的iPod音樂將會消失,我的音樂將再次開始播放。

我想什麼有發生的情況是有iPod中的音樂繼續時,我的應用程序返回玩到前臺 - 即使我自己的音樂是玩(和使用硬件解碼器),當我的申請被轉到後臺。

(而且,在相反的 - 如果我的申請是在沒有音樂播放中背景,我想檢測是否我可以開始播放音樂,當它返回)。

我該怎麼做? (最好不要突然切斷我的音頻,保持好的淡出通常發生。)

編輯:我還應該指出,我正在做所有我的音頻工作脫離主線程。

+0

有什麼不對設置AudioSession.category = AVAudioSessionCategoryAmbient,不管其他音頻無論是打還是不? – 2010-10-28 17:36:08

+0

@William如果我將類別設置爲Ambient,那麼我無法將自己的解碼硬件用於我自己的音樂(並且在CPU上使用太多的CPU時間)。 – 2010-10-29 01:12:25

回答

0

爲什麼不只是在應用程序委託多任務消息中實施它呢?在後臺,暫停音頻(如果需要,存儲當前播放位置),並在應用程序恢復焦點時將其旋轉備份。

只是爲了澄清一點:響應applicationDidEnterBackground:通過重置音頻播放器狀態並響應applicationWillEnterForeground:通過將其設置爲現在的方式備份。您還可以讓設置音頻播放的對象通過NSNotificationCenter響應UIApplicationWillEnterBackgroundNotification/UIApplicationWillEnterForegroundNotification,這可能會更容易一些,而不會將您的應用完全放在應用程序委託類的背景上。

+0

我知道'applicationDidEnterBackground',我假設一個解決方案將涉及到它的響應。我試圖弄清楚什麼是「暫停你的音頻」和「重置你的音頻播放器狀態」位。 – 2010-10-25 02:22:34

+0

嗯...我想我不明白。如果這是一個關於AudioSession的問題,你知道如何啓動它,我認爲類似的方法阻止它?如果你真的不知道我會查找文檔並再次回答。在一個更平庸的層面上:我不能告訴你如何重置你的音頻播放器狀態,因爲我不知道你是如何設置它的。如果你停下來,iOS會認爲它已被重置。 – refulgentis 2010-10-25 05:02:22

+0

我的音頻播放器只是一個簡單的硬件AudioQueue,本質上就是「音頻隊列服務編程指南」中所描述的內容(除了它在不同的線程上處理到接收通知的主線程)。問題是在applicationDidEnterBackground期間與AudioQueue/AudioSession API交互會導致奇怪的行爲或崩潰。不幸的是,文檔(據我所知)沒有描述這兩部分API交互的方式。 – 2010-10-29 01:30:49

0

關於對refulgentis的回答你最後的評論,你可以暫停音樂applicationWillResignActive離開狀態保存操作和清理的applicationDidEnterBackground。這可能會更好地避免在背景過渡狀態期間出現任何異常行爲。