USB 디지털 오디오

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

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

청중

이 기사의 대상 독자는 Android 장치 OEM, SoC 공급업체, USB 오디오 주변 장치 공급업체, 고급 오디오 애플리케이션 개발자 및 Android의 USB 디지털 오디오 내부에 대한 자세한 이해를 원하는 기타 사용자입니다.

Nexus 기기의 최종 사용자는 대신 Nexus 도움말 센터 에서 USB 호스트 모드를 사용하여 오디오 녹음 및 재생 문서를 참조해야 합니다. 이 문서는 최종 사용자를 대상으로 하지 않지만 특정 오디오 애호가 소비자는 관심 있는 부분을 찾을 수 있습니다.

USB 개요

USB(Universal Serial Bus)는 비공식적으로 Wikipedia 문서 USB 에 설명되어 있으며 USB Implementers Forum, Inc 에서 게시한 표준에 의해 공식적으로 정의됩니다. 편의를 위해 여기에서 주요 USB 개념을 요약하지만 표준은 신뢰할 수 있는 참조입니다.

기본 개념 및 용어

USB는 호스트 라고 하는 데이터 전송 작업의 단일 개시자가 있는 버스 입니다. 호스트는 버스를 통해 주변 장치 와 통신합니다.

참고: 장치액세서리 라는 용어는 주변 장치 의 일반적인 동의어입니다. 이러한 용어는 Android 기기 또는 액세서리 모드 라는 Android 관련 개념과 혼동될 수 있으므로 여기서는 사용하지 않습니다.

중요한 호스트 역할은 열거 입니다. 어떤 주변 장치가 버스에 연결되어 있는지 감지하고 디스크립터 를 통해 표현된 속성을 쿼리하는 프로세스입니다.

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

각 주변 장치 기능에는 해당 기능과 통신하기 위한 프로토콜을 정의하는 인터페이스 가 있습니다.

호스트는 주변 장치의 기능 중 하나에서 제공하는 끝점 , 데이터 소스 또는 싱크에 대한 파이프 를 통해 주변 장치와 통신합니다.

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

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

세 가지 주요 데이터 전송 모드가 있습니다: 인터럽트 , 대량등시성 . 등시성 모드는 오디오와 관련하여 더 자세히 설명합니다.

주변 장치에는 주변 장치 자체를 넘어 외부 세계에 연결하는 터미널 이 있을 수 있습니다. 이러한 방식으로 주변 장치는 USB 프로토콜과 "실제" 신호 사이를 변환하는 역할을 합니다. 터미널은 함수의 논리적 개체입니다.

안드로이드 USB 모드

개발 모드

개발 모드 는 Android의 초기 릴리스부터 존재했습니다. Android 장치는 Linux, Mac OS X 또는 Windows와 같은 데스크톱 운영 체제를 실행하는 호스트 PC에 USB 주변 장치로 나타납니다. 유일하게 보이는 주변 기능은 Android fastboot 또는 Android Debug Bridge(adb) 입니다. fastboot 및 adb 프로토콜은 USB 대량 데이터 전송 모드를 통해 계층화됩니다.

호스트 모드

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

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

OTG

그림 1. OTG(On-the-go) 어댑터

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

전원이 공급되는 허브

그림 2. 전원 공급 허브

액세서리 모드

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

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

USB 오디오

USB 클래스

각 주변 장치 기능에는 해당 기능에 대한 표준 프로토콜을 지정하는 관련 장치 클래스 문서가 있습니다. 이를 통해 클래스 준수 호스트와 주변 장치 기능이 서로의 작업에 대한 자세한 지식 없이도 상호 운용할 수 있습니다. 호스트와 주변 장치가 서로 다른 엔터티에서 제공되는 경우 등급 준수가 중요합니다.

드라이버 리스 라는 용어는 클래스 호환 의 일반적인 동의어로, 운영 체제별 드라이버 를 설치하지 않고도 이러한 주변 장치의 표준 기능을 사용할 수 있음을 나타냅니다. 예외가 있을 수 있지만 주요 데스크톱 운영 체제에 대해 "드라이버가 필요하지 않음"으로 광고되는 주변 장치는 클래스를 준수할 것이라고 가정할 수 있습니다.

USB 오디오 클래스

여기서 우리는 오디오 기능을 구현하는 주변 장치에만 관심이 있으므로 오디오 장치 클래스를 준수합니다. USB 오디오 클래스 사양에는 클래스 1(UAC1)과 클래스 2(UAC2)의 두 가지 버전이 있습니다.

다른 클래스와의 비교

USB에는 다른 많은 장치 클래스가 포함되어 있으며 그 중 일부는 오디오 클래스와 혼동될 수 있습니다. MSC( 대용량 저장소 클래스 )는 미디어에 대한 섹터 지향 액세스에 사용되는 반면 MTP( Media Transfer Protocol )는 미디어에 대한 전체 파일 액세스에 사용됩니다. MSC와 MTP 모두 오디오 파일 전송에 사용할 수 있지만 실시간 스트리밍에는 USB 오디오 클래스만 적합합니다.

