USB 디지털 오디오

이 도움말에서는 USB 디지털 오디오 및 관련 USB 기반 프로토콜에 관한 Android 지원을 검토합니다.

대상

이 도움말은 Android 기기 OEM, SoC 공급업체, USB 오디오 주변기기 공급업체, 고급 오디오 애플리케이션 개발자, Android의 USB 디지털 오디오 내부 기능에 관한 세부정보를 원하는 사람들을 대상으로 작성되었습니다.

Nexus 기기의 최종 사용자는 Nexus 고객센터에서 USB 호스트 모드를 사용한 오디오 녹음 및 재생 도움말을 참조하세요. 이 도움말은 최종 사용자를 대상으로 하지 않지만, 오디오에 관심이 많은 소비자의 경우 관심 있는 내용을 발견할 수도 있습니다.

USB 개요

USB는 위키백과 USB 문서에 비공식 설명이 올라와 있으며 USB Implementers Forum, Inc에서 발표하는 표준에 따라 공식적으로 정의됩니다. 여기서는 주요 USB 개념을 간략하게 설명하지만, USB Implementers Forum, Inc의 표준은 공신력 있는 참조입니다.

기본 개념 및 용어

USB는 데이터 전송 작업의 단일 시작점인 호스트가 있는 버스입니다. 호스트는 버스를 통해 주변기기와 통신합니다.

참고: 기기액세서리는 보통 주변기기의 동의어로 사용됩니다. Android 기기 또는 액세서리 모드라는 Android 관련 개념과 혼동될 수 있으므로 여기에서는 이 용어를 사용하지 않습니다.

호스트의 중요 역할은 열거입니다. 이는 버스에 연결된 주변기기를 감지하고 설명자를 통해 표시된 속성을 쿼리하는 프로세스를 가리킵니다.

주변기기는 하나의 물리적 객체일 수 있지만, 실제로는 여러 논리적 기능을 구현합니다. 예를 들어 웹캠 주변기기에는 카메라 기능과 마이크 오디오 기능이 모두 있을 수 있습니다.

각 주변기기 기능에는 이러한 기능과 통신할 수 있도록 프로토콜을 정의하는 인터페이스가 있습니다.

호스트는 주변기기 기능 중 하나에서 제공하는 엔드포인트, 데이터 소스 또는 싱크로 향하는 파이프를 통해 주변기기와 통신합니다.

파이프에는 메시지 파이프와 스트림 파이프가 있습니다. 메시지 파이프는 양방향 제어 및 상태에 사용되며, 스트림 파이프는 단방향 데이터 전송에 사용됩니다.

호스트는 모든 데이터 전송을 시작하므로 입력출력 용어는 호스트를 기준으로 표현됩니다. 입력 작업은 주변기기에서 호스트로 데이터를 전송하는 반면에 출력 작업은 호스트에서 주변기기로 데이터를 전송합니다.

데이터 전송 모드에는 인터럽트, 일괄, 등시 모드가 있습니다. 등시 모드는 오디오 부분에서 자세히 설명합니다.

주변기기에는 주변기기 자체를 벗어나 외부로 연결하는 단말기가 있을 수 있습니다. 이러한 방식으로 주변기기는 USB 프로토콜과 '실제' 신호 간을 변환합니다. 단말기는 기능의 논리적 객체입니다.

Android USB 모드

개발 모드

개발 모드는 Android 초기 릴리스 이후부터 사용되었습니다. Android 기기는 Linux, Mac OS X 또는 Windows와 같은 데스크톱 운영체제를 실행하는 호스트 PC의 USB 주변기기로 표시됩니다. 표시되는 주변기기 기능은 Android 빠른 부팅 또는 Android 디버그 브리지(adb)밖에 없으며, 빠른 부팅 및 adb 프로토콜은 USB 벌크 데이터 전송 모드를 통해 계층화됩니다.

호스트 모드

호스트 모드는 Android 3.1(API 레벨 12)에서 도입되었습니다.

Android 기기는 호스트 역할을 해야 하고 Android 기기 대부분에는 호스트 작업을 직접 허용하지 않는 마이크로 USB 커넥터가 포함되어 있으므로 일반적으로 다음과 같은 OTG(on-the-go) 어댑터가 필요합니다.

OTG

그림 1. OTG 어댑터

