Problèmes Squeezelite

Mon ordinateur de bureau est sous SOLYDX (Debian stable) qui est une distribution avec environnement de bureau XFCE. J’ai toujours des problèmes de craquements après quelques heures mais seulement avec squeezelite, les autres applications ne reproduisent pas ce problème.

Il semble y avoir un problème de conversion lorsque l’on passe d’un fichier 24-192, 24-96, 24-88, 16-44 et MP3 à travers une sortie pulse. La combinaison de Pulse et Squeezelite génère des craquements au lieu de la musique.  Lorsque je redémarre Squeezelite tout est à nouveau fonctionnel. Le problème survient régulièrement lorsque je démarre Firefox ou Thunderbird. Le seul lien que je vois pour le moment c’est les notifications.

Voici une tentative de solution que j’ai mis en place sur mon Asus N73:

Créer un script de démarrage de squeezelite:

sudo nano ~/squeezelite_start.sh

/home/lafontaj/Logiciels/squeezelite/squeezelite-x86-64 -r 44100 -a ::16 -o default

Je viens de changer cette commande pour la suivante puisque j’ai lu que parfois l’utilisation de l’option default amène des problèmes de ce genre

/home/lafontaj/Logiciels/squeezelite/squeezelite-x86-64 -r 44100 -a ::16 -o pulse

Pour un démarrage automatique sous Solydx, ajouter une entrée dans les paramètres « Session et démarrage » >> « Démarrage automatique » qui exécute le script de démarrage de squeezelite.

Finalement pour régler le problème, j’ai effectué les opérations suivantes:

sudo apt-get purge pulseaudio

sudo apt-get install pulseaudio

En réinstallant pulseaudio à neuf, cela a fait un bon ménage dans les fichiers de configuration mais sans régler le problème.  J’ai ensuite téléchargé une nouvelle version de squeezelite du site de Ralph https://www.mediafire.com/folder/4q8dvq20iyz9e/Builds#j1336qrs7zffj

squeezelite-1.8.4-720-debian8-x86_64.tar.gz et j’ai modifié la ligne de commande pour lancer l’application

/home/lafontaj/Logiciels/squeezelite/squeezelite -z -r 44100 -a ::16 -o pulse

Mais sans régler le problème.

Ce que je note c’est qu’en déactivant la notification de l’applet pulseaudio les problèmes cessent.

Maintenant tout fonctionne bien depuis plusieurs jours… enfin

J’ai aussi essayé squeezelite-pa des dépôts, mais celui-ci ne retourne pas l’ensemble des carte de son disponible sur le système.

Ce qui suit est en référence mais aucune des propositions n’a réglé le problème.

Glitches, skips or crackling

Trouver les paramètres des cartes audio (1/4)

Afin de trouver les paramètres de mise en cache de votre carte audio:

pactl list sinks

Pour chaque carte audio trouvée, par PulseAudio, vous obtiendrez une sortie similaire à celle-ci:

Sink #0
    State: RUNNING
    Name: alsa_output.pci-0000_00_1b.0.hdmi-stereo
    Description: Audio interne Digital Stereo (HDMI)
    Driver: module-alsa-card.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 6
    Mute: no
    Volume: front-left: 26212 /  40% / -23,88 dB,   front-right: 26212 /  40% / -23,88 dB
            balance 0,00
    Base Volume: 65536 / 100% / 0,00 dB
    Monitor Source: alsa_output.pci-0000_00_1b.0.hdmi-stereo.monitor
    Latency: 9689 usec, configured 10000 usec
    Flags: HARDWARE DECIBEL_VOLUME LATENCY SET_FORMATS
    Properties:
        alsa.resolution_bits = "16"
        device.api = "alsa"
        device.class = "sound"
        alsa.class = "generic"
        alsa.subclass = "generic-mix"
        alsa.name = "HDMI 0"
        alsa.id = "HDMI 0"
        alsa.subdevice = "0"
        alsa.subdevice_name = "subdevice #0"
        alsa.device = "3"
        alsa.card = "0"
        alsa.card_name = "HDA Intel PCH"
        alsa.long_card_name = "HDA Intel PCH at 0xdf000000 irq 45"
        alsa.driver_name = "snd_hda_intel"
        device.bus_path = "pci-0000:00:1b.0"
        sysfs.path = "/devices/pci0000:00/0000:00:1b.0/sound/card0"
        device.bus = "pci"
        device.vendor.id = "8086"
        device.vendor.name = "Intel Corporation"
        device.product.id = "1c20"
        device.product.name = "6 Series/C200 Series Chipset Family High Definition Audio Controller"
        device.form_factor = "internal"
        device.string = "hdmi:0"
        device.buffering.buffer_size = "65536"
        device.buffering.fragment_size = "32768"
        device.access_mode = "mmap+timer"
        device.profile.name = "hdmi-stereo"
        device.profile.description = "Digital Stereo (HDMI)"
        device.description = "Audio interne Digital Stereo (HDMI)"
        alsa.mixer_name = "Intel CougarPoint HDMI"
        alsa.components = "HDA:10ec0269,10431a33,00100100 HDA:80862805,80860101,00100000"
        module-udev-detect.discovered = "1"
        device.icon_name = "audio-card-pci"
    Ports :
        hdmi-output-0: HDMI / DisplayPort (priority: 5900, available)
    Port actif : hdmi-output-0
    Formats:
        pcm

