Este artículo analiza 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 fabricantes de equipos originales (OEM) de dispositivos Android, proveedores de SoC, proveedores de periféricos de audio USB, desarrolladores de aplicaciones de audio avanzadas y otras personas que buscan una comprensión detallada de los componentes internos del audio digital USB en Android.
Los usuarios finales de dispositivos Nexus deberían ver el artículo Grabar y reproducir audio usando el modo host USB en el Centro de ayuda de Nexus . Aunque este artículo no está dirigido a 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 está formalmente definido por los estándares publicados por USB Implementers Forum, Inc. Para mayor comodidad, resumimos aquí 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 único 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 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 mediante 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 hasta un punto final , una fuente de datos o un sumidero proporcionado por una de las funciones del periférico.
Hay dos tipos de canalizaciones: mensajes y transmisiones . 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 host inicia todas las transferencias de datos, por lo tanto, 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.
Hay tres modos principales de transferencia de datos: interrupción , masiva e isócrona . El modo isócrono se analizará más a fondo 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 en el modo de transferencia masiva de datos USB.
Modo anfitrión
El modo de host se introduce 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 directamente la operación del host, generalmente se requiere un adaptador portátil ( OTG ) como este:
Es posible que un dispositivo Android no proporcione suficiente energía para operar un periférico en particular, dependiendo de cuánta energía necesita el periférico y de cuánta energía es capaz de suministrar el dispositivo Android. Incluso si hay disponible la energía adecuada, la carga de la batería del dispositivo Android puede reducirse significativamente. Para estas situaciones, utilice un concentrador con alimentación como este:
Modo accesorio
El modo accesorio se introdujo en Android 3.1 (API nivel 12) y se trasladó 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 actúa como host. La diferencia entre el modo de desarrollo y el modo 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 pasa al modo accesorio mediante 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 y las funciones periféricas compatibles con su clase interoperen, sin un 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 controlador es un sinónimo común de compatible con 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 cumplirá con la clase, aunque puede haber excepciones.
clase de audio USB
Aquí nos ocuparemos únicamente de los periféricos que implementan funciones de audio y, por tanto, pertenecen 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. Se pueden utilizar tanto MSC como MTP para transferir archivos de audio, pero sólo 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 a digital mediante un convertidor 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) la convierte y la presenta a un 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 que un flujo estéreo consta de canales izquierdo y derecho y, por extensión, interpretar que un flujo multicanal tiene 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, corresponde a la aplicación y al usuario definir cómo se utiliza 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 recibiendo entrada de una radio AM.
Modo de transferencia isócrono
El audio USB utiliza el modo de transferencia isócrono por sus características de 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 del paquete en caso de error.
Las transmisiones isócronas ocurren en 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 alta velocidad transporta hasta 1023 bytes de carga útil y una trama de alta velocidad transporta hasta 1024 bytes. Juntándolos, 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, el número de canales y la profundidad de bits combinados. El límite práctico es inferior.
Dentro del modo isócrono, existen tres submodos:
- Adaptado
- Asincrónico
- Sincrónico
En el submodo adaptativo, el sumidero o fuente 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 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 receptor 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 las fluctuaciones del reloj. Además, el reloj utilizado por el DAC o ADC puede diseñarse para una mayor precisión y una menor deriva que el reloj del host.
En el submodo síncrono, se transfiere un número fijo de bytes en 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 sí 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 versiones posteriores admiten un subconjunto de funciones de audio USB clase 1 (UAC1):
- El dispositivo Android debe actuar como anfitrión.
- 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 recuento 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 reproducción de audio al host. Mientras está en modo accesorio, Android dirige automáticamente su salida de audio al USB. Es decir, el dispositivo Android sirve como fuente de datos para el host, por ejemplo una base.
El audio en modo accesorio tiene estas características:
- El dispositivo Android debe estar controlado por un host con conocimientos que pueda primero realizar la transición del dispositivo Android del modo de desarrollo al modo accesorio y, luego, el host debe transferir datos de audio desde el punto final adecuado. Por lo tanto, el dispositivo Android no aparece como "sin controlador" para el anfitrión.
- 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 recuento 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 del audio digital USB
Como su nombre 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 de miniauricular TRS común. Finalmente, cualquier señal digital debe convertirse a analógica antes de poder escucharse. Hay compensaciones a la hora de elegir dónde realizar 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 auriculares. También consideramos un dispositivo móvil con USB conectado a un DAC USB externo y un amplificador, también con auriculares.
¿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, utiliza menos energía y será un diseño más confiable asumiendo componentes igualmente confiables. Sin embargo, normalmente existen compensaciones en la calidad del 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 las del audiófilo.
En el segundo diseño, el periférico de audio externo C se puede diseñar para una mayor calidad de audio y mayor potencia de salida sin afectar el costo del dispositivo Android B básico del mercado masivo. Sí, es un diseño más caro, pero el costo es absorbido solo por los que lo quieran.
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 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 una complejidad añadida surgen más oportunidades de que las cosas fallen. También hay latencia adicional de los controladores USB.
Aplicaciones en modo host
Las aplicaciones de audio típicas en modo host USB incluyen:
- escuchando 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 existen API específicas para el audio digital USB. Para uso avanzado, el enrutamiento automático puede interferir con aplicaciones compatibles con USB. Para dichas aplicaciones, desactive el enrutamiento automático a través del control correspondiente en la sección Medios de Configuración/Opciones de desarrollador .
Depurar en modo host
Mientras está en modo 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 conocer una alternativa.
Implementar audio USB
Recomendaciones para proveedores de periféricos de audio
Para poder interoperar con dispositivos Android, los proveedores de periféricos de audio deben:
- diseño para cumplimiento de clases de audio; Actualmente, Android apunta a la clase 1, pero es aconsejable planificar para la clase 2.
- evitar peculiaridades
- prueba de interoperabilidad con dispositivos Android populares y de referencia
- Documente claramente las características admitidas, el cumplimiento de la clase de audio, los requisitos de energía, etc. para que los consumidores puedan tomar decisiones informadas.
Recomendaciones para fabricantes de equipos originales (OEM) y proveedores de SoC de dispositivos Android
Para admitir audio digital USB, los fabricantes de dispositivos OEM y los proveedores de SoC deben:
- diseñar hardware para soportar el modo host USB
- habilite la compatibilidad con host USB genérico a 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
- mantenerse actualizado con las últimas versiones y parches del kernel; 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 dichas 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
Habilitar política de audio USB
Para habilitar el audio USB, agregue una entrada al archivo de configuración de la política de audio. 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 código 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 audio USB HAL depende en gran medida de tinyalsa , descrito en Terminología de audio . Aunque el audio USB se basa en transferencias isócronas, la implementación de ALSA abstrae esto. Por lo tanto, USB audio HAL y tinyalsa no necesitan preocuparse por esta parte del protocolo USB.
Probar audio USB
Para obtener información sobre las pruebas CTS para audio USB, consulte Pruebas del verificador CTS de audio USB .