Usando tu ODROID-XU4 como altavoz Bluetooth A2DP o como una unidad de manos libres HFP con tu iPhone

ODROID Magazine Feb 2018 Issue A2DP

En este artículo se presentan dos posibles usos que pueden ser de especial interés para todos aquellos que desarrollas ordenadores para vehículos usando los ODROIDs. El primero es transmitir audio a través de Bluetooth A2DP desde un iPhone a un ODROID-XU4, y el segundo consiste en utilizar el ODROID-XU4 como una unidad de manos libres HFP para el iPhone durante las llamadas. Para este proyecto utilizaremos el sistema bluetooth Bluez 5, el entorno de desarrollo de aplicaciones móviles oFono y el software de sistema de sonido PulseAudio. Aunque no lo he probado, este procedimiento también debería funcionar con un teléfono Android.

A2DP es muy fácil de configurar y se completa con la configuración del manos libres. HFP es más difícil de configurar porque requiere compilar PulseAudio 11 desde la fuente y reemplazar el paquete PulseAudio 8 preinstalado en Ubuntu MATE. He dividido este artículo en dos secciones para que aquellos que sólo estén interesados en A2DP eviten la dificultad que tiene lograr que HFP funcione. Si solo estás interesado en la funcionalidad del altavoz Bluetooth, puede utilizar el sistema de audio integrado del ODROID-XU4 sobre el puerto HDMI en lugar del adaptador de audio USB basado en el C-Media CM108. Para que las cosas sean lo más simples posible, vamos a suponer que utilizarás el adaptador de audio USB que aparece en este artículo.

Antes de empezar, ten en cuenta que la documentación y los debates sobre las últimas versiones de Bluez 5, oFono y PulseAudio son algo escasas. La mayor parte de lo que encontré on line para el posible uso de este proyecto era demasiado antiguo, centrado en versiones anteriores del software. Si te encuentras con algún problema al intentar probar este proyecto, es muy probable que no encuentre a nadie experto en el tema para ayudarte, incluido yo mismo. Te aconsejo que no te desvíes demasiado de mis indicaciones y del hardware que he utilizado hasta que hayas configurado correctamente el proyecto, entonces podrás dar rienda suelta a tu creatividad sabiendo que tienes un punto de partida funcional al que puedes volver.

Fase 1: A2DP

A2DP se puede ejecutar usando los paquetes preinstalados con Uuntu 16.04.3 MATE: Bluez 5.37, oFono 1.17 y PulseAudio 8. Empieza con un ODROID-XU4 ejecutando el Ubuntu oficial 16.04.3 con una imagen MATE kernel 4.9 y ejecuta todas las actualizaciones del sistema operativo antes de empezar con este proyecto. Yo usé el archivo de imagen ubuntu-16.04.3-4.9-mate-odroid-xu4-20170824.img. Posiblemente sea mejor elegir el ODROID-XU4 en lugar del ODROID-XU4Q, ya que el rendimiento extra de la CPU puede ayudarte a reducir la latencia de audio de las llamadas o mejorar la calidad del audio si decide ir más allá y optimizar el remuestreo del PulseAudio.

Los dispositivos específicos que utilicé para este proyecto son:

  • iPhone 5S
  • Adaptador USB Bluetooth Cambridge Silicon Radio: http://bit.ly/2gNybJW.
  • Adaptador de audio USB Sanwu Audio SW-HF07 (con un chip C-Media CM108 que sabemos que funciona en ARM LINUX con el driver que integra): http://bit.ly/2zEBIWZ.
  • Auriculares con micrófono de 3.5mm independiente y clavijas de auricular para hacer pruebas

ODROID Magazine Figure 1 - Closeup of the USB bluetooth and audio adapters Figura 1 – Primer plano de los adaptadores de audio y bluetooth USB

Inserta los adaptadores de audio y Bluetooth USB en los puertos USB disponibles en el ODROID-XU4, luego conecta los auriculares y el micrófono en las clavijas correspondientes del adaptador de audio USB.

Seleccionar la interfaz de audio correcta

