Este artículo revisa la compatibilidad de Android con audio digital USB y protocolos basados en USB relacionados.
Audiencia
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 otros que buscan una comprensión detallada de las funciones internas de audio digital USB en Android.
Los usuarios finales de dispositivos Nexus deberían ver el artículo Grabar y reproducir audio usando el modo de host USB en el Centro de ayuda de Nexus . Aunque este artículo no está orientado a los usuarios finales, ciertos consumidores audiófilos pueden encontrar partes de su interés.
Descripción general de USB
Universal Serial Bus (USB) se describe informalmente en el artículo de Wikipedia USB y se define formalmente por los estándares publicados por USB Implementers Forum, Inc. Para mayor comodidad, aquí resumimos los conceptos clave de USB, pero los estándares son la referencia autorizada.
Conceptos básicos y terminología
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 Android o el concepto específico de Android llamado modo accesorio .
Una función crítica 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 múltiples funciones lógicas. Por ejemplo, un periférico de cámara web podría tener tanto una función de cámara como 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 una tubería a un punto final , una fuente de datos o un sumidero proporcionado por una de las funciones del periférico.
Hay dos tipos de conductos: mensaje y flujo . Se utiliza una canalización de mensajes para el control y el estado bidireccionales. Se utiliza una tubería de flujo para la transferencia de datos unidireccional.
El anfitrión inicia todas las transferencias de datos, por lo que los términos de entrada y salida se expresan en relación con el anfitrión. 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.
Hay tres modos principales de transferencia de datos: interrupción , volumen e isócrono . El modo isócrono se discutirá más adelante en el contexto del audio.
El periférico puede tener terminales que se conectan con el mundo exterior, más allá del propio periférico. De esta manera, el periférico sirve para traducir entre el protocolo USB y las señales del "mundo real". Los terminales son objetos lógicos de la función.
Modos USB de Android
modo de desarrollo
El modo de desarrollo ha estado presente desde el lanzamiento inicial de Android. El dispositivo Android aparece como un periférico USB en 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 sobre el modo de transferencia de datos masivos USB.
modo anfitrión
El modo Host se introduce en Android 3.1 (API nivel 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 directamente la operación del host, generalmente se requiere un adaptador portátil ( OTG ) como este:
![OTG](https://source.android.com/static/devices/audio/images/otg.jpg?authuser=5&hl=es)
Figura 1. Adaptador móvil (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 el periférico y la capacidad de suministro del dispositivo Android. Incluso si hay suficiente energía disponible, la carga de la batería del dispositivo Android puede acortarse significativamente. Para estas situaciones, utilice un concentrador alimentado como este:
![concentrador alimentado](https://source.android.com/static/devices/audio/images/hub.jpg?authuser=5&hl=es)
Figura 2. Concentrador alimentado
Modo accesorio
El modo accesorio se introdujo en Android 3.1 (API nivel 12) y se retroportó 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 base que sirve como host. La diferencia entre el modo de desarrollo y el modo accesorio es que las funciones USB adicionales son visibles para el host, más allá de adb. El dispositivo Android comienza en el modo de desarrollo y luego pasa al modo accesorio a través de un proceso de renegociación.
El modo accesorio se amplió con funciones adicionales en Android 4.1, en particular, el audio que se describe a continuación.
audio USB
Clases 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 compatibles con la clase y las funciones periféricas interoperen, sin un conocimiento detallado del funcionamiento de cada uno. El cumplimiento de la clase es crítico si el host y el periférico son provistos por diferentes entidades.
El término sin controlador es un sinónimo común de compatible con la clase , lo que indica que es posible utilizar las funciones estándar de dicho periférico sin necesidad de instalar un controlador específico del sistema operativo. Se puede suponer que un periférico anunciado como "no se necesita controlador" para los principales sistemas operativos de escritorio será compatible con la clase, aunque puede haber excepciones.
Clase de audio USB
Aquí nos ocupamos solo de los periféricos que implementan funciones de audio y, por lo tanto, se adhieren a la clase de dispositivos de audio. Hay 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 pueden confundirse con la clase de audio. La clase de almacenamiento masivo (MSC) se utiliza para el acceso a los medios orientado a sectores, mientras que el Protocolo de transferencia de medios (MTP) es para el acceso completo a los archivos de los medios. Tanto MSC como MTP se pueden usar para transferir archivos de audio, pero solo la clase de audio USB es adecuada para la transmisión en tiempo real.
Terminales de audio
Los terminales de un periférico de audio suelen ser analógicos. La señal analógica presentada en el terminal de entrada del periférico se convierte en digital mediante un convertidor de analógico a digital (ADC) y se transmite a través del protocolo USB para ser consumida por el host. El ADC es una fuente de datos para el host. De manera similar, 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) convierte y 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 fuente, un terminal receptor o ambos. Cada dirección puede tener un canal ( mono ), dos canales ( estéreo ) o más. Los periféricos con más de dos canales se denominan multicanal . Es común interpretar un flujo estéreo como si constara de canales izquierdo y derecho y, por extensión, interpretar un flujo multicanal como si tuviera ubicaciones espaciales correspondientes a cada canal. Sin embargo, también es bastante apropiado (especialmente para audio USB más que HDMI ) no asignar ningún significado espacial estándar particular a cada canal. En este caso, depende de la aplicación y del usuario definir cómo se utiliza cada canal. Por ejemplo, un flujo de entrada USB de cuatro canales puede tener los primeros tres canales conectados a varios micrófonos dentro de una habitación y el canal final recibiendo entrada de una radio AM.
Modo de transferencia isócrono
El audio USB utiliza el modo de transferencia isócrona por sus características en tiempo real, a expensas de la recuperación de errores. En modo isócrono, el ancho de banda está garantizado y los errores de transmisión de datos se detectan mediante una verificación de redundancia cíclica (CRC). Pero no hay acuse de recibo ni retransmisión de paquetes en caso de error.
Las transmisiones isócronas ocurren cada período de inicio de trama (SOF). El período SOF es de un milisegundo a máxima velocidad y de 125 microsegundos a alta velocidad. Cada trama de velocidad máxima transporta hasta 1023 bytes de carga útil y una trama de alta velocidad transporta hasta 1024 bytes. Al juntarlos, calculamos la tasa de transferencia máxima como 1,023,000 u 8,192,000 bytes por segundo. Esto establece un límite superior teórico en la frecuencia de muestreo de audio combinada, el recuento de canales y la profundidad de bits. El límite práctico es más bajo.
Dentro del modo isócrono, hay tres submodos:
- Adaptado
- Asincrónico
- Sincrónico
En el submodo adaptativo, la fuente o sumidero periférico se adapta a una frecuencia de muestreo potencialmente variable del host.
En el submodo asíncrono (también llamado retroalimentación implícita), el sumidero o la fuente determina la frecuencia de muestreo y el host se adapta. La principal ventaja teórica del submodo asíncrono es que el reloj USB fuente o sumidero está física y eléctricamente más cerca (y de hecho puede ser el mismo o derivado de) el reloj que impulsa el DAC o ADC. Esta proximidad significa que el submodo asíncrono debería ser menos susceptible a la fluctuación del reloj. Además, el reloj utilizado por el DAC o el ADC puede estar diseñado para una mayor precisión y una desviación menor que el reloj del host.
En el submodo síncrono, se transfiere un número fijo de bytes cada período SOF. La frecuencia de muestreo de audio se deriva efectivamente del reloj USB. El submodo síncrono no se usa comúnmente con audio porque tanto el host como el periférico están a merced del reloj USB.
La siguiente tabla resume los submodos isócronos:
submodo | recuento de bytes por paquete | Frecuencia de muestreo determinado por | Utilizado para audio |
---|---|---|---|
adaptado | variable | anfitrión | sí |
asincrónico | variable | periférico | sí |
sincrónico | fijado | Reloj USB | no |
En la práctica, el submodo, por supuesto, importa, pero también se deben considerar otros factores.
Soporte de Android para clase de audio USB
modo de desarrollo
El audio USB no es compatible con el modo de desarrollo.
modo anfitrión
Android 5.0 (API nivel 21) y superior admite un subconjunto de funciones de audio USB clase 1 (UAC1):
- El dispositivo Android debe actuar como host
- El formato de audio debe ser PCM (interfaz tipo I)
- La profundidad de bits debe ser de 16 bits, 24 bits o 32 bits donde 24 bits de datos de audio útiles están justificados a la izquierda dentro de los bits más significativos de la palabra de 32 bits.
- La frecuencia de muestreo debe ser 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 u 8 kHz
- El número de canales debe ser 1 (mono) o 2 (estéreo)
La lectura del código fuente del marco de trabajo de Android puede mostrar código adicional más allá del mínimo necesario para admitir estas funciones. Pero este código no ha sido validado, por lo que aún no se reclaman funciones más avanzadas.
Modo accesorio
Android 4.1 (API nivel 16) agregó soporte limitado para la reproducción de audio en el host. Mientras está en modo accesorio, Android enruta automáticamente su salida de audio a USB. Es decir, el dispositivo Android sirve como fuente de datos para el host, por ejemplo, un puerto.
El audio del modo accesorio tiene estas características:
- El dispositivo Android debe estar controlado por un host experto que primero pueda hacer la transición del dispositivo Android del modo de desarrollo al modo accesorio y, luego, el host debe 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 ingresada , expresada en relación con el host
- El formato de audio debe ser PCM de 16 bits
- La frecuencia de muestreo debe ser de 44,1 kHz.
- El número de canales debe ser 2 (estéreo)
El audio en modo accesorio no se ha adoptado ampliamente y actualmente no se recomienda para nuevos diseños.
Aplicaciones de audio digital USB
Como su nombre lo indica, la señal de audio digital USB está representada por un flujo de datos digitales en lugar de la señal analógica utilizada por el conector común de miniauriculares TRS. Eventualmente, cualquier señal digital debe convertirse a analógica antes de que pueda escucharse. Hay compensaciones al elegir dónde colocar esa conversión.
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 los auriculares. También consideramos un dispositivo móvil con USB conectado a DAC USB externo y amplificador, también con auriculares.
![comparación DAC](https://source.android.com/static/devices/audio/images/dac.png?authuser=5&hl=es)
Figura 3. Comparación de dos DAC
¿Qué 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 suponiendo componentes igualmente confiables. Sin embargo, generalmente hay compensaciones de calidad de audio frente a otros requisitos. Por ejemplo, si se trata de un dispositivo de mercado masivo, puede estar 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 mayor calidad de audio y una mayor potencia de salida sin afectar el costo del dispositivo Android B del mercado masivo básico. Sí, es un diseño más costoso, pero el costo solo lo absorbe los que lo quieren.
Los dispositivos móviles son conocidos por tener placas de circuitos de alta densidad, lo que puede dar lugar a 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 aislar física y eléctricamente las etapas analógicas finales de la placa de circuito densa y ruidosa, lo que da como resultado un audio de mayor fidelidad.
Por otro lado, el segundo diseño es más complejo, y con la complejidad añadida vienen más oportunidades para que las cosas fallen. También hay latencia adicional de los controladores USB.
Aplicaciones en modo host
Las aplicaciones típicas de audio en modo host USB incluyen:
- escuchar musica
- telefonía
- mensajería instantánea y chat de voz
- grabación
Para 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 manera 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 API específicas para el audio digital USB. Para uso avanzado, el enrutamiento automático puede interferir con las aplicaciones compatibles con USB. Para dichas aplicaciones, deshabilite el enrutamiento automático a través del control correspondiente en la sección Medios de Configuración/Opciones de desarrollador .
Depuración en modo host
Mientras está en el modo de host USB, la depuración de adb a través de USB no está disponible. Consulte la sección Uso inalámbrico de Android Debug Bridge para ver una alternativa.
Implementación de audio USB
Recomendaciones para proveedores de periféricos de audio
Para interoperar con dispositivos Android, los proveedores de periféricos de audio deben:
- diseño para el cumplimiento de la clase de audio; Actualmente, Android tiene como objetivo la clase 1, pero es aconsejable planificar para la clase 2
- evitar peculiaridades
- prueba de interoperabilidad con dispositivos Android populares y de referencia
- documentar claramente las funciones admitidas, el cumplimiento de la clase de audio, los requisitos de alimentación, etc. para que los consumidores puedan tomar decisiones informadas
Recomendaciones para OEM de dispositivos Android y proveedores de SoC
Para admitir audio digital USB, los fabricantes de dispositivos OEM y los proveedores de SoC deben:
- hardware de diseño para admitir el modo de host USB
- habilite el soporte de host USB genérico en el nivel de marco a través del indicador de función
android.hardware.usb.host.xml
- habilite todas las funciones del kernel necesarias: modo host USB, audio USB, modo de transferencia isócrona; ver Configuración del kernel de Android
- manténgase al día con los últimos lanzamientos y parches del núcleo; a pesar del noble objetivo del cumplimiento de la clase, existen periféricos de audio con peculiaridades , y los núcleos recientes tienen soluciones para tales peculiaridades
- habilite la política de audio USB como se describe a continuación
- agregue audio.usb.default a PRODUCT_PACKAGES en device.mk
- prueba de interoperabilidad con periféricos de audio USB comunes
Cómo habilitar la política de audio USB
Para habilitar el audio USB, agregue una entrada al archivo de configuración de la política de audio. Esto normalmente se encuentra aquí:
device/oem/codename/audio_policy.conf
El componente de nombre de ruta "oem" debe reemplazarse por el nombre del OEM que fabrica el dispositivo Android, y "nombre en clave" debe reemplazarse por el nombre en clave del dispositivo.
Aquí se muestra una entrada de ejemplo:
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 se basa en gran medida en tinyalsa , descrito en Terminología de audio . Aunque el audio USB se basa en transferencias isócronas, la implementación de ALSA lo abstrae. Por lo tanto, el audio USB HAL y tinyalsa no necesitan preocuparse por esta parte del protocolo USB.
Prueba de audio USB
Para obtener información sobre las pruebas CTS para audio USB, consulte Pruebas del verificador CTS de audio USB .