AVAudioSession 藍牙支持源碼session
增長AVAudioSession藍牙的支持實際上比你想象的代碼要少的多。事實上,整個audio session API很簡單,以致於開發要麼很容易要麼異常困難。猜猜哪一個分類AVAudioSession藍牙支持集成?ide
據我所知增長藍牙到AVAudioSession包括不少特性。讓咱們逐一展開:學習
打開bluetooth audioui
首先,你須要明確地通知AVAudioSession你容許聲音能夠被輸出到藍牙設備。如下是設定你的聲音類別:spa
[session setCategory:AVAudioSessionCategoryPlayAndRecord
.net
withOptions:AVAudioSessionCategoryOptionAllowBluetooth
error:&error];
AVAudioSessionCategoryPlayAndRecord 意思是擁有播放和錄音的功能。線程
總之,咱們感興趣的是可選的參數。code
經過增長AVAudioSessionCategoryOptionAllowBluetooth, 咱們容許iOS經過藍牙音頻設備來播放咱們App的聲音。對象
注:我已經見過在一個項目中屢次設置了AVAudioSession類別。不要輕易地使用setCategory是我從iOS中學習到的關於audio的知識。ip
實際上,在大多數狀況下,你只須要設置一次。爲何?首先它是一個複雜的操做。
若是它在主線程中被執行,它將使你失去一秒鐘的UI響應。更重要的是,處處設置category將致使奇怪的行爲-你將沒法知道在何時audio將送達揚聲器或耳麥……
在audio route中轉換
當你在實現AVAudioSession藍牙功能的時候,你可能但願能夠切換音頻設備。
惋惜,在文檔中彷佛沒有一個清晰的定義方法。
不過有不少方法來實現。然而,我找到的最可行的方法是設置preferred audio input.
如下是例子:
Switching to bluetooth
- (AVAudioSessionPortDescription*)bluetoothAudioDevice
{
NSArray
* bluetoothRoutes = @[AVAudioSessionPortBluetoothA2DP, AVAudioSessionPortBluetoothLE, AVAudioSessionPortBluetoothHFP];
return
[
self
audioDeviceFromTypes:bluetoothRoutes];
}
- (AVAudioSessionPortDescription*)builtinAudioDevice
{
NSArray
* builtinRoutes = @[AVAudioSessionPortBuiltInMic];
return
[
self
audioDeviceFromTypes:builtinRoutes];
}
- (AVAudioSessionPortDescription*)speakerAudioDevice
{
NSArray
* builtinRoutes = @[AVAudioSessionPortBuiltInSpeaker];
return
[
self
audioDeviceFromTypes:builtinRoutes];
}
- (AVAudioSessionPortDescription*)audioDeviceFromTypes:(
NSArray
*)types
{
NSArray
* routes = [[AVAudioSession sharedInstance] availableInputs];
for
(AVAudioSessionPortDescription* route
in
routes)
{
if
([types containsObject:route.portType])
{
return
route;
}
}
return
nil
;
}
- (
BOOL
)switchBluetooth:(
BOOL
)onOrOff
{
NSError
* audioError =
nil
;
BOOL
changeResult =
NO
;
if
(onOrOff ==
YES
)
{
AVAudioSessionPortDescription* _bluetoothPort = [
self
bluetoothAudioDevice];
changeResult = [[AVAudioSession sharedInstance] setPreferredInput:_bluetoothPort
error:&audioError];
}
else
{
AVAudioSessionPortDescription* builtinPort = [
self
builtinAudioDevice];
changeResult = [[AVAudioSession sharedInstance] setPreferredInput:builtinPort
error:&audioError];
}
return
changeResult;
}
Switching to speaker
- (
BOOL
)switchSpeaker:(
BOOL
)onOrOff
{
NSError
* audioError =
nil
;
BOOL
changeResult =
NO
;
if
(onOrOff ==
YES
)
{
changeResult = [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&audioError];
}
else
{
AVAudioSessionPortDescription* builtinPort = [
self
builtinAudioDevice];
changeResult = [[AVAudioSession sharedInstance] setPreferredInput:builtinPort
error:&audioError];
}
return
changeResult;
}
Switching to earpiece
- (
BOOL
)switchEarphone:(
BOOL
)onOrOff
{
return
[
self
switchSpeaker:!onOrOff];
}
AVAudioSession藍牙支持是一個使人卻步的工做。
並且在網上也沒有太多介紹它的信息。
我但願這篇文章可以幫助到你。