Inicie sesión en el escritorio MATE como el usuario predeterminado "odroid". Este paso es importante porque PulseAudio está configurado para ejecutarse en modo usuario por defecto, así que se iniciará automáticamente tras iniciar sesión, pero no se estará ejecutando cuando se muestra la pantalla de inicio de sesión. No vamos a configurar PulseAudio para ejecutarlo en todo el sistema, ya que presenta ciertas dificultades.

Prueba el audio utilizando la aplicación de Preferencias de sonido incorporada en MATE. Cambia y guarda la configuración según sea necesario, testea el sonido tanto como sea necesario. Como yo utilizo un adaptador de audio C-Media USB, he tenido que seleccionarlo como dispositivo de entrada y salida predeterminado en lugar del audio integrado del ODROID-XU4 (salida a través del puerto HDMI). Deje la aplicación de preferencias de sonido abierta para que PulseAudio se ejecute en la sesión de usuario.

ODROID Magazine Figure 2 - Selecting the USB Audio Device as input in the Sound Preferences control panel Figura 2 – Seleccionando el dispositivo de audio USB como entrada en el panel de control de Preferencias de sonidoODROID Magazine Figure 3 - Selecting the USB Audio Device as output in the Sound Preferences control panel Figura 3 – Seleccionando el dispositivo de audio USB como salida en el panel de control de Preferencias de sonido

En el directorio /home/odroid/.config/pulse, busque los archivos que terminan en "-default-sink" y "-default-source" y anote los nombres de los archivos y sus contenidos. Deberías ver algo como esto:

dc87f36fc06c441a85ff7269baabcdef-default-sink:
 alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-stereo

dc87f36fc06c441a85ff7269baabcdef-default-source:
 alsa_input.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-mono
Queremos que el dispositivo seleccionado en ambos archivos sea la interfaz de audio que tiene el micrófono, que generalmente no es la salida de audio HDMI integrada. Use la aplicación de Sonido para probar la entrada y salida de audio antes de pasar al siguiente paso.

Emparejamiento Bluetooth con tu iPhone

Bluez 5.x ya está preinstalado en la imagen de Ubuntu 16.04.3 MATE, así que todo lo que tenemos que hacer es vincular tu iPhone al ODROID-XU4. Utilizaremos el comando bluetoothctl incluido, que se debe ejecutar con privilegios de root, o de lo contrario aparecerá un error:

$ sudo -s
# bluetoothctl
 [bluetooth]# show
