2013-10-24 2 views
1

내 iPhone 앱에서 이어폰을 연결하거나 뽑을 가능성이있는 이어폰에서 눈을 떼지 않고 올바르게 반응하기 위해, 나는 내 수업의 몇 가지에, 다음 코드 종류를 사용하십시오 rvcHandleRouteChange의 콜백 기능이 특별한 이유없이 호출됩니다 한 경우를 제외하고, 오히려 잘 작동하는 것 같다AudioSessionAddProperty 리스너 콜백 함수가 아무 이유없이 호출되었습니다.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    ….. 
    routeChangeID=kAudioSessionProperty_AudioRouteChange; 
    AudioSessionAddPropertyListener(routeChangeID,rvcHandleRouteChange,(__bridge void *)(self)); 
} 

……. 

void rvcHandleRouteChange(void *inUserData,AudioSessionPropertyID inPropertyID, 
          UInt32 inPropertyValueSize,const void *inPropertyValue) 
{ 
    NSLog(@"Hi rvcHandleRouteChange has been called."); 
    if (inPropertyID!=kAudioSessionProperty_AudioRouteChange) NSLog(@"WRONG CALL!!!"); 
    // Do some useful work …. 
} 

. 테스트를 통해 잘못된 전화를 걸러 내더라도 "잘못된 전화"로 보이는 것은 없습니다. 나는 이어폰을 꽂거나 뽑는 것이 나없이 불리는 것을 의미한다. 이로 인해 많은 문제가 발생합니다.

누구나 왜 이런 일이 일어날 수 있는지 알고 있습니까?

답변

1

1 : 경로 변경 호출이 두 번 발생할 수 있습니다. 예를 들어 헤드폰을 연결 한 경우 (동일한 경로 변경 이유 코드).

2 : 오디오 세션을 활성화하면 RouteChange가 호출됩니다. 적어도 한 번은 의미합니다.

아마도 오디오 세션을 활성화/비활성화 할 때 오디오 중단을 구현하고 계십니까? 여기

는 [iOS7에 업데이트] 어떤 사용 (내가 playAndRecord 범주를 사용)에 대한 내 노선 변경 청취자입니다 :

#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(@"]--------------------------[ ]-----------------------------["); 

} 

오디오 세션의 위임이 너무되지 않기 때문에 관찰자를 추가해야합니다 :

[[NSNotificationCenter defaultCenter] addObserver: self 
               selector: @selector(audioInterruption:) 
                name: AVAudioSessionInterruptionNotification 
                object: nil]; 
iOS 8 시뮬레이터에서
+0

을 변경해야합니다. if (CFArrayGetCount (outputs)> 0) : if (출력 && CFArrayGetCount (outputs)> 0) –

관련 문제