2014-06-23 8 views
3

통화 도중 pjsip 2.2 라이브러리를 사용하여 내부 스피커에서 iOS 장치의 시끄러운 스피커로 음성을 전환하려고합니다. TRUE를 성공으로 반환하지만 물리적으로 사운드 대상을 변경하지 않습니다. 우리가이 일을 할 수있는 방법 iOS pjsip 2.2 시끄러운 스피커 스위치가 작동하지 않습니다.

나는

- (BOOL)setLoud:(BOOL)loud { 
if (loud) { 
    @try { 

     pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER; 

     pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, 
                 &route, PJ_TRUE); 
     if (pj_status == PJ_SUCCESS) { 
      return YES; 
     } 
     else 
     { 
      return NO; 
     } 

    } 
    @catch (NSException *exception) { 
     return NO; 
    } 
} else { 
    @try { 
     pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_EARPIECE; 

     pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, 
                 &route, PJ_TRUE); 
     if (pj_status == PJ_SUCCESS) { 
      return YES; 
     } 
     else 
     { 
      return NO; 
     } 
    } 
    @catch (NSException *exception) { 
     return NO; 
    } 
} 
} 

당신이 제안 할 수 다음 코드를 사용?

답변

4

iOS 7이 출시되면서 AVAudioSession을 사용하여 오디오 관리를 처리해야합니다. 마침내이 작업을 수행하는 데 오랜 시간이 걸렸지 만 마침내 내 오디오가 내 iPhone Speaker로 자동 라우팅되지 않는 문제를 파악했습니다. 문제는 호출에 응답 할 때 호출에 응답하기 전에 수행중인 AVAudioSessionPortOverride를 pjsip이 자동으로 재정의했습니다. 이 문제를 해결하려면 출력 오디오 포트 AFTER을 무시하고 호출에 응답해야합니다.

내 VoIP 응용 프로그램을 백그라운드 모드로 효율적으로 작동 시키려면 on_call_state라는 사용자 지정 콜백 메서드에서 오디오 라우팅을 처리하기로 결정했습니다. 호출 상태가 변경되면이 메소드 on_call_state가 pjsip에 의해 호출됩니다. 여기에서 읽을 수 있듯이 http://www.pjsip.org/pjsip/docs/html/group__PJSIP__INV.htm에는 통화 상태가 변경되었을 때 확인할 수있는 다양한 플래그가 있습니다. 이 예제에서 사용한 상태는 입니다. PJSIP_INV_STATE_CONNECTINGPJSIP_INV_STATE_DISCONNECTED입니다.

오디오 통화가 다른 피어에 연결될 때 PJSIP_INV_STATE_CONNECTING이 호출됩니다.

PJSIP_INV_STATE_DISCONNECTED은 오디오 통화가 다른 피어와 함께 종료 될 때 호출됩니다.

static void on_call_state(pjsua_call_id call_id, pjsip_event *e) 
{ 
    pjsua_call_info ci; 

    PJ_UNUSED_ARG(e); 

    pjsua_call_get_info(call_id, &ci); 
    PJ_LOG(3,(THIS_FILE, "Call %d state=%.*s", call_id, 
       (int)ci.state_text.slen, 
       ci.state_text.ptr)); 
    if (ci.state == PJSIP_INV_STATE_CONNECTING) { 
     BOOL success; 
     AVAudioSession *session = [AVAudioSession sharedInstance]; 
     NSError *error = nil; 

     success = [session setCategory:AVAudioSessionCategoryPlayAndRecord 
          withOptions:AVAudioSessionCategoryOptionMixWithOthers 
           error:&error]; 
     if (!success) NSLog(@"AVAudioSession error setCategory: %@", [error localizedDescription]); 

     success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 
     if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort: %@", [error localizedDescription]); 

     success = [session setActive:YES error:&error]; 
     if (!success) NSLog(@"AVAudioSession error setActive: %@", [error localizedDescription]); 
    } else if (ci.state == PJSIP_INV_STATE_DISCONNECTED) { 
     BOOL success; 
     AVAudioSession *session = [AVAudioSession sharedInstance]; 
     NSError *error = nil; 

     success = [session setActive:NO error:&error]; 
     if (!success) NSLog(@"AVAudioSession error setActive: %@", [error localizedDescription]); 
    } 
}