Deberías ver algo como esto:
Controller 00:AA:BB:CC:DD:11
 Name: odroid
 Alias: odroid
 Class: 0x1c0000
 Powered: yes
 Discoverable: no
 Pairable: yes
 UUID: Headset AG (00001112-0000-1000-8000-###########)
 UUID: Generic Attribute Profile (00001801-0000-1000-8000-###########)
 UUID: A/V Remote Control (0000110e-0000-1000-8000-###########)
 UUID: OBEX File Transfer (00001106-0000-1000-8000-###########)
 UUID: Generic Access Profile (00001800-0000-1000-8000-###########)
 UUID: OBEX Object Push (00001105-0000-1000-8000-###########)
 UUID: PnP Information (00001200-0000-1000-8000-###########)
 UUID: A/V Remote Control Target (0000110c-0000-1000-8000-###########)
 UUID: IrMC Sync (00001104-0000-1000-8000-###########)
 UUID: Audio Sink (0000110b-0000-1000-8000-###########)
 UUID: Audio Source (0000110a-0000-1000-8000-###########)
 UUID: Vendor specific (00005005-0000-1000-8000-###########)
 UUID: Message Notification Se.. (00001133-0000-1000-8000-###########)
 UUID: Phonebook Access Server (0000112f-0000-1000-8000-###########)
 UUID: Message Access Server (00001132-0000-1000-8000-###########)
 Modalias: usb:v1D6Bp0246d0525
 Discovering: no
Si PulseAudio no se está ejecutando, la lista de perfiles es mucho más corta.

Si "Powered" no es "yes", escribe el siguiente comando:

# power on
Ahora empecemos a emparejar escaneando los dispositivos cercanos:
# scan on
En tu iPhone, ve a Configuración> Bluetooth y asegúrate de que esté encendido y sea visible. Tarde o temprano verás tu iPhone aparecer en el escaneo por su dirección MAC Bluetooth. Escribe a continuación esta dirección MAC ya que la usará repetidas veces en lugar de .
# scan off
# agent KeyboardOnly
# default-agent
# pair [MAC]
Puede fallar; inténtalo de nuevo hasta que logres realizar el emparejamiento y te solicite la clave de acceso. Mira en tu iPhone la clave e introdúcela cuando aparezca:
Attempting to pair with [MAC]
 [CHG] Device [MAC] Connected: yes
 Request passkey
 [agent] Enter passkey (number in 0-999999): ######

# connect [MAC]
# trust [MAC]
# info
Deberías ver los detalles en tu iPhone y tus perfiles de Bluetooth. En tu iPhone, debería mostrarse que el dispositivo llamado "odroid" está conectado.
# exit
Figure 4 - Connecting the ODROID in the iPhone Bluetooth settings Figura 4 - Conectando ODROID en la configuración de Bluetooth del iPhone

Llegados a este punto, deberías ser capaz de enviar la reproducción de audio desde la aplicación iTunes de su iPhone al ODROID-XU4 a través del Bluetooth. Si no lo consigues, dirígete a las preferencias de Bluetooth del iPhone y fuerza la reconexión al "odroid", incluso si ya está conectado.

ODROID Magazine Figure 5 - Sending audio playback via Bluetooth from iTunes to the ODROID-XU4 Figura 5 – Enviando la reproducción de audio a través de Bluetooth desde iTunes al ODROID-XU4

También es posible escuchar el marcado cuando se usa la aplicación del Teléfono, pero como todavía no hemos configurado el ODROID-XU4 con HFP, no oirás nada una vez que la aplicación del Teléfono abra la llamada.

Fase 2: HFP

El siguiente paso es instalar Ofono 1.17.x para el perfil de manos libres Bluetooth, ya que no se encuentra preinstalado en la imagen del sistema operativo. Suponiendo que todavía seguimos en la misma sesión "sudo -s", escribe el siguiente comando:

# apt-get install ofono
Verifica que el perfil de Bluetooth esté añadido:
# bluetoothctl
 [bluetooth]# show

Controller 00:AA:BB:CC:DD:11
 Name: odroid
 Alias: odroid
 Class: 0x3c0000
 Powered: yes
 Discoverable: no
 Pairable: yes
 UUID: Headset AG (00001112-0000-1000-8000-###########)
 UUID: Generic Attribute Profile (00001801-0000-1000-8000-###########)
 UUID: A/V Remote Control (0000110e-0000-1000-8000-###########)
 UUID: OBEX File Transfer (00001106-0000-1000-8000-###########)
 UUID: Generic Access Profile (00001800-0000-1000-8000-###########)
 UUID: OBEX Object Push (00001105-0000-1000-8000-###########)
 UUID: PnP Information (00001200-0000-1000-8000-###########)
 UUID: A/V Remote Control Target (0000110c-0000-1000-8000-###########)
 UUID: IrMC Sync (00001104-0000-1000-8000-###########)
 UUID: Audio Sink (0000110b-0000-1000-8000-###########)
 UUID: Audio Source (0000110a-0000-1000-8000-###########)
 UUID: Handsfree (0000111e-0000-1000-8000-###########)
 UUID: Vendor specific (00005005-0000-1000-8000-###########)
 UUID: Message Notification Se.. (00001133-0000-1000-8000-###########)
 UUID: Phonebook Access Server (0000112f-0000-1000-8000-###########)
 UUID: Message Access Server (00001132-0000-1000-8000-###########)
 Modalias: usb:v1D6Bp0246d0525
 Discovering: no
Date cuenta que ahora tenemos el perfil de Manos libres (5º contando desde abajo en la sección UUID de la lista). A continuación, salte de bluetoothctl:
# exit
Llegados a este punto, es posible iniciar una llamada telefónica con la aplicación de teléfono del iPhone seleccionando el dispositivo "odroid" como audio de manos libres, oirás los tonos del teclado mientras se hace la llamada, pero tan pronto como empiece la llamada, el ODROID-XU4 soltará el audio y hará que el iPhone cambie desde "odroid" a su altavoz y micrófono internos.

Aquí es donde tenemos que experimentar un poco. PulseAudio 8 empaquetado por Ubuntu aparentemente tiene un error o le falta una función que provoca la caída del audio de la llamada y completa /var/log/syslog con estos mensajes de error (visibles si configuras PulseAudio en modo depuración):

D: [bluetooth] module-loopback.c: Requesting rewind due to end of underrun.
I: [alsa-sink-bcm2835 ALSA] module-loopback.c: Could not peek into queue
La solución es desinstalar PulseAudio 8 y luego compilar e instalar PulseAudio 11.1 (la última versión en el momento de escribir este artículo) desde el código fuente, tal y como se detalla a continuación.

Deberías estar todavía en la misma sesión "sudo -s", después de ejecutar bluetoothctl. Si no es así, escribe el siguiente comando:

$ sudo -s
Es posible que quieras hacer una copia de seguridad del archivo de inicio automático de PulseAudio para volver a utilizarlo más adelante:
# cp /etc/xdg/autostart/pulseaudio.desktop ~
# apt-get remove pulseaudio
# apt-get autoremove
# dpkg --purge pulseaudio
Es una buena idea eliminar la vieja carpeta de configuración de PulseAudio:
# rm -fr /etc/pulse
PulseAudio 8 ahora se encuentra eliminado, así que vamos a obtener, compilar e instalar PulseAudio 11.1:
# apt-get build-dep pulseaudio
# apt-get install git
# exit
$ cd ~
Hazte con el código fuente usando git con uno de los dos comandos que aparecen a continuación:
$ git clone git://anongit.freedesktop.org/pulseaudio/pulseaudio
o:
$ git clone http://anongit.freedesktop.org/git/pulseaudio/pulseaudio.git
PulseAudio también se lanza en archivos comprimidos si no quieres la versión de desarrollo del repositorio de git.
$ cd pulseaudio
$ export CFLAGS=-fomit-frame-pointer
$ ./autogen.sh
$ make
La compilación tardará unos 15 minutos y lanza muchas advertencias, pero debería finalizar sin ningún error importante. Si la compilación salió bien y debería ser así, puedes instalar PulseAudio.
$ sudo make install
Ten en cuenta que PulseAudio compilado desde la fuente ubica sus archivos de configuración dentro de /usr/local/etc/pulse, y no en /etc /pulse tal como lo hace el PulseAudio proporcionado con Ubuntu.

Existe un parámetro que activaremos en el archivo de configuración de PulseAudio para permitir que el micrófono mono sea remezclado a estéreo. Si no se hace, el audio procedente del micrófono será descartado.

$ sudo vi /usr/local/etc/pulse/daemon.conf
Elimina la marca de la siguiente línea borrando el punto y coma y guarda el archivo:
enable-remixing = yes
Debes reiniciar el ODROID-XU4 y volver a iniciar sesión con el usuario odroid, de lo contrario, PulseAudio actuará mal y provocará un “crujido” en el audio del micrófono. El reinicio hará que el iPhone pierda su conexión Bluetooth con ODROID. A continuación, puede iniciar PulseAudio (sin la ventaja de que los scripts que lo inician automáticamente al iniciar sesión):
# pulseaudio --start -D
En este punto, deberías poder direccionar el audio de la llamada al ODROID. Vuelve a conectar tu iPhone al dispositivo "odroid" dirigiéndote a Configuración> Bluetooth y seleccionando "odroid" en la lista de dispositivos emparejados.

Empieza reproduciendo música usando iTunes de iPhone. Luego, haz una llamada y escucha el audio de la llamada a través del ODROID. La prueba final es hablar a través del micrófono y que en el otro lado confirmen que pueden oírte.

ODROID Magazine Figure 6 - Testing the microphone during a phone call using the iPhone Figura 6 – Probando el micrófono durante una llamada telefónica usando el iPhone

Finalizando

Ten en cuenta que algunas de las funciones del panel de Sonido que proporciona Ubuntu ahora no funcionan porque hemos compilado e instalado PulseAudio desde cero. Particularmente, la utilidad "Test Speakers" en la pestaña Hardware parece que ya no funciona, no podrás escuchar los efectos de sonido de la IU MATE. Sin embargo, todavía era capaz de monitorizar visualmente la entrada del micrófono en la pestaña Input y ajustar el volumen usando el control deslizante de la bandeja del sistema. Configura PulseAudio para que se inicie automáticamente en el modo usuario creando este archivo (o copia el antiguo en su lugar, algo que yo no probé):

/etc/xdg/autostart/pulseaudio.desktop

[Desktop Entry]
 Version=1.0
 Name=PulseAudio Sound System
 Comment=Start the PulseAudio Sound System
 Exec=start-pulseaudio-x11
 Terminal=false
 Type=Application
 Categories=
 GenericName=
 X-GNOME-Autostart-Phase=Initialization
 X-KDE-autostart-phase=1
 NoDisplay=true
Reinicia el ODROID-XU4 e inicia sesión con el usuario "odroid", luego asegúrate de que PulseAudio se esté ejecutando antes de volver a conectar tu iPhone emparejado.

Solución de problemas

El procedimiento anterior ha sido probado cuidadosamente varias veces, de modo que son pocas la soluciones que existen a posibles problemas. Si algo saliese mal, estos simples pasos pueden ayudarte a corregir las cosas:

1) Reiniciar ODROID-XU4 (recuerda iniciar PulseAudio si no lo tienes configurado para iniciarse automáticamente)

2) Dirígete a la Configuración de iOS> Bluetooth y asegúrate de que el dispositivo "odroid" esté conectado. Si es así, desconectar y volver a conectar es una buena idea.

3) En el peor de los casos, hacer que el iPhone se olvide del dispositivo y volver a hacer el emparejamiento casi siempre arregla cosas.

Para cualquier otro error, lo mejor es mirar los registros log con el siguiente comando:

$ sudo tail -f /var/log/syslog | grep 'bluetooth\|ofono\|pulse'
Bluez 5, oFono y PulseAudio son bastante complejos, de modo que deberías centrarse en buscar debates en el foro sobre los mensajes de error que veas en el registro log, si los tienes. Es posible configurar cada uno para aumentar los niveles de registro log. He descubierto que con cambiar log-level = debug en PulseAudio /usr/local/etc/pulse/daemon.conf es suficiente. Por lo general, no me fue necesario ver los registros log de depuración de oFono o Bluez para solucionar problemas.

Ten en cuenta que los niveles de volumen de entrada y salida del audio no están controlados por el iPhone. Son controlados por PulseAudio, y la forma más sencilla de controlarlos es mediante el control deslizante de configuración de volumen situado en la bandeja del sistema de Ubuntu MATE y el control deslizante en la aplicación de Sonido. Además, algunos adaptadores de audio USB y micrófonos con cable tienen una mejoría en la entrada muy leve. Incluso con el volumen de entrada de PulseAudio al máximo, pueden llegar a ser demasiado bajo para que cubra tus necesidades. Siempre puedes probar con un micrófono diferente, un adaptador de audio USB distinto o usar un pequeño amplificador analógico entre el micrófono y el adaptador de audio USB. Si no estás satisfecho con la calidad de audio, es posible ajustar PulseAudio para que mejore en rendimiento y calidad. Esta es una amplia área temática que no cubrimos en este artículo.

Finalmente, observe que el iPhone no se conecta con ahínco al ODROID-XU4 a través de Bluetooth, como lo hace con mi altavoz Bluetooth, que también está basado en el chipset Cambridge Silicon Radio. Probablemente haya algunos ajustes dentro de Bluez que pueden cambiar la forma en la que se conecta a los dispositivos emparejados. Tampoco trataremos este tema aquí.

Conclusión

Si sigues las instrucciones anteriores y te acercas lo más posible al hardware que he utilizado, tendrá un ODROID-XU4 funcionando correctamente como un altavoz Bluetooth A2DP o una unidad de manos libres HFP para tu proyecto de ordenador para el coche. Te animo a que desarrolles sobre esta base, como, por ejemplo, escribir o exportar una aplicación que use la API completa de oFono para controlar el iPhone a través de una interfaz de usuario con pantalla táctil desde el ordenador del coche. Si estás pensando en poner en marcho este proyecto, por favor, comparte tus resultados con la comunidad ODROID escribiendo sobre ello en Odroid magazine.

Be the first to comment

Leave a Reply