Sink #1
    State: SUSPENDED
    Name: alsa_output.usb-0d8c_000c-00-U0xd8c0x0c.analog-stereo
    Description: Audio Adapter Stéréo analogique
    Driver: module-alsa-card.c
    Sample Specification: s16le 2ch 48000Hz
    Channel Map: front-left,front-right
    Owner Module: 7
    Mute: no
    Volume: front-left: 99957 / 153% / 11,00 dB,   front-right: 99957 / 153% / 11,00 dB
            balance 0,00
    Base Volume: 65687 / 100% / 0,06 dB
    Monitor Source: alsa_output.usb-0d8c_000c-00-U0xd8c0x0c.analog-stereo.monitor
    Latency: 0 usec, configured 0 usec
    Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY
    Properties:
        alsa.resolution_bits = "16"
        device.api = "alsa"
        device.class = "sound"
        alsa.class = "generic"
        alsa.subclass = "generic-mix"
        alsa.name = "USB Audio"
        alsa.id = "USB Audio"
        alsa.subdevice = "0"
        alsa.subdevice_name = "subdevice #0"
        alsa.device = "0"
        alsa.card = "1"
        alsa.card_name = "USB Device 0xd8c:0x0c"
        alsa.long_card_name = "USB Device 0xd8c:0x0c at usb-0000:04:00.0-1.1, full speed"
        alsa.driver_name = "snd_usb_audio"
        device.bus_path = "pci-0000:04:00.0-usb-0:1.1:1.0"
        sysfs.path = "/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/usb2/2-1/2-1.1/2-1.1:1.0/sound/card1"
        udev.id = "usb-0d8c_000c-00-U0xd8c0x0c"
        device.bus = "usb"
        device.vendor.id = "0d8c"
        device.vendor.name = "C-Media Electronics, Inc."
        device.product.id = "000c"
        device.product.name = "Audio Adapter"
        device.serial = "0d8c_000c"
        device.string = "front:1"
        device.buffering.buffer_size = "17632"
        device.buffering.fragment_size = "4408"
        device.access_mode = "mmap"
        device.profile.name = "analog-stereo"
        device.profile.description = "Stéréo analogique"
        device.description = "Audio Adapter Stéréo analogique"
        alsa.mixer_name = "USB Mixer"
        alsa.components = "USB0d8c:000c"
        module-udev-detect.discovered = "1"
        device.icon_name = "audio-card-usb"
    Ports :
        analog-output-speaker: Speakers (priority: 10000)
    Port actif : analog-output-speaker
    Formats:
        pcm

