Audio digital USB

En este artículo, se revisa la compatibilidad de Android con el audio digital USB y los protocolos relacionados basados en USB.

Público

El público objetivo de este artículo son los OEM de dispositivos Android, los proveedores de SoC, los proveedores de periféricos de audio USB, los desarrolladores de aplicaciones de audio avanzadas y otras personas que buscan comprender en detalle los componentes internos del audio digital USB en Android.

Los usuarios finales de dispositivos Nexus deben consultar el artículo Cómo grabar y reproducir audio con el modo host USB en el Centro de ayuda de Nexus. Aunque este artículo no está orientado a los usuarios finales, ciertos consumidores de audiofilia pueden encontrar partes de interés.

Descripción general de USB

El bus universal en serie (USB) se describe de forma informal en el artículo de Wikipedia USB y se define formalmente según los estándares publicados por USB Implementers Forum, Inc.. Para tu comodidad, resumimos los conceptos clave de USB aquí, pero los estándares son la referencia autorizada.

Conceptos básicos y terminología

El USB es un bus con un solo iniciador de operaciones de transferencia de datos, llamado host. El host se comunica con los periféricos a través del bus.

Nota: Los términos dispositivo y accesorio son sinónimos comunes de periférico. Evitamos esos términos aquí, ya que podrían confundirse con el dispositivo de Android o el concepto específico de Android llamado modo de accesorio.

Un rol fundamental del host es la enumeración: el proceso de detectar qué periféricos están conectados al bus y consultar sus propiedades expresadas a través de descriptores.

Un periférico puede ser un objeto físico, pero en realidad implementa varias funciones lógicas. Por ejemplo, un periférico de cámara web podría tener una función de cámara y una función de audio de micrófono.

Cada función periférica tiene una interfaz que define el protocolo para comunicarse con esa función.

El host se comunica con un periférico a través de un canal a un extremo, una fuente o un destino de datos que proporciona una de las funciones del periférico.

Existen dos tipos de tuberías: mensaje y flujo. Se usa un canal de mensajes para el control y el estado bidireccionales. Se usa un canal de transmisión para la transferencia de datos unidireccional.

El host inicia todas las transferencias de datos, por lo que los términos entrada y salida se expresan en relación con el host. Una operación de entrada transfiere datos del periférico al host, mientras que una operación de salida transfiere datos del host al periférico.

Existen tres modos principales de transferencia de datos: interrumpida, en bloque y isocrónica. Analizaremos el modo isócrono con más detalle en el contexto del audio.

Es posible que el periférico tenga terminales que se conecten al mundo exterior, más allá del propio periférico. De esta manera, el periférico sirve para traducir entre el protocolo USB y los indicadores del “mundo real”. Los terminales son objetos lógicos de la función.

Modos USB de Android

Modo de desarrollo

El modo de desarrollo está presente desde la versión inicial de Android. El dispositivo Android aparece como un periférico USB para una PC host que ejecuta un sistema operativo de escritorio, como Linux, Mac OS X o Windows. La única función periférica visible es Android fastboot o Android Debug Bridge (adb). Los protocolos fastboot y adb se superponen en el modo de transferencia masiva de datos por USB.

Modo host

El modo host se introdujo en Android 3.1 (nivel de API 12).

Como el dispositivo Android debe actuar como host, y la mayoría de los dispositivos Android incluyen un conector micro-USB que no permite la operación del host directamente, por lo general, se requiere un adaptador para usar sobre la marcha (OTG) como este:

OTG

Figura 1: Adaptador para uso en movimiento (OTG)

Es posible que un dispositivo Android no proporcione suficiente energía para operar un periférico en particular, según la cantidad de energía que necesite y la que el dispositivo Android pueda suministrar. Incluso si hay energía suficiente disponible, la carga de la batería del dispositivo Android puede acortarse de forma significativa. En estas situaciones, usa un concentrador con alimentación, como este:

Concentrador con alimentación

Figura 2: Concentrador con alimentación

Modo de accesorio

El modo de accesorio se introdujo en Android 3.1 (nivel de API 12) y se adaptó a Android 2.3.4. En este modo, el dispositivo Android funciona como un periférico USB, bajo el control de otro dispositivo, como una estación de carga que funciona como host. La diferencia entre el modo de desarrollo y el modo de accesorio es que el host puede ver funciones USB adicionales, más allá de adb. El dispositivo Android comienza en modo de desarrollo y, luego, realiza la transición al modo de accesorio a través de un proceso de renegociación.

