- (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;
}
- (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];
}