00 Firtro light - Rsantct/FIRtro-light GitHub Wiki

apt-daily

A veces se ponen las actualizaciones automáticas y eso repercute en interrupciones del audio

dmesg -T | grep daily

Las desactivamos:

sudo systemctl stop apt-daily.timer
sudo systemctl disable apt-daily.timer
sudo systemctl disable apt-daily.service
sudo systemctl daemon-reload

ALSA

Se configura /home/firtro/.asoundrc con el plugin jack apuntando a Ecasound.

Jack

Para procesar audio full duplex, es decir para escuchar la entrada de la tarjeta de sonido, con material audio+video hay que ajustar el buffer de jack al mínimo posible.

OjO: el buffer de JACK debe ser igual o menor que la particion de Brutefir.

jackd -R -dalsa -p1024 -n3 --softmode --shorts -dhw:CODEC,0 -r44100

+ Brutefir
    sampling_rate:     44100;
    filter_length:     4096,1;
    float_bits:        32;
    overflow_warnings: true;
    allow_poll_mode:   false;
    monitor_rate:      true;
    powersave:         -80;
    lock_memory:       false;
    show_progress:     false;

+ Ecasound
    8 paramétricos

Brutefir

Particionado

Hay que adaptarlo al menor buffer de Jack que seamos capaces de conseguir.

Dither: OFF

A estudiar: si se dispusiera de CPU suficiente, en quizás convenga activar el dither en Jack (audio/config).

Jack I/O

https://www.ludd.ltu.se/~torger/brutefir.html#bfio_jack

To avoid putting I/O-delay into the JACK graph, the JACK buffer size should be set to the same as the BruteFIR partition size. It is however possible to set the JACK buffer size to a smaller value. The I/O-delay in number of JACK buffers as seen by following JACK clients will be:

2 * BruteFIR_partition_size / JACK_buffer_size - 2

Note that both the JACK buffer size and BruteFIR period size is always a power of two.

Swap de disco

Desactivar el montaje de swap de disco en /etc/fstab .

O bien en sistemas Raspian modernos

/etc/dphys-swapfile
    CONF_SWAPSIZE=0 

O mejor ejecutar sudo /sbin/dphys-swapfile uninstall

Y configurar en brutefir_config

lock_memory: false;

Versión 1.0m (2013) vs 1.0o (2016)

Parece mejor la 1.0o, aunque no es algo claro. Es muy fácil compilar la 1.0o:

https://github.com/AudioHumLab/FIRtro/wiki/911-Brutefir---versiones#compilar-brutefir

Ecasound

Se usa una plantilla sencilla de 4 u 8 paramétricos por canal para minimizar la carga de CPU, debe quedar configurado en audio/config. Bajar las plantillas desde aquí:

https://github.com/Rsantct/FIRtro-light/tree/master/home/firtro/audio

Players

Radio streams de internet

Mediante una botonera al efecto en la web de control, podremos ejecutar mplayer sobre urls de streams de radio.

/home/firtro/bin_custom/mplayer_url.py radio3 &

Las "emisoras" quedan configuradas en el siguiente archivo:

audio/radio_urls

    [emisoras]
    rne             = "http://rtve-mp3-radiolive.flumotion.com/rtve/rtve-rne.mp3.m3u"
    radio3          = "http://rtve-mp3-radiolive.flumotion.com/rtve/rtve-radio3.mp3.m3u"
    radioclasica    = "http://rtve-mp3-radiolive.flumotion.com/rtve/rtve-radioclasica.mp3.m3u"
    m80             = "http://playerservices.streamtheworld.com/api/livestream-redirect/M80RADIO_SC"

Raspotify (librespot)

librespot v.0.11.3  Va bien, pero no responde a cambios de canción, solo sabe seguir con la
                    lista de reproducción
librespot v.0.12.0  Va bien todo.
librespot v.0.13.1  OjO esta version falla al sacar el audio por el plugin jack de ALSA,
                    aunque si que funciona usando hw:XXX ¿!?