El modo de accesorio se extendió con funciones adicionales en Android 4.1, en particular, el audio que se describe a continuación.

Audio USB

Clases de USB

Cada función periférica tiene un documento de clase de dispositivo asociado que especifica el protocolo estándar para esa función. Esto permite que los hosts y las funciones periféricas conformes con la clase interoperen, sin conocimiento detallado del funcionamiento de cada uno. El cumplimiento de la clase es fundamental si el host y el periférico son proporcionados por entidades diferentes.

El término sin conductor es un sinónimo común de cumple con la clase, lo que indica que es posible usar las funciones estándar de un periférico de este tipo sin necesidad de instalar un controlador específico del sistema operativo. Se puede suponer que un periférico anunciado como “sin necesidad de controlador” para los principales sistemas operativos de computadoras de escritorio será compatible con la clase, aunque puede haber excepciones.

Clase de audio USB

Aquí, solo nos preocupamos por los periféricos que implementan funciones de audio y, por lo tanto, se adhieren a la clase de dispositivo de audio. Existen dos ediciones de la especificación de clase de audio USB: clase 1 (UAC1) y 2 (UAC2).

Comparación con otras clases

USB incluye muchas otras clases de dispositivos, algunas de las cuales se pueden confundir con la clase de audio. La clase de almacenamiento masivo (MSC) se usa para el acceso a contenido multimedia orientado a sectores, mientras que el protocolo de transferencia de contenido multimedia (MTP) se usa para el acceso completo a archivos multimedia. Se pueden usar MSC y MTP para transferir archivos de audio, pero solo la clase de audio USB es adecuada para la transmisión en tiempo real.

Terminales de audio

Por lo general, los terminales de un periférico de audio son analógicos. Un convertidor analógico a digital (ADC) convierte la señal analógica que se presenta en el terminal de entrada del periférico en digital y la transmite a través del protocolo USB para que la consuma el host. El ADC es una fuente de datos para el host. Del mismo modo, el host envía una señal de audio digital a través del protocolo USB al periférico, donde un convertidor de digital a analógico (DAC) lo convierte y lo presenta a una terminal de salida analógica. El DAC es un sumidero para el host.

Canales

Un periférico con función de audio puede incluir un terminal de origen, un terminal de destino o ambos. Cada dirección puede tener uno (mono), dos (estéreo) o más canales. Los periféricos con más de dos canales se denominan multicanal. Es común interpretar una transmisión estéreo como una que consta de canales izquierdo y derecho y, por extensión, interpretar una transmisión multicanal como una que tiene ubicaciones espaciales correspondientes a cada canal. Sin embargo, también es bastante apropiado (especialmente para el audio USB más que para HDMI) no asignar ningún significado espacial estándar a cada canal. En este caso, depende de la aplicación y del usuario definir cómo se usa cada canal. Por ejemplo, una transmisión de entrada USB de cuatro canales podría tener los primeros tres canales conectados a varios micrófonos dentro de una habitación y el canal final que recibe entradas de una radio AM.

Modo de transferencia isócrona

El audio USB usa el modo de transferencia isócrona por sus características en tiempo real, a costa de la recuperación de errores. En el modo isócrono, se garantiza el ancho de banda y se detectan los errores de transmisión de datos con una verificación de redundancia cíclica (CRC). Sin embargo, no hay confirmación ni reenvío de paquetes en caso de error.

Las transmisiones isocronas se producen cada período de inicio de trama (SOF). El período de SOF es de un milisegundo para la velocidad máxima y de 125 microsegundos para la velocidad alta. Cada trama a velocidad completa transporta hasta 1,023 bytes de carga útil, y una trama de alta velocidad transporta hasta 1,024 bytes. Si combinamos estos datos, calculamos la tasa de transferencia máxima como 1,023,000 o 8,192,000 bytes por segundo. Esto establece un límite superior teórico en la tasa de muestreo, la cantidad de canales y la profundidad de bits de audio combinados. El límite práctico es más bajo.

Dentro del modo isócrono, hay tres submodos:

  • Automático
  • Asincrónico
  • Síncrona

En el submodo adaptativo, el receptor o la fuente periféricos se adaptan a una tasa de muestreo potencialmente variable del host.

