2011-01-13 2 views
2

마이크가 연결되면 내 응용 프로그램은 내장 마이크에서 녹음을 계속합니다 (플러그인 마이크를 사용하고 싶습니다). 나는 다음을 사용하고있다 :iOS에서 AVAudioRecorder와 함께 작동하는 헤드셋 마이크 받기

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err]; 

대기열 서비스 나 그와 같이 간단한 것을 더 깊게 피하려고한다.

가 (사과 문서에) 몇 가지 조사를 수행 한 후 내가 큐와 함께 할 수있는 방법을 찾을 수 있습니다 ... 나는 모든이 작업을 수행하는 방법을 알아낼 수 없습니다

추가 연구 후. 어떤 사과 설명서 나 상수 등에서도 언급되지 않았습니다. "FiRe"라고하는 응용 프로그램이있어서 가능하다는 것을 알고 있습니다.

+0

이상한, 내가 여기에 읽고있다 것과 http://stackoverflow.com/questions/4002133/forcing-iphone-microphone-as-audio-input 나는 자동으로 전환 할 기본적으로 그것을 기대한다. –

+0

실제로 녹음을 중지하고 경로 변경을 인식하기 위해 다시 시작해야 할 수도 있지만 – russbishop

답변

0

나는 이것이 낡은 질문이지만, 어쨌든 누군가가 이것으로 도움이 될 것이라고 생각했습니다.

어쩌면 당신의 문제를 정말로 이해하지 못하고 있습니다. 내장 마이크를 사용하여 녹음을하고 헤드셋의 플러그가 꽂혀있을 때 헤드셋에서 녹음을 원활하게 전환하고 싶습니까? 아니면 단순히 헤드셋으로 녹음하는 데 어려움을 겪고 있습니까?

이 코드를 사용하여 라우팅 문제를 직접 디버깅합니다. 앱으로 놀고, 헤드셋을 연결하고 콘솔에 무엇이 로그 아웃되는지보십시오. 연결 한 헤드셋이 "HeadsetInOut"경로를 변경하도록하십시오. "헤드폰"만 있다면 헤드셋에서 사운드를 재생하지만 내장 마이크에서 녹음 할 수 있습니다.

AudioQueues를 사용하여 헤드셋에서 녹음 할 때 전혀 문제가 없었습니다.

void interruptionListener( void * inClientData, 
          UInt32 inInterruptionState) 
{ 
    if (inInterruptionState == kAudioSessionBeginInterruption) { 
     // handle interruption 
    } 
    else if (inInterruptionState == kAudioSessionEndInterruption) { 
     // handle interruption 
    } 
} 

void propListener( void *     inClientData, 
        AudioSessionPropertyID inID, 
        UInt32     inDataSize, 
        const void *   inData) 
{ 
    FooBar *self = (__bridge FooBar*)inClientData; 

    if (inID == kAudioSessionProperty_AudioRouteChange) { 
     CFDictionaryRef routeDictionary = (CFDictionaryRef)inData;   

     CFNumberRef reason = (CFNumberRef)CFDictionaryGetValue(routeDictionary, CFSTR(kAudioSession_AudioRouteChangeKey_Reason)); 
     SInt32 reasonVal; 

     CFNumberGetValue(reason, kCFNumberSInt32Type, &reasonVal); 
     if (reasonVal != kAudioSessionRouteChangeReason_CategoryChange) { 
      // Check the old route 

      CFStringRef oldRoute = (CFStringRef)CFDictionaryGetValue(routeDictionary, CFSTR(kAudioSession_AudioRouteChangeKey_OldRoute)); 
      if (oldRoute) { 
       NSLog(@"Changed audio route from route:"); 
       CFShow(oldRoute); 
      } else { 
       NSLog(@"Error getting old audio route.\n"); 
      } 

      CFStringRef newRoute; 
      UInt32 size; size = sizeof(CFStringRef); 
      OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute); 
      if (error) { 
       NSLog(@"Error getting new audio route: %ld\n", error); 
      } 
      else { 
       NSLog(@"Changed audio route to:\n"); 
       CFShow(newRoute); 

       if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), 0) == kCFCompareEqualTo) 
       { 
        // you can do some recording, yay. 
       } 
      } 

      if (reasonVal == kAudioSessionRouteChangeReason_OldDeviceUnavailable) 
      { 
       NSLog(@"kAudioSessionRouteChangeReason_OldDeviceUnavailable"); 
      } 
     } 
    } 
} 

-(id) init 
{ 
    self = [super init]; 
    if (self) { 
     OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, (__bridge void *)(self)); 
     if (error) 
     { 
      NSLog(@"Error initializing audio session: %ld\n", error); 
     } else {    
      error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, (__bridge void *)(self)); 
      if (error) { 
       NSLog(@"Error adding audio session property listener (route change): %ld\n", error); 
      } 

      UInt32 inputAvailable = 0; 
      UInt32 size = sizeof(inputAvailable); 

      error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable); 
      if (error) { 
       NSLog(@"Error getting input availability: %ld\n", error); 
      } 

      error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, (__bridge void *)(self)); 
      if (error) { 
       NSLog(@"Error adding audio session property listener (input availability): %ld\n", error); 
      } 

      // Activate the session 
      error = AudioSessionSetActive(true); 
      if (error) { 
       NSLog(@"Failed to activate audio session: %ld\n", error); 
      }    
     } 
    } 
    return self; 
} 
관련 문제