주변기기에 필요한 전력량과 Android 기기에서 공급 가능한 양에 따라, Android 기기에서 특정 주변기기를 작동하는 데 필요한 전력을 충분히 공급하지 못할 수도 있습니다. 적절한 전력량이 공급된다 하더라도 Android 기기의 배터리 충전량이 크게 줄어들 수 있습니다. 이러한 상황에서는 다음과 같이 제공되는 허브를 사용하세요.

제공되는 허브

그림 2. 제공되는 허브

액세서리 모드

액세서리 모드는 Android 3.1(API 레벨 12)에서 도입되었으며 Android 2.3.4로 백포트되었습니다. 이 모드에서 Android 기기는 호스트 역할을 하는 도크와 같은 다른 기기의 제어하에 USB 주변기기로 작동합니다. 개발 모드와 액세서리 모드의 차이점은 adb 이외에 추가 USB 기능이 호스트에 표시된다는 점입니다. Android 기기는 개발 모드에서 시작한 후 재협상 프로세스를 통해 액세서리 모드로 전환됩니다.

액세서리 모드는 Android 4.1의 추가 기능 중에서도 특히 아래 설명된 오디오를 통해 확장되었습니다.

USB 오디오

USB 클래스

각 주변기기 기능에는 기능의 표준 프로토콜을 지정하는 관련 기기 클래스 문서가 있습니다. 이를 통해 각각의 자세한 작동 방식에 관한 지식 없이도 클래스를 준수하는 호스트와 주변기기 기능을 상호 운용할 수 있습니다. 호스트와 주변기기가 다른 항목에서 제공되는 경우 클래스 규정 준수는 매우 중요합니다.

드라이버리스라는 용어는 일반적으로 클래스 준수의 동의어이며, 운영체제별 드라이버를 설치할 필요 없이 주변기기의 표준 기능을 사용할 수 있음을 의미합니다. 예외가 있을 수 있지만, 주요 데스크톱 운영체제용 '드라이버가 필요 없다'고 광고하는 주변기기는 클래스를 준수한다고 보아도 무방합니다.

USB 오디오 클래스

여기에서는 오디오 기능을 구현하는 주변기기만 다루므로 오디오 기기 클래스를 따릅니다. USB 오디오 클래스 사양에는 클래스 1(UAC1) 및 클래스 2 (UAC2) 버전이 있습니다.

다른 클래스와 비교

USB에는 오디오 클래스와 혼동될 수 있는 많은 여러 기기 클래스가 포함되어 있습니다. 미디어 전달 프로토콜(MTP)은 미디어에 관한 전체 파일 액세스에 사용되는 반면, 대용량 저장소 클래스(MSC)는 미디어에 관한 섹터 중심 액세스에 사용됩니다. MSC와 MTP 모두 오디오 파일 전송에 사용할 수 있지만, 실시간 스트리밍에 적합한 것은 USB 오디오 클래스뿐입니다.

오디오 단자

오디오 주변기기의 단자는 일반적으로 아날로그입니다. 주변기기의 입력 단말기에 표시되는 아날로그 신호는 아날로그-디지털 변환기(ADC)에 의해 디지털로 변환되고, USB 프로토콜을 통해 이전되어 호스트에서 소비됩니다. ADC는 호스트의 데이터 소스입니다. 마찬가지로 호스트는 USB 프로토콜을 통해 디지털 오디오 신호를 주변기기로 보내는데, 이때 디지털-아날로그 변환기(DAC)에서 변환하여 아날로그 출력 단말기에 표시합니다. DAC는 호스트의 싱크입니다.

채널

오디오 기능이 있는 주변기기에는 소스 단말기, 싱크 단말기 중 하나 또는 모두가 포함될 수 있습니다. 각 경로에는 하나의 채널(모노), 두 개의 채널(스테레오) 또는 그 이상의 채널이 있을 수도 있습니다. 채널이 3개 이상인 주변기기를 다중 채널이라고 합니다. 왼쪽 채널과 오른쪽 채널로 구성된 스테레오 스트림을 해석하고 더 나아가 각 채널에 해당하는 공간 위치를 가진 다중 채널 스트림을 해석하는 것이 일반적입니다. 하지만 특히 HDMI보다는 USB 오디오의 경우에는 각 채널에 특정 표준 공간적 의미를 할당하지 않는 것이 좋습니다. 이 경우에는 애플리케이션과 사용자가 각 채널의 사용 방식을 정의해야 합니다. 예를 들어 4채널 USB 입력 스트림의 경우 처음 3개의 채널을 방 안의 여러 마이크에 연결하고 마지막 채널은 AM 라디오의 입력을 수신하도록 할 수 있습니다.