En el submodo asíncrono (también llamado comentarios implícitos), el destino o la fuente determinan la tasa de muestreo, y el host se adapta. La principal ventaja teórica del submodo asíncrono es que el reloj USB de la fuente o del sumidero está físicamente y eléctricamente más cerca (y, de hecho, puede ser el mismo que el reloj que impulsa el DAC o el ADC, o derivarse de él). Esta proximidad significa que el submodo asíncrono debería ser menos susceptible al jitter de reloj. Además, el reloj que usa el DAC o el ADC puede estar diseñado para una mayor precisión y una menor deriva que el reloj del host.

En el submodo síncrono, se transfiere una cantidad fija de bytes cada período de SOF. La tasa de muestreo de audio se deriva de manera efectiva del reloj USB. Por lo general, el submodo síncrono no se usa con audio porque el host y el periférico están a merced del reloj USB.

En la siguiente tabla, se resumen los submodos isocronos:

Submodo Recuento de bytes
por paquete
Tasa de muestreo
determinada por
Se usa para el audio
adaptable variable organizador
respuesta variable periférico
bot fijo Reloj USB no

En la práctica, el submodo es importante, pero también se deben tener en cuenta otros factores.

Compatibilidad de Android con la clase de audio USB

Modo de desarrollo

El audio USB no es compatible con el modo de desarrollo.

Modo host

Android 5.0 (nivel de API 21) y versiones posteriores admiten un subconjunto de funciones de audio USB de clase 1 (UAC1):

  • El dispositivo Android debe actuar como host.
  • El formato de audio debe ser PCM (tipo de interfaz I).
  • La profundidad de bits debe ser de 16, 24 o 32 bits, en la que 24 bits de datos de audio útiles se justifican a la izquierda dentro de los bits más significativos de la palabra de 32 bits.
  • La tasa de muestreo debe ser de 48, 44.1, 32, 24, 22.05, 16, 12, 11.025 u 8 kHz.
  • El recuento de canales debe ser 1 (monofónico) o 2 (estéreo).

El análisis del código fuente del framework de Android puede mostrar código adicional más allá del mínimo necesario para admitir estas funciones. Sin embargo, este código aún no se validó, por lo que aún no se reclaman las funciones más avanzadas.

Modo de accesorio

Android 4.1 (nivel de API 16) agregó compatibilidad limitada con la reproducción de audio para el host. En el modo de accesorio, Android enruta automáticamente la salida de audio a USB. Es decir, el dispositivo Android funciona como fuente de datos para el host, por ejemplo, una estación de carga.

El audio en modo de accesorio tiene las siguientes funciones:

  • El dispositivo Android debe estar controlado por un host con conocimientos que primero pueda migrar el dispositivo Android del modo de desarrollo al modo de accesorio y, luego, transferir los datos de audio desde el extremo adecuado. Por lo tanto, el dispositivo Android no aparece como "sin controlador" para el host.
  • La dirección debe ser entrada, expresada en relación con el host.
  • El formato de audio debe ser PCM de 16 bits.
  • La tasa de muestreo debe ser de 44.1 kHz.
  • El recuento de canales debe ser 2 (estéreo).

El audio en modo de accesorio no se adoptó ampliamente y, por el momento, no se recomienda para diseños nuevos.

Aplicaciones del audio digital USB

Como su nombre indica, la señal de audio digital USB está representada por un flujo de datos digital en lugar de la señal analógica que usa el miniconector de auriculares TRS común. En última instancia, cualquier señal digital debe convertirse a analógica para que se pueda escuchar. Elegir dónde colocar esa conversión tiene sus ventajas y desventajas.

Una historia de dos DAC

En el siguiente diagrama de ejemplo, comparamos dos diseños. Primero, tenemos un dispositivo móvil con procesador de aplicaciones (AP), DAC integrado, amplificador y conector TRS analógico conectado a auriculares. También consideramos un dispositivo móvil con USB conectado a un DAC y amplificador USB externos, también con auriculares.

Comparación de DAC

Figura 3: Comparación de dos DAC

¿Cuál diseño es mejor? La respuesta depende de tus necesidades. Cada uno tiene ventajas y desventajas.

Nota: Esta es una comparación artificial, ya que un dispositivo Android real probablemente tendría ambas opciones disponibles.

El primer diseño A es más simple, menos costoso, usa menos energía y será un diseño más confiable, siempre que los componentes sean igualmente confiables. Sin embargo, por lo general, se producen compensaciones en la calidad del audio en comparación con otros requisitos. Por ejemplo, si se trata de un dispositivo de consumo masivo, es posible que esté diseñado para satisfacer las necesidades del consumidor general, no para el audiófilo.

