Forcing iPhone Microphone as Audio Input

后端 未结 5 1372
深忆病人
深忆病人 2020-12-03 08:16

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

5条回答
  •  南方客
    南方客 (楼主)
    2020-12-03 09:11

    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)

提交回复
热议问题