Para raspberry pi (sirve en cualquier placa arm) se dispone de una “well known distro” con paquete Debian usado por muchos (Hifiberry, etc..)

https://github.com/dtcooper/raspotify

$ curl -sL https://dtcooper.github.io/raspotify/install.sh | sh

Esto instala automágicamente un paquete Debian, nos interesa solo el ejecutable que se instalará en /usr/bin/librespot

Tiene un archivo de configuración en /etc/default/raspotify, pero no lo usaremos, lo configuraremos en la línea de comando.

OjO se instala un servicio de sistema que desactivaremos:

$ sudo systemctl stop raspotify
$ sudo systemctl disable raspotify

Uso:

    /usr/bin/librespot --name $(hostname) --disable-audio-cache \
                       --backend alsa --device jack --bitrate 320 

Nosotros usaremos un watchdog a nivel de usuario firtro para reiniciar librespot en caso de fallos

/etc/rc.local
    bin_custom/librespot_watchdog.sh 320 &

Al tercer fallo consecutivo, se optará por reiniciar la máquina.

librespot saca el audio por ALSA por el plugin jack de .asoundrc.

RPI 1:

Se observa que hay xruns y cortes en la conexión emergente “alsa-jack.rawjackPxxx” cuando la CPU está en uso por librespot (consume tanto como brutefir).

Hay que aumentar el buffer de Jack hasta que resulte viable para el uso con librespot.

Bitrate 320 puede ser difícil de descodificar sin que ocurran under runs, mejor con 160.

Receptor de audio Bluetooth

RPI3 integra un adaptador BT, versiones anteriores se pueden equipar con un pincho BT USB que será reconocido por el kernel.

En versiones anteriores de Raspbian se proporcionaba soporte audio BT con Pulseaudio. Afortunadamente esto ha cambiado y el soporte ahora está basado en ALSA.

$ sudo apt install bluealsa

NOTA: este paquete se distribuye en Raspbian, pero Debian estandar usa el actual bluez v5 que ya no soporta ALSA y obliga a usar el backend Pulseaudio. Consultar https://github.com/Arkq/bluez-alsa para usar BT sobre ALSA en Debian.

El audio recibido por BT se captura con bluealsa que proporciona una tarjeta virtual ALSA. No hay un cliente nativo BT para Jack.

Se ha preparado un watchdog para establecer la escucha automágicamente cuando haya una conexión BT:

/etc/rc.local

    bin_custom/bluealsa-aplay_watchdog.sh &

El watchdog se ocupa de mantener vivo el proceso 'bluealsa-aplay' que captura audio BT y lo encamina a un device alsa de reproducción, en nuestro caso el plugin hacia Jack:

bluealsa-aplay -d jack 00:00:00:00:00:00 &

Usando 00:...:00 se permite la reproducción en ALSA de cualquier dispositivo que se conecte.

La política de conexión BT se establece con el 'pairing'. Para emparejar con un emisor BT seguir los pasos del inicio de esta guía.

shairport-sync (Airplay)

shairport-sync -a $(hostname) -o alsa -- -d jack

Web de control

Para tener un botón de reinicio o apagado de la máquina, debemos autorizar al usuario firtro para ejecutar poweroff o reboot sin password, ver como aquí.

En RPI 1 conviene desactivar las gráficas de las curvas de DRC ya que los cálculos FFT son muy costosos.

Página web de control simplificada

Para usuarios finales se añade una página de control consistente en una botonera y display simplificados, con las funciones más habituales:

web de control light

Los 9 botones custom se han reubicado aquí. Los scripts asociados a dichos botones se dedican a seleccionar emisoras de radio por internet, a seleccionar la entrada analógica para la TV o al apagado/encendido de unos altavoces activos.

Se añade un botón de pánico en la esquina superior derecha que podemos configurar para reiniciar o apagar la máquina, editando www/config/config.ini

[misc]
poweroff_reboot_button = "reboot" # (o "poweroff")

Es posible acceder el resto de las páginas de control completas de FIRtro, mediante el botón de la esquina superior izquierda.

