2011-09-08 4 views
7

어떤 오디오 장치가 iphone/ipad/ipod에 연결되어 있는지 감지하는 방법을 알아 내려고합니다. 오디오 경로 통화 및 라우트 변경 콜백에 대한 모든 정보를 알고 있지만 첨부 된 정보는 알려주지 않습니다. 오디오가 현재 라우팅되는 위치 만보고합니다. 예를 들어 오디오가 스피커를 통해 라우팅되는 동안 헤드폰 및/또는 블루투스가 계속 연결되어 있는지 알아야합니다. 또는 예를 들어 사용자가 블루투스를 사용하는 동안 헤드셋을 연결 한 다음 블루투스 연결을 끊기로 결정한 경우 오디오가 여전히 헤드폰을 통해 전달되는 경우에도 블루투스 연결이 끊어 졌음을 알아야합니다.첨부 된 오디오 장치 감지 iOS

+1

, 내 응용 프로그램이 제대로 스트림을 재생하지만 오디오 출력 (분리 헤드폰)을 변경하는 경우, 그것은 재생을 중지 .. u는 변경 될 때 오디오 출력을 감지하는 방법을 figureout 않았다? –

+2

예, 경로 변경을 감지하는 것은 AudioSessionPropertyListener 콜백을 통해 수행됩니다. 그런 다음 속성 수신기는 AudioSessionAddPropertyListener 함수를 통해 등록됩니다. 그러나 그것은 제가 위에서 한 것을 시도한 것이 아닙니다. 내 앱에서 사용자에게 사용 가능한 라우팅 옵션을 올바르게 표시하기 위해 어떤 기기가 연결되어 있는지 감지해야합니다. – Cliff

답변

0

AudioSession 속성에서 InputSources 및 OutputDestinations의 목록을 가져올 수 있습니다. 이 세션의 속성을 확인 :

kAudioSessionProperty_InputSources 
kAudioSessionProperty_OutputDestinations 

를 각각의 세부 사항을 조회하려면 사용할 수 있습니다

kAudioSessionProperty_InputSource 
kAudioSessionProperty_OutputDestination 
+0

이러한 속성은 USB 액세서리 용이므로 제 상황에는 적용되지 않습니다. 블루투스 또는 유선 헤드셋이 연결될 때이를 감지하고 있습니다. – Cliff

+0

죄송합니다. 사과드립니다. 지금 귀하의 질문에 차이가 있음을 알 수 있습니다. – MOK9

1

을에서 iOS 5의 경우에 사용한다 : 불행하게도

CFStringRef newRoute; 
size = sizeof(CFStringRef); 
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route"); 
if (newRoute) 
{ 
    CFShow(newRoute); 
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in 
      { 
      colorLevels[0] = .3;     
      colorLevels[5] = .5; 
      } 
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo) 
} 
0

iOS11 현재, 현재 연결된 출력 장치의 목록을 안정적으로 가져올 API가없는 것 같습니다. 현재 경로가 변경되면 AVAu를 통해 (현재 라우트 된) 장치 1 개만 보입니다. dioSession의 currentRoute.outputs, 여러 장치가 여전히 연결되어있을 수 있습니다. 적절한 오디오 세션 모드 (예 AVAudioSessionModeVoiceChat 또는 AVAudioSessionModeVideoChat)를 사용하는 경우

그러나, 입력 및 즉, HFP 프로파일 블루투스 장치를 포함 하나 AVAudioSession의 availableInputs, 그 비아 가능한 입력들의리스트를 얻을 수있다 해당 장치가 활성 경로가 아닌 경우에도 입력이 표시됩니다. 예를 들어 사용자가 Bluetooth에서 스피커로 MPVolumeView을 통해 수동 무시를 수행 할 때 및 HFP가 양방향 IO (두 입력이 모두 있기 때문에) 출력)를 확인한 후에는 입력을보고 출력 HFP Bluetooth를 사용할 수 있는지 여부를 판단 할 수 있습니다. 내 응용 프로그램에서 비슷한 문제가

BOOL isBtInputAvailable = NO; 
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs]; 
for (AVAudioSessionPortDescription* port in inputs) { 
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) { 
     isBtInputAvailable = YES; 
     break; 
    } 
}