등시 전송 모드

USB 오디오는 실시간이라는 특성 때문에 등시 전송 모드를 사용하지만, 오류 복구가 필요하다는 단점이 있습니다. 등시 모드에서는 대역폭이 보장되며 주기적 중복 검사(CRC)를 사용하여 데이터 전송 오류를 감지합니다. 하지만 오류가 발생할 경우 패킷을 확인하거나 재전송하지 않습니다.

등시 전송은 각 프레임 시작(SOF) 기간에 발생합니다. SOF 기간은 최고 속도의 경우 1밀리초, 고속의 경우 125마이크로초입니다. 각 최고 속도 프레임은 최대 1023바이트의 페이로드를, 고속 프레임은 최대 1024바이트를 전달합니다. 따라서 최대 전송률은 초당 1,023,000바이트 또는 초당 8,192,000바이트입니다. 이는 오디오 샘플링 레이트, 채널 수, 비트 심도를 합산한 값의 이론적 상한선을 설정하며, 실제 상한은 더 낮습니다.

등시 모드에는 세 가지의 하위 모드가 있습니다.

  • 자동 조정
  • 비동기
  • 동기

자동 조정 하위 모드에서는 주변기기 싱크 또는 소스가 변동되는 호스트의 샘플링 레이트에 맞게 조정됩니다.

비동기 모드(암시적 피드백이라고도 함) 하위 모드에서는 싱크 또는 소스가 샘플링 레이트를 결정하고 호스트에서 이를 수용합니다. 비동기 하위 모드의 가장 큰 이론적 장점은 소스 또는 싱크 USB 클록이 DAC 또는 ADC를 구동하는 클록에 물리적으로나 전기적으로 더 가깝다는 것입니다(동일하거나 파생되었을 수 있음). 이 근접성은 비동기 하위 모드가 클록 지터에 덜 취약함을 의미합니다. 또한 DAC 또는 ADC에서 사용되는 클록은 호스트 클록보다 높은 정확성과 낮은 드리프트에 맞게 설계될 수 있습니다.

동기 하위 모드에서는 고정 바이트 수가 각 SOF 기간 동안 전송됩니다. 오디오 샘플링 레이트는 사실상 USB 클록에서 파생됩니다. 호스트와 주변기기 모두 USB 클록에 의해 좌우되기 때문에 동기 하위 모드는 일반적으로 오디오와 함께 사용되지 않습니다.

아래 표에는 등시 하위 모드가 요약되어 있습니다.

하위 모드 패킷당
바이트 수
샘플링 레이트
결정 주체
오디오에 사용 여부
자동 조정 가변 호스트
비동기 가변 주변기기
동기 고정 USB 시계 아니요

실제로 하위 모드가 중요하기는 하지만, 다른 요인도 고려해야 합니다.

USB 오디오 클래스를 위한 Android 지원

개발 모드

USB 오디오는 개발 모드에서 지원되지 않습니다.

호스트 모드

Android 5.0(API 레벨 21) 이상은 USB 오디오 클래스 1(UAC1)의 일부 기능을 지원합니다.

  • Android 기기가 호스트 역할을 해야 합니다.
  • 오디오 형식은 PCM(인터페이스 유형 I)여야 합니다.
  • 비트 심도는 16비트, 24비트 또는 32비트여야 하며, 이때 유용한 오디오 데이터의 24비트는 32비트 워드의 가장 중요한 비트 내에서 왼쪽 정렬됩니다.
  • 샘플링 레이트는 48, 44.1, 32, 24, 22.05, 16, 12, 11.025 또는 8kHz여야 합니다.
  • 채널 수는 1개(모노) 또는 2개(스테레오)여야 합니다.

Android 프레임워크 소스 코드를 자세히 살펴보면 이러한 기능을 지원하는 데 필요한 최소한의 코드 이외의 추가 코드를 확인할 수 있습니다. 하지만 이 코드는 인증되지 않았으므로 고급 기능이 추가로 요청되지 않았습니다.

액세서리 모드

Android 4.1(API 레벨 16)에서 호스트에 관한 오디오 재생에 제한적인 지원이 추가되었습니다. 액세서리 모드에서 Android는 오디오 출력을 USB로 자동 라우팅합니다. 즉, Android 기기는 도크처럼 호스트의 데이터 소스 역할을 합니다.

