[swift] 헤드폰 감지하여 사운드 출력 방식 변경하기

헤드폰을 연결하거나 연결을 해제할 때, 앱에서 사운드 출력 방식을 자동으로 변경하는 기능을 구현해보겠습니다. iOS 앱에서는 AVAudioSession을 사용하여 현재 오디오 라우팅을 관리할 수 있습니다.

AVAudioSession 구성

먼저, AVAudioSession 인스턴스를 생성하고 카테고리를 설정해야합니다.카테고리는 앱이 어떤 유형의 오디오 활동을 지원하는지를 나타냅니다. 헤드폰 감지를 위해 AVAudioSession.Category.playAndRecord 카테고리를 사용하겠습니다.

import AVFoundation

let audioSession = AVAudioSession.sharedInstance()
try? audioSession.setCategory(AVAudioSession.Category.playAndRecord)

헤드폰 연결 감지

이제 헤드폰의 연결 상태에 따라 사운드 출력 방식을 변경해야합니다. AVAudioSession은 AVAudioSessionRouteChangeNotification 알림을 통해 헤드폰 연결 상태를 감지할 수 있습니다. 이 알림을 구독하여 헤드폰이 연결되거나 해제되었을 때 적절한 코드를 실행할 수 있습니다.

NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil)

@objc func handleRouteChange(_ notification: Notification) {
    guard let userInfo = notification.userInfo,
          let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
          let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else {
        return
    }
    
    switch reason {
    case .newDeviceAvailable: // 헤드폰 연결
        // 사운드 출력 방식 변경 코드 작성
    case .oldDeviceUnavailable: // 헤드폰 해제
        // 사운드 출력 방식 변경 코드 작성
    default:
        break
    }
}

사운드 출력 방식 변경

헤드폰을 연결하거나 해제할 때 사운드 출력 방식을 변경하려면 AVAudioSession.setPreferredOutputNumberOfChannels(...) 메서드를 사용하여 출력 채널 수를 변경하고, 그에 따라 다른 사운드 출력 방식을 설정할 수 있습니다.

// 헤드폰 연결 시
try? audioSession.setPreferredOutputNumberOfChannels(2)
try? audioSession.setPreferredOutputNumberOfChannels(2, mode: .moviePlayback)
try? audioSession.setPreferredOutputNumberOfChannels(2, mode: .gameChat)

// 헤드폰 해제 시
try? audioSession.setPreferredOutputNumberOfChannels(1)
try? audioSession.setPreferredOutputNumberOfChannels(1, mode: .moviePlayback)
try? audioSession.setPreferredOutputNumberOfChannels(1, mode: .gameChat)

사운드 출력 방식은 앱의 요구 사항에 따라 달라질 수 있으므로 필요에 따라 .moviePlayback, .gameChat 등의 다른 모드를 사용할 수 있습니다.

결론

이제 헤드폰 연결과 해제를 감지하여 사운드 출력 방식을 자동으로 변경하는 기능을 구현하는 방법을 알게되었습니다. AVAudioSession을 사용하여 앱의 오디오 라우팅을 관리할 수 있고, 헤드폰 연결 상태에 따라 사운드 출력 방식을 변경할 수 있습니다.