[iOS] Audio Session Setting

by digipine posted Nov 26, 2021
?

Shortcut

PrevPrev Article

NextNext Article

ESCClose

Larger Font Smaller Font Up Down Go comment Print

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 블로그]