Category / Mode / CategoryOptions 세 가지 범주를 소개하겠다. OS에게 앱에서 오디오를 어떻게 쓸지 알려주기 위한 방법들이며, 새로이 설정할 때에는 명시적으로 오디오세션을 deactive 후 다시 active 해주어야 한다. 주요한 것들 위주로 간단히 설명하겠다.
Category
경험 상 많이 쓰이는 것들
- playback: 무음모드일때도 소리 남
- playAndRecord: 녹음과 재생 같이 쓸 때 사용. 소리 input 필요할때 쓴다. 무음모드일때도 소리 남
- 위 카테고리 2개는 default가 noxmixable이며 (다른 앱과 소리 동시에 들리지 않음) 옵션을 통해 mixable하게 만들 수 있다
그 외의 것들
- ambient: for play along. mixable. 무음모드일 때 소리 안 남
- soloAmbient: default. nonmixable. 무음모드일 때 소리 안 남
- record: 오디오 녹음만을 위함 (재생 불가)
- multiRoute: 여러 루트로 오디오 출력 시 사용
아래는 간단한 비교 테이블이다. 원하는 스펙을 찾아 사용하면 된다.
Category | 폰 무음모드 or Lock 상태에서 | 다른 앱 오디오와 상호작용 | input(recording)/output(playback) |
ambient | play X | mix | output only |
soloAmbient | play X | interrupt | output only |
playback | play O | interrupt (옵션 추가로 mix 가능) | output only |
record | record O | interrupt | input only |
playAndRecord | play O record O | interrupt (옵션 추가로 mix 가능) | input & output |
multiRoute | play O | interrupt | input & output |
Mode
경험 상 많이 쓰이는 것들
- default: 웬만하면 이걸로 하면 된다
- moviePlayback: 영상 재생 시
- videoRecording: 영상 녹화 시
- spokenAudio: for continuous spoken audio. (ex) 팟캐스트 앱은 이 모드를 사용
- voicePrompt: 카플레이 등을 위한 모드. for text-to-speech
- (추천 호환 옵션: duckOthers & interruptSpokenAudioAndMixWithOthers)
참고사항
- Category와 Mode가 호환이 안 되는 쌍이 존재함. 그럴 때는 setting 이 아예 실패하므로 주의
- (ex) videoRecording은 record, playAndRecord 카테고리가 아니면 사용할 수 없다
- (ex) playAndRecord + .voicePrompt 는 같이 사용할 수 없다
CategoryOptions
경험 상 많이 쓰이는 것들
- mixWithOthers: 다른 앱의 소리와 우리 앱 소리가 함께 들릴 수 있게 하는 옵션.
- duckOthers: mixWithOthers 를 기본으로 채택하면서 +우리 앱에서 소리가 날 때는 다른 앱 소리를 살짝 죽이는 옵션.
- interruptSpokenAudioAndMixWithOthers: mixWithOthers를 기본으로 채택하면서 + 다른 앱에서 spokenAudio 가 출력될 때에만 interrupt 걸고 우리 앱이 소리를 독차지 (*라디오, 팟캐스트 등을 생각하면 됨)
- <참고> duckOthers와 함께 사용하게 되면 다른 앱에서 Media 종류의 Audio 를 재생할때는 duckOthers 의 설정을 따르고, 다른 앱에서 spokenAudio가 출력되고 있을 때에만 우리 앱이 interrupt 를 걸어버린다
- allowBluetoothA2DP: 블루투스 디바이스 지원을 위한 옵션
- playback 카테고리에서는 기본제공이지만 playAndRecord 카테고리에서는 기본이 아니기 때문에 따로 셋팅해주어야 함
- defaultToSpeaker: 연결된 오디오 receiver가 따로 있을때(ex: 아이폰 built-in receiver, 이어폰, 카오디오 등), 그쪽이 아닌 폰 speaker로 오디오를 전달하게 해주는 옵션
- playAndRecord 카테고리에서만 유효한 옵션
- 이 옵션과 같은 역할을 하는 AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker) 라는 일회성 함수도 있다
출처: https://wlaxhrl.tistory.com/92 [찜토끼의 Swift 블로그]