상호작용 시퀀스의 예

다음 자동차 오디오 예에서 차량 헤드 단위는 Android 9를 실행하며 라디오 애플리케이션과 탐색 애플리케이션을 포함하고 있습니다. 또한 차량 튜너는 외부에서 라우팅되며 스피커를 통해 재생됩니다. 실제 사용 사례에서는 튜너를 Android 입력으로 처리하고 라디오 앱이 튜너에서 읽은 후 AudioTrack 객체에 쓰도록 하는 것이 유리할 수 있습니다.

사용자가 라디오 시작

이 상호작용 시퀀스에서 사용자가 라디오 애플리케이션에서 미리 설정된 주파수의 Play를 누르면 차량에 미디어가 재생되지 않습니다. 튜너가 스피커를 통해 사운드를 재생하려면 라디오 애플리케이션이 포커스를 맞춰야 합니다.

그림 1. 라디오에서 포커스를 맞추고 스피커를 통해 튜너 재생
  1. 라디오: "FM 96.5에 맞춥니다."
  2. 라디오: 포커스 GAIN을 요청합니다.
  3. AudioManager: GAIN을 부여합니다.
  4. 라디오: createAudioPatch()
  5. 라디오: "튜너 출력을 재생합니다."
  6. 외부 라우팅 튜너: 믹서가 튜너 오디오가 앰프로 라우팅되도록 합니다.

라디오의 탐색 프롬프트 덕킹

이 상호작용 시퀀스에서는 탐색 애플리케이션이 다음 턴 알림을 위한 탐색 프롬프트를 생성하면 라디오가 재생됩니다. 탐색 프롬프트를 재생하려면 탐색 애플리케이션이 AudioManager에서 일시적인 포커스를 가져와야 합니다.

그림 2. 라디오 재생 시 탐색 프롬프트 덕킹
  1. 라디오: "튜너 출력을 재생합니다."
  2. 외부 라우팅 튜너: 믹서가 튜너 오디오가 앰프로 라우팅되도록 합니다.
  3. 탐색: AudioManager에서 포커스 GAIN TRANSIENT를 요청합니다.
  4. AudioManager: 탐색에 관한 GAIN TRANSIENT
  5. 탐색: 스트림을 열고 패킷 전송.
  6. 탐색: 버스1에서 라우팅된 컨텍스트 GUIDANCE.
  7. 믹서: 스피커에서 버스1 GUIDANCE를 재생하기 위해 튜너를 덕킹합니다.
  • 탐색: 재생을 종료하고 스트림을 닫습니다.
  • 탐색: 포커스를 종료합니다.
  • AudioManager는 라디오 재생이 덕킹될 수 있음을 인식하고 일반적으로 라디오 애플리케이션에 알리지 않고 음악 스트림에 덕킹 요소를 적용합니다. 그러나 프레임워크 덕킹은 framework/base/core/res/res/values/config.xml을 오버레이하고 config_applyInternalDuckingfalse로 설정하여 우회되므로 외부 튜너는 계속 사운드를 제공하고 라디오 애플리케이션은 계속 변경사항을 인식하지 못합니다. HAL 아래의 믹서는 두 입력의 결합을 담당하여 라디오 재생을 덕킹하거나 라디오 재생을 후면 스피커로 이전할 수 있습니다.

    탐색 프롬프트가 완료되면 탐색 애플리케이션에서 포커스를 해제하고 라디오 재생이 다시 시작됩니다.

    사용자가 오디오북 애플리케이션 실행

    이 상호작용 시퀀스에서는 사용자가 오디오북 애플리케이션을 실행하면 라디오 재생이 중지됩니다(음악 스트리밍 앱에서 재생을 누르는 것과 유사하게 실행됨).

    그림 3. 오디오북이 라디오 재생에서 포커스를 가져옴
    1. 오디오북: AudioManager에서 GAIN context MEDIA 요청
    2. 라디오가 포커스 상실
      1. AudioManager: LOSS
      2. 라디오: releaseAudioPatch()
    3. 오디오북으로 포커스 이동
      1. GAIN이 부여되고, 버스0에서 Context MEDIA가 라우팅됨
      2. 스트림을 열고 MEDIA 패킷을 보냄

    오디오북 애플리케이션의 포커스 요청은 일시적이지 않기 때문에 이전 포커스 소유자(라디오 애플리케이션)는 영구적으로 포커스를 상실하고, 라디오 애플리케이션은 패치를 튜너에게 해체하여 이러한 상실에 응답합니다. 믹서는 튜너 수신을 중지하고 오디오 HAL을 통해 전송된 오디오 처리를 시작합니다. 라디오에서 오디오북으로 전환의 일부로 크로스 페이드를 선택적으로 실행 할 수도 있습니다.

    이 상호작용 시퀀스에서는 탐색 애플리케이션이 탐색 프롬프트를 생성하면 오디오북이 재생됩니다.

    그림 4. 탐색 프롬프트가 오디오북 재생에서 포커스를 가져옴
    1. 오디오북: 스트리밍 MEDIA 패킷, 비동시 포커스
    2. 탐색: GAIN TRANSIENT 요청
    3. AudioManager: LOSS TRANSIENT.
    4. 오디오북: 중지됨
    5. AudioManager: GAIN TRANSIENT가 부여됨
    6. 탐색: 스트림을 열고 패킷 전송.
    7. 탐색: 버스1에서 라우팅된 컨텍스트 GUIDANCE.
    8. 믹서: 버스1(GUIDANCE) 재생.
  • 탐색: 재생을 종료하고 스트림을 닫습니다.
  • 탐색: 포커스를 종료합니다.
  • 오디오북: GAIN.
  • 오디오북: 다시 시작
  • 원래 오디오북 애플리케이션 AudioFocusRequest(AudioTrack을 시작할 때 전송됨)에 AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS 플래그가 포함되어 있으므로 AudioManager는 오디오북 앱의 덕킹을 처리할 수 없다고 판단합니다. 대신 AudioManagerAUDIOFOCUS_LOSS_TRANSIENT 메시지를 오디오북 앱에 전송하는데 오디오북 앱은 재생을 정지하여 응답할 것으로 예상됩니다.

    탐색 애플리케이션은 이제 중단 없이 탐색 프롬프트를 재생할 수 있습니다. 탐색 프롬프트가 완료되면 오디오북이 다시 포커스를 얻고 재생이 다시 시작됩니다.