Sink #2
    State: RUNNING
    Name: ladspa_output.mbeq_1197.mbeq
    Description: LADSPA Plugin Multiband EQ on Audio interne Digital Stereo (HDMI)
    Driver: module-ladspa-sink.c
    Sample Specification: float32le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 20
    Mute: no
    Volume: front-left: 26212 /  40%,   front-right: 26212 /  40%
            balance 0,00
    Base Volume: 65536 / 100%
    Monitor Source: ladspa_output.mbeq_1197.mbeq.monitor
    Latency: 9310 usec, configured 10000 usec
    Flags: HW_MUTE_CTRL LATENCY
    Properties:
        device.master_device = "alsa_output.pci-0000_00_1b.0.hdmi-stereo"
        device.class = "filter"
        device.ladspa.module = "mbeq_1197"
        device.ladspa.label = "mbeq"
        device.ladspa.name = "Multiband EQ"
        device.ladspa.maker = "Steve Harris <steve@plugin.org.uk>"
        device.ladspa.copyright = "GPL"
        device.ladspa.unique_id = "1197"
        device.description = "LADSPA Plugin Multiband EQ on Audio interne Digital Stereo (HDMI)"
        device.icon_name = "audio-card"
    Formats:
        pcm

La nouvelle implémentation du serveur audio PulseAudio utilise « timer-based audio scheduling » au lieu de l’approche traditionnelle, « interrupt-driven » et ainsi les paramètres « buffer_size/fragment_size » ne sont pas pris en compte .

Afin de mettre hors fonction le « timer-based scheduling » ajouter tsched=0 dans /etc/pulse/default.pa:

sudo nano /etc/pulse/default.pa

load-module module-udev-detect tsched=0

Le « Timer-based scheduling » peut mettre en évidence des problèmes avec certains pilotes ALSA. D’un autre coté, d’autre pilotes peuvent être « glitchy » sans celle-ci, donc vérifier ce qui fonctionne sur votre système.

Veuillez prendre en note les valeurs affectées aux paramètres « buffer_size » et « fragment_size » pour la carte ciblée par les ajustements.
Calculez vos valeurs de « fragment size » en msecs et « number of fragments » (2/4)

La valeur par défaut de la fréquence d’échantillonnage et de la résolution de PulseAudio sont 44100Hz @ 16 bits.

Avec cette configuration, le train de donnée requis est: 44100*16 = 705600 bits par seconde. Cela donne 1411200 bps pour la stéréo.

Reprenons les valeurs de nos paramètres relevés lors des étapes précédentes:

device.buffering.buffer_size = "768000" => 768000/1411200 = 0.544217687075s = 544 msecs
device.buffering.fragment_size = "384000" => 384000/1411200 = 0.272108843537s = 272 msecs

Modifier le fichier de configuration de PulseAudio (3/4)

sudo nano /etc/pulse/daemon.conf

; default-fragments = X
; default-fragment-size-msec = Y

À l’étape précédente, nous avons calculé le « fragment size ». Le nombre de fragments est simplement « buffer_size/fragment_size », ce qui nous donne dans ce cas-ci (544/272) donc 2:

default-fragments = 2
default-fragment-size-msec = 272

Redémarrage du serveur PulseAudio (4/4)

pulseaudio -k

pulseaudio --start

Certaine carte de son Intel utilisent le module snd-hda-intel et nécessite les options: vid=8086 pid=8ca0 snoop=0. Afin de rendre l’utilisation de ces options permanentes, créer ou modifier le fichier suivant et ajouter la ligne de configuration.

sudo nano /etc/modprobe.d/sound.conf

options snd-hda-intel vid=8086 pid=8ca0 snoop=0

Redémarrer le serveur PulseAudio:

pulseaudio -k
pulseaudio --start

Si on utilise une sortie ALSA directement autre que sysdefault:CARD=Audio alors là j’ai eu un problème de vitesse de lecture du fichier (tonal pitch) mais qui semble résolu avec le passage à Jessie (Debian)

De plus, comme ALSA prends le contrôle de la sortie audio, tous ce qui transite par PULSE ne passe plus jusqu’à ce que Squeezelite soit arrêté.

Problème avec BOSE Compagnion 5

De façon intermittente le son ne se rend plus à mes haut-parleurs BOSE. Je dois débrancher l’USB ou le câble électrique AC pour que le son revienne.

Le problème de déconnexion du kit de Bose est généralisé à tout le système et pas seulement à l’utilisation de Squeezelite.

Voici une solution que j’ai essayé face au problème de déconnexion du kit Bose sur un système Debian-Ubuntu mais finalement ça ne fonctionne pas. J’ai encore eu des déconnexions. Voir plus bas pour la mise en place d’une solution « Plaster »