액세서리 모드 오디오에는 다음과 같은 기능이 있습니다.

  • Android 기기는 Android 기기를 개발 모드에서 액세서리 모드로 먼저 전환하는 데 정통한 호스트에 의해 제어되어야 하며, 이후 호스트는 적절한 엔드포인트에서 오디오 데이터를 전송해야 합니다. 따라서 Android 기기는 호스트에 '드라이버리스'로 표시되지 않습니다.
  • 경로는 호스트를 기준으로 표시된 입력여야 합니다.
  • 오디오 형식은 16비트 PCM여야 합니다.
  • 샘플링 레이트는 44.1kHz여야 합니다.
  • 채널 수는 2개(스테레오)여야 합니다.

액세서리 모드 오디오는 자주 사용되지 않고 현재 새로운 디자인에는 권장되지 않습니다.

USB 디지털 오디오 애플리케이션

이름에 나타나 있듯이 USB 디지털 오디오 신호는 일반적인 TRS 미니 헤드셋 커넥터에서 사용하는 아날로그 신호가 아닌 디지털 데이터 스트림으로 표시됩니다. 결국 모든 디지털 신호는 아날로그로 되었을 때만 들리게 됩니다. 전환을 배치할 위치를 선택하는 데에는 장단점이 있습니다.

DAC의 두 가지 종류

아래 다이어그램 예시에서 두 디자인을 비교합니다. 먼저 애플리케이션 프로세서(AP), 온보드 DAC, 앰프, 헤드폰에 연결된 아날로그 TRS 커넥터가 있는 휴대기기가 있습니다. 외부 USB DAC와 앰프에 연결된 USB 및 헤드폰이 있는 휴대기기도 고려 대상입니다.

DAC 비교

그림 3. 두 DAC 비교

어떤 디자인이 더 좋을까요? 정답은 어떤 것이 필요한지에 따라 다릅니다. 각각에는 장단점이 있습니다.

참고: 실제 Android 기기에서는 두 옵션을 모두 사용할 수 있기 때문에 이 비교는 가상적인 비교입니다.

첫 번째 디자인 A는 더 간결하고 비용이 적게 들 뿐 아니라 전력 소모량도 적습니다. 또한 동일하게 안정적인 구성요소임을 가정할 때 더욱 안정적인 설계라고 할 수 있습니다. 하지만 일반적으로 다른 요구사항에 비해 오디오 품질에는 장단점이 있습니다. 예를 들어, 이 기기가 대중 시장 기기인 경우 오디오 애호가가 아닌 일반 소비자의 요구에 맞게 설계될 수 있습니다.

두 번째 디자인에서 외부 오디오 주변기기 C는 기본 대중 시장 Android 기기 B의 비용에 영향을 주지 않으면서도 더 좋은 음질과 더 큰 전원 출력을 고려하여 설계될 수 있습니다. 즉, 비용이 더 많이 드는 디자인이지만, 이 기기를 원하는 사람들에게만 적용되는 비용입니다.

휴대기기에는 고밀도 회로 기판이 있기 때문에 인접한 아날로그 신호를 저하시키는 혼선이 발생할 가능성이 더 큽니다. 디지털 통신은 노이즈의 영향을 덜 받기 때문에 DAC를 Android 기기 A에서 외부 회로 기판 C로 이동하면 최종 아날로그 단계에서 조밀하고 노이즈가 많은 회로 기판으로부터 물리적 및 전기적으로 분리되면서 오디오 품질이 높아집니다.

반면에 두 번째 디자인은 더 복잡하며 복잡성이 증가함에 따라 실패 가능성이 높아집니다. 또한 USB 컨트롤러에서 추가 지연 시간이 발생합니다.

호스트 모드 애플리케이션

일반적인 USB 호스트 모드 오디오 애플리케이션은 다음과 같습니다.

  • 음악 듣기
  • 텔레포니
  • 채팅 및 음성 채팅
  • 녹음

이러한 모든 애플리케이션에서 Android는 호환되는 USB 디지털 오디오 주변기기를 감지하고, 오디오 정책 규칙에 따라 오디오 재생 및 캡처를 적절하게 자동으로 라우팅합니다. 스테레오 콘텐츠는 주변기기의 처음 두 채널에서 재생됩니다.

