I am developing an iOS application (targetted specifically for iPhone, at the moment) that requires the application to record audio only from iPhone internal microph
Since apple changed the audio system again starting from 7.0 I'm going to post the update-ed code over here:
#pragma mark Route change listener
// *********************************************************************************************************
// *********** Route change listener ***********************************************************************
// *********************************************************************************************************
-(void)routeChanged:(NSNotification*)notification {
NSLog(@"]-----------------[ Audio Route Change ]--------------------[");
AVAudioSession *session = [AVAudioSession sharedInstance];
//AVAudioSessionRouteDescription* prevRoute = [[notification userInfo] objectForKey:AVAudioSessionRouteChangePreviousRouteKey];
// Reason
NSInteger reason = [[[notification userInfo] objectForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (reason) {
case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
NSLog(@"] Audio Route: The route changed because no suitable route is now available for the specified category.");
break;
case AVAudioSessionRouteChangeReasonWakeFromSleep:
NSLog(@"] Audio Route: The route changed when the device woke up from sleep.");
break;
case AVAudioSessionRouteChangeReasonOverride:
NSLog(@"] Audio Route: The output route was overridden by the app.");
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
NSLog(@"] Audio Route: The category of the session object changed.");
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
NSLog(@"] Audio Route: The previous audio output path is no longer available.");
break;
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
NSLog(@"] Audio Route: A preferred new audio output path is now available.");
break;
case AVAudioSessionRouteChangeReasonUnknown:
NSLog(@"] Audio Route: The reason for the change is unknown.");
break;
default:
NSLog(@"] Audio Route: The reason for the change is very unknown.");
break;
}
// Output
AVAudioSessionPortDescription *output = [[session.currentRoute.outputs count]?session.currentRoute.outputs:nil objectAtIndex:0];
if ([output.portType isEqualToString:AVAudioSessionPortLineOut]) {
NSLog(@"] Audio Route: Output Port: LineOut");
}
else if ([output.portType isEqualToString:AVAudioSessionPortHeadphones]) {
NSLog(@"] Audio Route: Output Port: Headphones");
}
else if ([output.portType isEqualToString:AVAudioSessionPortBluetoothA2DP]) {
NSLog(@"] Audio Route: Output Port: BluetoothA2DP");
}
else if ([output.portType isEqualToString:AVAudioSessionPortBuiltInReceiver]) {
NSLog(@"] Audio Route: Output Port: BuiltInReceiver");
}
else if ([output.portType isEqualToString:AVAudioSessionPortBuiltInSpeaker]) {
NSLog(@"] Audio Route: Output Port: BuiltInSpeaker");
}
else if ([output.portType isEqualToString:AVAudioSessionPortHDMI]) {
NSLog(@"] Audio Route: Output Port: HDMI");
}
else if ([output.portType isEqualToString:AVAudioSessionPortAirPlay]) {
NSLog(@"] Audio Route: Output Port: AirPlay");
}
else if ([output.portType isEqualToString:AVAudioSessionPortBluetoothLE]) {
NSLog(@"] Audio Route: Output Port: BluetoothLE");
}
else {
NSLog(@"] Audio Route: Output Port: Unknown: %@",output.portType);
}
// Input
AVAudioSessionPortDescription *input = [[session.currentRoute.inputs count] ? session.currentRoute.inputs:nil objectAtIndex:0];
if ([input.portType isEqualToString:AVAudioSessionPortLineIn]) {
NSLog(@"] Audio Route: Input Port: LineIn");
}
else if ([input.portType isEqualToString:AVAudioSessionPortBuiltInMic]) {
NSLog(@"] Audio Route: Input Port: BuiltInMic");
}
else if ([input.portType isEqualToString:AVAudioSessionPortHeadsetMic]) {
NSLog(@"] Audio Route: Input Port: HeadsetMic");
}
else if ([input.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) {
NSLog(@"] Audio Route: Input Port: BluetoothHFP");
}
else if ([input.portType isEqualToString:AVAudioSessionPortUSBAudio]) {
NSLog(@"] Audio Route: Input Port: USBAudio");
}
else if ([input.portType isEqualToString:AVAudioSessionPortCarAudio]) {
NSLog(@"] Audio Route: Input Port: CarAudio");
}
else {
NSLog(@"] Audio Input Port: Unknown: %@",input.portType);
}
NSLog(@"]--------------------------[ ]-----------------------------[");
}
Remember to add observer since the audio session's delegate is deprecated too:
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(audioInterruption:)
name: AVAudioSessionInterruptionNotification
object: nil];
PS: you dont need to reset the category here (as in 6.0)