Désactiver la fonction de mise en veille de l’USB

Afin de voir le mode actif (on recherche -1 pour la fonction desactivé)

sudo su
cat /sys/module/usbcore/parameters/autosuspend

2

Si le résultat est n’est pas -1 alors on poursuit avec les commandes suivantes:

echo "options usbcore autosuspend=-1" | tee /etc/modprobe.d/disable-usb-autosuspend.conf > /dev/null

Pour connaître le noyau actif de votre système:

uname -r

dpkg-reconfigure linux-image-3.16.0-4-amd64

On redémarre l’ordinateur et on revérifie ensuite:

cat /sys/module/usbcore/parameters/autosuspend

-1

Script de reconnexion de l’USB (Plaster)
By roman10

Premièrement obtenir le chemin du périphérique USB à rebrancher. Lancer la commande lsusb dans un terminal, vous obtiendrez quelque chose de similaire à ceci,

Bus 004 Device 005: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 004 Device 004: ID 05a7:1020 Bose Corp.
Bus 004 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 004 Device 003: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 05e3:0612 Genesys Logic, Inc.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 14cd:121c Super Top microSD card reader
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 004: ID 13d3:5205 IMC Networks
Bus 003 Device 003: ID 0cf3:3005 Atheros Communications, Inc. AR3011 Bluetooth
Bus 003 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

L’élément Bose Corp. est la carte de son en question, le nœud du périphérique est /dev/bus/usb/004/004, le premier 004 est le numéro de BUS, et le second 004 est le numéro du périphérique.

Deuxièmement, appliquer ioctl pour réinitialiser le périphérique. Ceci est réalisé en code C,

Copier ce qui suit dans un nouveau fichier:

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>

void main(int argc, char **argv)
{
 const char *filename;
 int fd;
 filename = argv[1];
 fd = open(filename, O_WRONLY);
 ioctl(fd, USBDEVFS_RESET, 0);
 close(fd);
 return;
}

Sauvegarder le fichier sous le nom: reset.c, compiler ensuite le code avec la commande:

gcc -o reset reset.c

Un programme nommé reset sera alors compilé.

Lancé la commande:
sudo ./reset /dev/bus/usb/004/004

Comme la connexion usb peut changer lors du redémarrage de l’ordinateur, il est plus simple de faire un script qui trouvera le bon numéro de BUS et périphérique à partir de l’identification du périphérique Bose (05a7:1020) que l’on obtient lors de l’exécution de la commande lsusb.

Éditer un nouveau fichiers: reset_Bose.sh

Insérer le code suivant dans celui-ci:

str=$(lsusb | grep -Ze "05a7:1020" | cut -d: -f1)
str1=$(echo $str | (cut -c5-7))
str2=$(echo $str | (cut -c16-18))
echo $str1"/"$str2
gksudo ./reset "/dev/bus/usb/"$str1"/"$str2

Lancer alors le script reset_Bose.sh lorsque le Bose ne fonctionnera plus et hop le voici de retour.

merci à roman10 pour le code C, le reste pour le script je l’ai imaginé moi-même!


Pour contourner le problème de déconnexion, j’ai testé le DAC XMOS sur ma distribution SolydX.Le problème de craquements avec pulse est toujours présent, mais je n’ai pas eu de problème « pitch » lorsque j’utilisai directement ALSA (./squeezelite-x86-64 -o sysdefault:CARD=X20).

J’ai donc débranché l’USB du BOSE pour le brancher dans le XMOS, J’utilise ensuite la sortie analogique du XMOS pour alimenter l’entrée analogique du kit BOSE. Le son est correct et ainsi le problème de déconnexion intermittent du driver BOSE semble évité mais je n’aime pas vraiment cette solution. Je songe à ouvrir le kit bose à la fin de la garantie pour y installer le XMOS. J’ai démonté le Bose pour voir la possibilité d’y installer le XMOS, mais j’oublie ça il n’y a pas de place et je n’ai pas les schémas des circuits pour aller plus loin.

XMOS
DAC XMOS

XMOS
XMOS PCM5102 Asynchronous DAC Decoder USB to Optical Coaxial SPDIF 384K 32Bit