Para actualizar los archivos necesarios:

curl https://raw.githubusercontent.com/Rsantct/FIRtro-light/master/home/firtro/bin_custom/update_web_light.sh | sh

Control de entradas / fuentes

Latencia entrada analógica en máquinas lentas < RPI3

Por lo explicado más abajo, la selección de la entrada analógica podría resolverse con un boton en la página ‘custom’, para reiniciar jack con un buffer pequeño para fullduplex (entrada de línea), o con un buffer mayor para pode ejecutar un player.

/bin/webcustombutton_7.sh

#!/bin/bash
# apagamos la radio
killall -KILL mplayer
# Ajuste de baja latencia para la entrada analogica
/home/firtro/bin_custom/restart_jack.sh -jp=1024 -jn=2 -bflen=2048
/home/firtro/bin/control level_add 0
/home/firtro/bin/control input analog_tv
# Recuperamos el script capture_gain
cmd=$(grep bin_custom/jack_cable_gain.py /home/firtro/bin/initfirtro.py | cut -d"'" -f2 | cut -d"\\" -f1)
cmd+=$(grep capture_gain /home/firtro/bin/initfirtro.py | cut -d"'" -f1 | sed 's/^\ * //g')
$cmd
sleep 2
# Restauramos la input, ahora con el purto capture_gain ya accesible en jack
/home/firtro/bin/control input restore
# La tarjeta audioinjector cuando menos te lo esperas deja de capturar por Line IN:
amixer -c audioinjectorpi sset 'Input Mux' 'Line In'
amixer -c audioinjectorpi cset name='Line Capture Switch' on,on

~/bin/webcustombutton_8.sh

#!/bin/bash
# apagamos la radio
killall -KILL mplayer
# Ajuste para Spotify (librespot) con Jack solo Playback
/home/firtro/bin_custom/restart_jack.sh -jp=2048 -jn=2 -bflen=4096 -jP
/home/firtro/bin/control level_add 0
/home/firtro/bin/control input spoti_bt

Control de volumen mediante el ratón

left button   -->  vol --
right button  -->  vol ++
mid button    -->  togles mute

Se atiende un ratón gracias a un script que podemos incluir en el arranque /etc/rc.local al efecto.

/etc/rc.local

# Volumen controlado con el ratón en 2.0 dBs con beep si headroom < 6.0 dB
su -l firtro -c "/home/firtro/bin_custom/mouse_volume_daemon.py -s2.0 -b6.0 &"

En caso de tratarse de un sistema FIRtro dentro de una sesión de escritorio, podemos lanzar el comando de arriba dentro de las "Aplicaciones al Inicio" de nuestra sesión de escritorio, o directamente editar un script al efecto en ~/.config/autostart/

Adicionalmente, si queremos usar un ratón en exclusiva para el control de volumen, podremos inhibirlo en el escritorio para evitar interferencias indeseadas, ver cómo hacerlo dentro del código /bin_custom/mouse_volume_daemon.py

IMPORTANTE: permisos a configurar

sudo usermod -a -G input firtro

sudo nano /etc/udev/rules.d/99-input.rules

    # allow access to input devices for users in input group:
    SUBSYSTEM="input", GROUP="input", MODE="0660"
    # lo siguiente creo que es para bluetooth no es necesario para el raton:
    KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"

Relé para encendido y apagado de un amplificador

regleta

IMPORTANTE: configurar como se detalla aquí

Encendido al arranque de la máquina FIRtro

/etc/rc.local

    # Enciende los amplis:
    /home/firtro/bin_custom/ampli.sh on

Apagado nocturno a las 02:00 nótese que el orden de escritura es el minuto y la hora:

crontab -e

    # min hour  dayOfMonth month dayOfWeek   command
    00    02    *          *     *           /home/firtro/bin_custom/ampli.sh off

Apagado/encendido mediante un botón de la web de control

~/bin/webcustombutton_9.sh

    #!/bin/bash
    /home/firtro/bin_custom/ampli_on_off.sh