Esta pagina se ve mejor con JavaScript habilitado

Auriculares BlueTooth en FreeBSD

 ·  🎃 kr0m

El soporte BlueTooth en sistemas Unix siempre ha sido precario ocasionando todo tipo de problemas, la única excepción son los sistemas móviles Android/IOS, en Linux el funcionamiento es nefasto a pesar de que este actúa como base de Android pero por alguna razón no funcionan del mismo modo. En este artículo veremos como solventar todos estos problemas independientemente del sistema operativo ya que emplearemos una tarjeta de sonido USB que transformará la señal a BT.

Primero indicar el hardware del que disponemos para que no haya confusión alguna:

Consultamos las tarjetas de sonido del sistema, al conectar el 1Mii vemos que aparece un dispositivo nuevo, pcm8:

cat /dev/sndstat

Installed devices:  
pcm0: <NVIDIA (0x0084) (HDMI/DP 8ch)> (play)  
pcm1: <NVIDIA (0x0084) (HDMI/DP 8ch)> (play)  
pcm2: <NVIDIA (0x0084) (HDMI/DP 8ch)> (play)  
pcm3: <NVIDIA (0x0084) (HDMI/DP 8ch)> (play)  
pcm4: <Realtek ALC1150 (Analog 5.1+HP/2.0)> (play/rec) default  
pcm5: <Realtek ALC1150 (Rear Digital)> (play)  
pcm6: <Realtek ALC1150 (Front Analog Mic)> (rec)  
pcm7: <USB audio> (rec)  
pcm8: <USB audio> (play/rec)  
No devices installed from userspace.

Para cambiar la tarjeta que debe utilizar el sistema operativo es tan sencillo como ejecutar:

sysctl hw.snd.default_unit=8

Por el lado de los auriculares tan solo debemos emparejarlo con el 1Mii tal como se indica en el manual de usuario.

Para que el cambio entre tarjetas de sonido sea mas ágil he programado un pequeño script:

vi .scripts/audioSwap.sh

#!/usr/local/bin/bash

LAST_DEVICE=$(grep pcm /dev/sndstat | awk -F ":" '{print$1}' | awk -F "pcm" '{print$2}' | tail -n1)
#echo "LAST_DEVICE: $LAST_DEVICE"
for NEXT_DEVICE in $(grep pcm /dev/sndstat | awk -F ":" '{print$1}' | awk -F "pcm" '{print$2}'); do
    #echo "NEXT_DEVICE: $NEXT_DEVICE"
    CURRENT_DEVICE=$(grep default /dev/sndstat | awk -F ":" '{print$1}' | awk -F "pcm" '{print$2}')
    #echo "CURRENT_DEVICE: $CURRENT_DEVICE"
    if [ $NEXT_DEVICE -le $CURRENT_DEVICE ] && [ $NEXT_DEVICE -ne $LAST_DEVICE ]; then
        #echo "Continue"
        continue
    else
        if [ $CURRENT_DEVICE -eq $LAST_DEVICE ] && [ $NEXT_DEVICE -eq $LAST_DEVICE ]; then
            NEXT_DEVICE=0
            #echo "NEXT_DEVICE: $NEXT_DEVICE"
        fi
        DEVICE_NAME=$(grep pcm$NEXT_DEVICE /dev/sndstat | awk -F "<" '{print$2}' | awk -F ">" '{print$1}')
        sysctl hw.snd.default_unit=$NEXT_DEVICE
        if [ $? -eq 0 ]; then
            notify-send "Audio device changed: PCM$NEXT_DEVICE: $DEVICE_NAME"
            # Needed for Ubuntu jail
            killall pulseaudio
            break
        else
            notify-send "Error changing audio device, reverting"
            sysctl hw.snd.default_unit=$CURRENT_DEVICE
        fi
    fi
done

Asignamos los permisos necesarios:

chmod 700 .scripts/audioSwap.sh

Y he modificado la configuración de Awesome para que ejecute el script con el shortcut “Mod + .”

vi .config/awesome/rc.lua

-- {{{ Key bindings
globalkeys = awful.util.table.join(
    -- CUSTOM KEYBINDINGS:
    awful.key({modkey, }, ".", function () awful.util.spawn("/home/kr0m/.scripts/audioSwap.sh") end),

El único inconveniente es que las aplicaciones tienen que ser reiniciadas para que utilicen la nueva tarjeta configurada, en Chrome por ejemplo hay que cerrar la pestaña del reproductor y volver a abrirla.

En cuanto a software VoIP funcionan perfectamente, tan solo pasamos el 1Mii a modo llamada y elegimos el dispositivo correcto en el software VoIP, debemos tener en cuenta que el ancho de banda BT es muy limitado por lo que para poder recibir y emitir audio(modo llamada) reducirá de forma notable la calidad del audio, recordad pasar a modo reproducción cuando terminéis la llamada para disfrutar de nuevo de una calidad de audio superior.

NOTA: El firmware de mis auriculares debe de estar bugeado, al pasar de audio a llamada no hay problema pero al pasar de modo llamada a audio es necesario apagarlos y encenderlos para que reconecten, si no lo hacemos no hay audio.

En sistemas como Android/IOS por lo visto no disminuye la calidad de sonido porque hacen algún tipo de multiplexación de la emisión/recepción del audio para no tener que pasar a modo llamada, dejo aquí el enlace donde lo comentan:

Bluetooth doesn’t have the bandwidth necessary to act as A2DP sink while also transmitting audio back to the pc. Android phones and iphones switch “on the fly” so that it sounds good to both ends but the linux implementation does not.

Destacar que en Mumble ya no hace falta hacer nada de lo descrito en este artículo anterior , tan solo elegir el dispositivo de audio correcto, en mi caso default OSS.


Otro software con el que funcionan sin problemas es Discord tan solo hay que cerrar la pestaña del navegador y volver a abrirla tras cambiar la tarjeta de sonido del sistema operativo.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí