開發過程中錄音和播放這塊碰到了一些問題,麻煩的主要有三個: 檢測是否有聲音輸入裝置 當有多個聲音輸出裝置時,指定聲音輸出裝置 檢測耳機的插入和拔出
第一個問題,對於iTouch和iPad等本身不帶麥克風的裝置,需要檢查是否插入了帶錄音功能的耳機;對於iphone,由於其本身已近內建麥克風,所以相對容易。第二個問題,當在本身帶有外放的裝置上插入耳機等輸出裝置時,就出現了多個輸出裝置,需要實現在程式中指定將聲音輸出到哪裡。第三個問題,插入/拔出耳機必然引起聲音輸出裝置的變化,而如果是在iTouch和iPad上插入/拔出了帶麥克風的耳機,則必然引起聲音輸入裝置的變化。
1. 檢測聲音輸入裝置
[plain] view plain copy print ? - (BOOL)hasMicphone { return [[AVAudioSession sharedInstance] inputIsAvailable]; } 2. 檢測聲音輸出裝置
對於輸出裝置的檢測,我們只考慮了2個情況,一種是裝置自身的外放(iTouch/iPad/iPhone都有),一種是當前是否插入了帶外放的耳機。iOS已經提供了相關方法用於擷取當前的所有聲音裝置,我們只需要檢查在這些裝置中是否存在我們所關注的那幾個就可以了。
擷取當前所有聲音裝置:
[plain] view plain copy print ? CFStringRef route; UInt32 propertySize = sizeof(CFStringRef); AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route); 在iOS上所有可能的聲音裝置包括:
[cpp] view plain copy print ? /* Known values of route: * "Headset" * "Headphone" * "Speaker" * "SpeakerAndMicrophone" * "HeadphonesAndMicrophone" * "HeadsetInOut" * "ReceiverAndMicrophone"