USB 디지털 오디오 전용 API는 없습니다. 고급 사용의 경우 자동 라우팅이 USB를 인식하는 애플리케이션을 방해할 수 있습니다. 이러한 애플리케이션의 경우 설정 / 개발자 옵션의 미디어 섹션에서 상응하는 컨트롤을 통해 자동 라우팅을 중지합니다.

호스트 모드에서 디버깅

USB 호스트 모드에서는 USB를 통한 adb 디버깅을 사용할 수 없습니다. 이에 관한 대안은 Android 디버그 브리지무선 사용 섹션을 참조하세요.

USB 오디오 구현

오디오 주변기기 공급업체 권장사항

Android 주변기기 공급업체는 Android 기기와의 상호 운용을 위해 다음을 따라야 합니다.

  • 오디오 클래스 규정 준수를 고려하여 설계하는 것을 권장합니다. 현재 Android는 클래스 1을 대상으로 하지만, 클래스 2에 관한 계획을 세우는 것이 좋습니다.
  • 쿼크 피하기
  • 참조 및 인기 Android 기기와의 상호 운용성을 테스트합니다.
  • 지원되는 기능, 오디오 클래스 규정 준수, 전원 요구사항 등을 명확하게 문서화하여 소비자가 정보에 입각해 의사결정을 내릴 수 있도록 합니다.

Android 기기 OEM 및 SoC 공급업체 권장사항

USB 디지털 오디오를 지원하려면 기기 OEM 및 SoC 공급업체는 다음을 따라야 합니다.

  • USB 호스트 모드를 지원하는 하드웨어 설계를 채택합니다.
  • android.hardware.usb.host.xml 기능 플래그를 통해 프레임워크 수준에서 일반 USB 호스트 지원을 사용 설정합니다.
  • USB 호스트 모드, USB 오디오, 등시 전송 모드 등 필요한 모든 커널 기능을 사용 설정합니다(Android 커널 구성 참조).
  • 최근 커널 릴리스 및 패치를 최신 상태로 유지하는 것이 좋습니다. 클래스 규정 준수라는 높은 목표가 있어도 쿼크가 있는 기존 오디오 주변기기는 있습니다. 그러나 최신 커널에는 이러한 쿼크를 해결하는 방법이 있습니다.
  • 아래 설명에 따라 USB 오디오 정책을 사용 설정합니다.
  • device.mk의 PRODUCT_PAGAGES에 audio.usb.default를 추가합니다.
  • 일반적인 USB 오디오 주변기기와의 상호 운용성을 테스트합니다.

USB 오디오 정책을 사용 설정하는 방법

USB 오디오를 사용 설정하려면 오디오 정책 구성 파일에 항목을 추가합니다. 일반적으로 오디오 정책 구성 파일은 다음 위치에 있습니다.

    device/oem/codename/audio_policy.conf
    

경로 이름 구성요소인 'oem'은 Android 기기를 제조하는 OEM의 이름으로 변경해야 하며 'codename'은 기기 코드명으로 변경해야 합니다.

예시 항목은 다음과 같습니다.

    audio_hw_modules {
      ...
      usb {
        outputs {
          usb_accessory {
            sampling_rates 44100
            channel_masks AUDIO_CHANNEL_OUT_STEREO
            formats AUDIO_FORMAT_PCM_16_BIT
            devices AUDIO_DEVICE_OUT_USB_ACCESSORY
          }
          usb_device {
            sampling_rates dynamic
            channel_masks dynamic
            formats dynamic
            devices AUDIO_DEVICE_OUT_USB_DEVICE
          }
        }
        inputs {
          usb_device {
            sampling_rates dynamic
            channel_masks AUDIO_CHANNEL_IN_STEREO
            formats AUDIO_FORMAT_PCM_16_BIT
            devices AUDIO_DEVICE_IN_USB_DEVICE
          }
        }
      }
      ...
    }
    

소스 코드

USB 오디오의 오디오 하드웨어 추상화 계층(HAL) 구현은 다음 위치에 있습니다.

    hardware/libhardware/modules/usbaudio/
    

USB 오디오 HAL은 오디오 용어에 설명된 tinyalsa에 크게 의존합니다. USB 오디오는 등시 전송에 의존하지만 ALSA 구현을 통해 추상화됩니다. 따라서 USB 오디오 HAL 및 tinyalsa에서는 USB 프로토콜의 이 부분에 관해 관여하지 않아도 됩니다.

USB 오디오 테스트

USB 오디오의 CTS 테스트에 관한 자세한 내용은 USB 오디오 CTS 인증기 테스트를 참조하세요.