오디오 터미널

오디오 주변 장치의 터미널은 일반적으로 아날로그입니다. 주변 장치의 입력 단자에 제공된 아날로그 신호는 ADC( 아날로그-디지털 변환기 )에 의해 디지털로 변환되고 USB 프로토콜을 통해 전달되어 호스트에서 소비됩니다. ADC는 호스트의 데이터 소스 입니다. 유사하게 호스트는 USB 프로토콜을 통해 디지털 오디오 신호를 주변 장치로 전송하며, 여기에서 DAC( 디지털-아날로그 변환기 )가 변환되어 아날로그 출력 터미널로 제공됩니다. DAC는 호스트의 싱크 입니다.

채널

오디오 기능이 있는 주변 장치에는 소스 터미널, 싱크 터미널 또는 둘 다 포함될 수 있습니다. 각 방향은 하나의 채널( 모노 ), 두 개의 채널( 스테레오 ) 또는 그 이상을 가질 수 있습니다. 채널이 2개 이상인 주변 장치를 다중 채널 이라고 합니다. 스테레오 스트림은 왼쪽오른쪽 채널로 구성되는 것으로 해석하고 확장하여 다중 채널 스트림은 각 채널에 해당하는 공간 위치를 갖는 것으로 해석하는 것이 일반적입니다. 그러나 각 채널에 특정 표준 공간적 의미를 할당하지 않는 것도 적절합니다(특히 HDMI 보다 USB 오디오의 경우). 이 경우 각 채널이 사용되는 방식을 정의하는 것은 응용 프로그램과 사용자에게 달려 있습니다. 예를 들어, 4채널 USB 입력 스트림에는 실내의 다양한 마이크에 연결된 처음 3개 채널과 AM 라디오에서 입력을 수신하는 마지막 채널이 있을 수 있습니다.

등시 전송 모드

USB 오디오는 오류 복구를 희생하면서 실시간 특성을 위해 등시성 전송 모드를 사용합니다. 등시성 모드에서는 대역폭이 보장되며 CRC(Cyclic Redundancy Check)를 사용하여 데이터 전송 오류를 감지합니다. 그러나 오류 발생 시 패킷 승인이나 재전송은 없습니다.

등시성 전송은 각 SOF(Start Of Frame) 기간에 발생합니다. 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의 비용에 영향을 주지 않으면서 더 높은 오디오 품질과 더 큰 전력 출력을 위해 설계할 수 있습니다. 예, 더 비싼 디자인이지만 비용은 그것을 원하는 사람들.

모바일 장치는 고밀도 회로 기판을 사용하는 것으로 악명 높으며 이로 인해 인접한 아날로그 신호를 저하시키는 혼선 의 기회가 더 많아질 수 있습니다. 디지털 통신은 잡음 에 덜 민감하므로 Android 기기 A에서 외부 회로 기판 C로 DAC를 이동하면 최종 아날로그 단계가 조밀하고 잡음이 많은 회로 기판에서 물리적 및 전기적으로 격리되어 더 높은 충실도의 오디오를 얻을 수 있습니다.

반면에 두 번째 디자인은 더 복잡하며 복잡성이 추가되면 실패할 가능성이 더 커집니다. USB 컨트롤러의 추가 대기 시간도 있습니다.

호스트 모드 애플리케이션

일반적인 USB 호스트 모드 오디오 애플리케이션에는 다음이 포함됩니다.

  • 음악 감상
  • 전화 통신
  • 인스턴트 메시징 및 음성 채팅
  • 녹음

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

USB 디지털 오디오 전용 API는 없습니다. 고급 사용의 경우 자동 라우팅이 USB 인식 응용 프로그램을 방해할 수 있습니다. 이러한 애플리케이션의 경우 설정 / 개발자 옵션 의 미디어 섹션에서 해당 컨트롤을 통해 자동 라우팅을 비활성화하십시오.

호스트 모드에서 디버깅

USB 호스트 모드에서는 USB를 통한 adb 디버깅을 사용할 수 없습니다. 대안을 보려면 Android Debug Bridge무선 사용 섹션을 참조하세요.

USB 오디오 구현

오디오 주변 장치 공급업체를 위한 권장 사항

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_PACKAGES에 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은 Audio terminology 에 설명된 tinyalsa 에 크게 의존합니다. USB 오디오는 등시성 전송에 의존하지만 이것은 ALSA 구현에 의해 추상화됩니다. 따라서 USB 오디오 HAL 및 tinyalsa는 USB 프로토콜의 이 부분에 관심을 가질 필요가 없습니다.

USB 오디오 테스트

USB 오디오용 CTS 테스트에 대한 자세한 내용은 USB 오디오 CTS 인증 도구 테스트 를 참조하세요.