Community

iOS SDK 스피커모드 질문입니다

2.1.1에서 2.1.2로 업데이트 후에는 내부적으로 스피커모드 관련 기능이 제공되는 것인가요??

아니면

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if(isEnabled)
{
    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
}
else
{
    [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
}

이게 작동을 하는건가요?

지금 아이폰8, 아이폰5S, 아이폰5로 테스트를 하는 중인데 작동이 안되고 있습니다… ㅠ
AVAudioSession의 category는 AVAudioSessionCategoryPlayAndRecord 로 설정되어있고

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];

이 부분 전 후로 session.currentRoute.outputs를 확인해보니

 Previous CurrentRoutes : (
    "<AVAudioSessionPortDescription: 0x182985d0, type = Speaker; name = \Uc2a4\Ud53c\Ucee4; UID = Speaker; selectedDataSource = (null)>"
)
CurrentRoutes : (
    "<AVAudioSessionPortDescription: 0x181c1e10, type = Receiver; name = \Uc218\Uc2e0\Uae30; UID = Built-In Receiver; selectedDataSource = (null)>"
)

이렇게 Speaker에서 Built-In Receiver로 변경이 되었는데도 계속 스피커모드로 소리가 출력됩니다.
방법이 없을까요?

2.1.2로 업데이트 한 후인데도 여전히 안되고 있습니다 ㅠㅠ 확인 부탁드려요…

2.1.1 에는 audioSession.setCategory(category:cat, with:option) 함수에 옵션 값으로 .defaultSpeaker 옵션이 적용 되어 습니다. 2.1.2에서는 해당 옵션이 빠졋고요.

2.1.1에서도 audioSession.setCategory() 를 옵션 없이 호출 하시면 스피커 모드가 해제 됩니다.

지금 2.1.2에서 확인해본 후에 질문 드리는 거에요 ㅠㅠ 다시 확인해주실 수 있을까요

2.1.2에서도 스피커 모드 해제가 되지 않고 있습니다. 확인 부탁드려요

샘플 프로젝트 에AVAudioSessionRouteChange Notifications 옵저빙 코드를 추가 하여 배포 하였습니다.

샘플프로젝트에서 확인 해본 결과 헤드폰/블루투스 모두 정상 적으로 인식 되고 있는 것으로 판단 됩니다.

새로운 디바이스 Headphones
현재 디바이스 <AVAudioSessionRouteDescription: 0x1c40111a0, 
inputs = (
    "<AVAudioSessionPortDescription: 0x1c4012dd0, type = MicrophoneWired; name = \Ud5e4\Ub4dc\Uc14b \Ub9c8\Uc774\Ud06c; UID = Wired Microphone; selectedDataSource = (null)>"
); 
outputs = (
    "<AVAudioSessionPortDescription: 0x1c4012d20, type = Headphones; name = \Ud5e4\Ub4dc\Ud3f0; UID = Wired Headphones; selectedDataSource = (null)>"
)>

샘플 프로젝트는 2.1.2 에서 동작합니다.
SimpleCallViewController, SimpleAudioSessionObserver를 참고 하시면 도움이 되실듯 합니다.

감사합니다~~

기기 상단에 있는 earpiece로는 전환이 안되는 건가요?
Built-In Receiver 혹은 수신기 이렇게 부르는 것 같은데
로그를 확인하면

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];

후에는

CurrentRoutes : (
    "<AVAudioSessionPortDescription: 0x181c1e10, type = Receiver; name = \Uc218\Uc2e0\Uae30; UID = Built-In Receiver; selectedDataSource = (null)>"
)

이렇게 로그가 나오지만 스피커 모드가 지속됩니다… 이어폰과 같은 외부기기를 사용했을 때는 잘 되고 있는게 맞는데 핸드폰의 상단부의 스피커에서만 나오는 일반 전화할 때처럼 스피커를 사용할 수는 없는건가요?

같은 문제로 여러번 번거롭게 해드려 죄송해요…

Built-In Receiver 이용을 원하셧던 거군요!!!
제가 문제 파악을 잘못 하고 있었습니다. 죄송 합니다.!!

제가 열심히 해결 방법을 찾아서 다시 답변 드릴게요…ㅠㅠ
그리고 다음 버전에는 추가 코딩 없이 동작 하도록 처리 할게요…

아닙니다 ㅠㅠ
빠르게 답변 주셔서 감사합니다!

아래와 같이 처리 하면 Built-In Receiver로 음성 출력이 될듯 합니다.
해당 코드는 샘플 프로젝트의 trost 브랜치에 적용 되어있습니다.

remonCall.onComplete { () in
            DispatchQueue.main.async {
                self.chLabel.text = self.remonCall.channelID
            }
            
            do {
                try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.none)
            } catch let err {
                print(err.localizedDescription)
            }
            NotificationCenter.default.removeObserver(self.remonCall, name: .AVAudioSessionRouteChange, object: nil)
        }

감사합니다~

아 드디어 해결 되었어요…
정말 감사드립니다!
수고하세요!

2.1.3 버전 부터는 builtInReceiverOverideToSpeaker 값이 추가 되었습니다.

builtInReceiverOverideToSpeaker 값을 off로 설정 하시면 기본으로 Built-In Receiver 를 이용합니다.

// without IB
remonCall.builtInReceiverOverideToSpeaker = false

런타임 중에 출력 장치를 전환 하시려면 ~

remonCall.builtInReceiverOverideToSpeaker = !remonCall.builtInReceiverOverideToSpeaker

Example / CHANGELOG