고해상도 오디오

Android 10 릴리스에는 다음과 같은 고해상도 오디오 개선사항이 포함되어 있습니다.

  • Float: WAV, FLAC 코덱, 추출기가 float(24비트 이상의 무손실 정밀도)를 지원하도록 업데이트됩니다. 다운믹스 및 가상화기 효과가 float로 업데이트됩니다. 업데이트된 정밀도는 MediaPlayer(NuPlayer)에서 허용됩니다.
  • 고주파수: WAV, FLAC 코덱, 추출기가 192kHz를 지원하도록 업데이트됩니다. 표준 주파수에서 192kHz를 지원하는지 기본 Android 제공 효과가 테스트됩니다. 허용되는 표준 주파수는 88.2kHz, 96kHz, 176.4kHz, 192kHz입니다.
  • 다중 채널: 8개 채널에 다중 채널을 지원하는지 기본 Android 재생 효과가 테스트됩니다.
  • 타이밍: 타이밍 정보는 오디오 프레임워크 전체에 포함됩니다.

Android 9부터는 다음 개선사항에 파트너 구현이 필요하지 않습니다.

  • AudioTrack의 제한된 클라이언트 인스턴스가 Android 8.x의 앱에서 문제가 되면서 동시 클라이언트 출력 트랙 수가 14개에서 40개로 늘어납니다.
  • 최대 클라이언트/서버 메모리가 총 기기 메모리에 따라 4MB에서 32MB로 늘어나 더 많은 고해상도 오디오 트랙을 동시에 사용할 수 있습니다.
  • 앱과 시스템 UI 간의 리소스 경합을 방지하기 위해 총 혼합 트랙이 32개에서 256개로 늘어납니다.

출력 효과 변경사항

Android 9 릴리스 이전에는 효과 체인 처리가 스테레오 int16 샘플 형식으로 구현되었으며, 여기에는 일부 제한사항이 있었습니다.

  • 모든 출력 효과가 부동 소수점 오디오 데이터에서 int16으로 강제로 변환하여 정밀도 손실이 발생했습니다.
  • 채널 수가 3개 이상인 출력 싱크로부터 출력 효과가 거부되었습니다.

Android 9 릴리스에서는 효과 체인 처리 파이프라인이 다중 채널 float 형식을 지원하도록 업그레이드됩니다. 핵심 사항은 다음과 같습니다.

  • 이미 Android 소프트웨어 효과는 스테레오 float로 이전되었습니다.
  • 기존 효과는 필요에 따라 float를 int16으로 변환하는 형식 어댑터를 통해 지원됩니다.

출력 효과 구현

출력 효과에 관한 참조 구현은 frameworks/av/media/libeffects에서 가능합니다.

자체 맞춤 출력 효과를 구현하는 파트너는 Android 10 버전에서 다음을 완료해야 합니다.

  • 출력 효과를 업데이트하여 다중 채널 float 형식을 지원합니다.
    • int16 처리 지원은 더 이상 필요하지 않습니다.
    • 출력 채널 개수는 2~8개부터 지원합니다(향후 호환성을 위해 1~30개부터 지원하는 것을 권장).
    • 삽입 효과를 위해 출력 채널 개수와 동일한 입력 채널 개수를 지원합니다. 보조 효과의 경우 입력 채널 개수가 1개(모노)로 유지됩니다.
    • 채널 위치 마스크(표준)와 (1 << n) - 1의 채널 색인 마스크를 모두 지원합니다.
  • 기존 공급업체 출력 효과를 계속 지원해야 하는데 업데이트는 할 수 없는 경우, 기존 코드를 다음과 같이 확인합니다.
    • 기존 출력(삽입) 효과는 EFFECT_CMD_SET_CONFIG에서 지원되지 않는 구성을 거부해야 합니다.
      • 형식이 int16인지 확인합니다.
      • 입력 및 출력 채널 마스크가 스테레오인지 확인합니다.
      • 검사 중 하나가 실패하면 -EINVAL을 반환합니다.
    • 출력 싱크가 멀티 채널인지의 여부에 따라 모노 입력 채널 마스크와 다중 채널 출력 채널 마스크를 사용하여 AudioFlinger에서 기존 출력(보조) 효과를 구성합니다. 기존 출력 효과는 EFFECT_CMD_SET_CONFIG에서 지원되지 않는 구성을 거부해야 합니다.
      • 형식이 int16인지 확인합니다.
      • 입력 채널 마스크가 모노이고 출력 채널 마스크가 스테레오인지 확인합니다.
      • 검사 중 하나가 실패하면 -EINVAL을 반환합니다.
    • 기존 코드를 인증합니다. 작동한다고 가정하지 않습니다.