En el segundo diseño, el periférico de audio externo C se puede diseñar para obtener una mejor calidad de audio y una mayor potencia de salida sin afectar el costo del dispositivo Android básico para el mercado masivo B. Sí, es un diseño más costoso, pero solo quienes lo desean absorben el costo.

Los dispositivos móviles son conocidos por tener placas de circuitos de alta densidad, lo que puede generar más oportunidades de diafonía que degrada las señales analógicas adyacentes. La comunicación digital es menos susceptible al ruido, por lo que mover el DAC del dispositivo Android A a una placa de circuito externa C permite que las etapas analógicas finales se aíslen físicamente y eléctricamente de la placa de circuito densa y ruidosa, lo que genera un audio de mayor fidelidad.

Por otro lado, el segundo diseño es más complejo, y con la complejidad adicional, surgen más oportunidades de que algo falle. También hay latencia adicional de los controladores USB.

Aplicaciones del modo de host

Entre las aplicaciones de audio típicas del modo host USB, se incluyen las siguientes:

  • reproducción de música
  • telefonía
  • mensajería instantánea y chat de voz
  • grabando

En todas estas aplicaciones, Android detecta un periférico de audio digital USB compatible y enruta automáticamente la reproducción y captura de audio de forma adecuada, según las reglas de la política de audio. El contenido estéreo se reproduce en los dos primeros canales del periférico.

No hay APIs específicas para el audio digital USB. En el caso del uso avanzado, el enrutamiento automático puede interferir con las aplicaciones que reconocen conexiones USB. En el caso de esas aplicaciones, inhabilita el enrutamiento automático a través del control correspondiente en la sección Multimedia de Configuración / Opciones para desarrolladores.

Cómo depurar en modo host

Mientras el dispositivo está en modo host USB, la depuración de adb por USB no está disponible. Consulta la sección Uso inalámbrico de Android Debug Bridge para obtener una alternativa.

Cómo implementar el audio USB

Recomendaciones para proveedores de periféricos de audio

Para realizar la interoperabilidad con dispositivos Android, los proveedores de periféricos de audio deben cumplir con lo siguiente:

  • Diseña para el cumplimiento de la clase de audio. Actualmente, Android se orienta a la clase 1, pero es conveniente planificar para la clase 2.
  • evitar peculiaridades
  • Prueba la interoperabilidad con dispositivos Android populares y de referencia
  • Documenta claramente las funciones compatibles, el cumplimiento de la clase de audio, los requisitos de energía, etcétera, para que los consumidores puedan tomar decisiones fundamentadas.

Recomendaciones para OEMs de dispositivos Android y proveedores de SoC

Para admitir el audio digital USB, los OEM de dispositivos y los proveedores de SoC deben hacer lo siguiente:

  • Diseñar hardware para admitir el modo de host USB
  • Habilita la compatibilidad con hosts USB genéricos a nivel del framework a través de la marca de función android.hardware.usb.host.xml.
  • Habilita todas las funciones del kernel necesarias: modo host USB, audio USB y modo de transferencia isócrona.
  • mantenerse al tanto de las versiones y los parches de kernel recientes; a pesar del noble objetivo de cumplimiento de clases, existen periféricos de audio existentes con peculiaridades, y los kernels recientes tienen soluciones para esas peculiaridades
  • Habilita la política de audio USB como se describe a continuación.
  • Agrega audio.usb.default a PRODUCT_PACKAGES en device.mk.
  • Prueba la interoperabilidad con periféricos de audio USB comunes

Habilita la política de audio USB

Para habilitar el audio USB, agrega una entrada al archivo de configuración de la política de audio. Por lo general, se encuentra aquí:

device/oem/codename/audio_policy.conf

El componente de ruta de acceso "oem" se debe reemplazar por el nombre del OEM que fabrica el dispositivo Android, y "codename" se debe reemplazar por el nombre de código del dispositivo.

A continuación, se muestra un ejemplo de entrada:

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
      }
    }
  }
  ...
}

Código fuente

La implementación de la capa de abstracción de hardware (HAL) de audio para audio USB se encuentra aquí:

hardware/libhardware/modules/usbaudio/

El HAL de audio USB depende en gran medida de tinyalsa, que se describe en Terminología de audio. Aunque el audio USB se basa en transferencias isocronas, la implementación de ALSA lo abstrae. Por lo tanto, el HAL de audio USB y tinyalsa no necesitan preocuparse por esta parte del protocolo USB.

Cómo probar el audio USB

Para obtener información sobre las pruebas de CTS para audio USB, consulta Pruebas del verificador de CTS de audio USB.