Question:
Prise en charge des périphériques I2S DAC (pilotes du noyau?) Et bruit ("pop", "crépitement") à la lecture
handle
2017-10-29 23:01:11 UTC
view on stackexchange narkive permalink

J'essaie un Bonnet de haut-parleur stéréo Adafruit I2S 3W pour Raspberry Pi - Mini Kit, qui est construit autour de deux MAX98357 (fiche technique: adafruit, maxim), sur un Raspberry Pi Zero W avec Raspbian Stretch (mis à jour hier).

Le problème est que j'ai des «pops» lors du démarrage / changement de pistes, même avec le même débit audio. Leurs instructions pour «corriger» ceux-ci ajoutent principalement des paramètres redondants aux fichiers de configuration alsa /etc/asound.conf et ~/.asoundrc.

I actuellement seulement asound.conf, comme ceci:

  $ cat /etc/asound.confpcm.speakerbonnet {type hw card 0} pcm.dmixer {type dmix ipc_key 1024 ipc_perm 0666 slave {pcm " speakerbonnet "period_time 0 period_size 1024 buffer_size 8192 rate 44100 canaux 2}} ctl.dmixer {type hw card 0} pcm.softvol {type softvol slave.pcm" dmixer "control.name" PCM "control.card 0} ctl.softvol { type hw card 0} pcm.! default {type plug slave.pcm "softvol" # slave.pcm "dmixer"}  

softvol existe pour pouvoir contrôler le volume globalement (dans le logiciel, perte de résolution), car le DAC n'a pas de contrôle matériel. Mais apparemment, certains joueurs peuvent aussi le faire eux-mêmes, donc l'un ou l'autre devrait suffire.

Concernant le pilote, leurs instructions ajoutent dtoverlay = hifiberry-dac à /boot/config.txt , mais le Hifiberry DAC (obsolète) est basé sur une (unique) puce différente, la PCM5102.

  pi @ raspberry: ~ $ aplay -l **** Liste des périphériques matériels de PLAYBACK **** carte 0: sndrpihifiberry [snd_rpi_hifiberry_dac], périphérique 0: HifiBerry DAC HiFi pcm5102a-hifi-0 [] Sous-périphériques: 1/1 Sous-périphérique # 0: sous-périphérique # 0  

Hifiberry répertorie la configuration de ses produits sur https://www.hifiberry.com/build/documentation/configuring-linux-3-18-x /.

Je voudrais savoir quelles sont les différences et si la suggestion correspond bien au CI. Le pilote pourrait-il envoyer des données supplémentaires qui provoquent un «pop» ou un «crépitement»?

Fait intéressant, le test du haut-parleur ne semble jamais produire le bruit initial à la lecture

$ speaker-test -c2 --test = wav -w /usr/share/sounds/alsa/Front_Center.wav

, tandis que mpg123 fait (avec un MP3 mono 16 kHz), également entre les pistes:

  Lecteur audio MPEG 1.0 / 2.0 / 2.5 haute performance pour les couches 1, 2 et 3 version 1.23.8; écrit et copyright par Michael Hipp et autres logiciels libres (LGPL) sans aucune garantie mais avec mes meilleurs vœux Décodeur: genericTrying module de sortie: alsa, périphérique: <nil>Using default module dir: / usr / lib / arm-linux-gnueabihf / mpg123Module dir: / usr / lib / arm-linux-gnueabihf / mpg123 Chemin du module: ./output_alsa.soModule de sortie choisi: alsa ... Pilote audio: alsaPériphérique audio: (null) Capacités audio: (matrice de [S] tereo ou [M] ono support pour format d'échantillonnage et fréquence en Hz) | s16 | u16 | s32 | u32 | s24 | u24 | f32 | s8 | u8 | ulaw | alaw | ------ | ------- | ------- | ------- | ------- | ------- | --- ---- | ------- | ------- | ------- | ------- | ------- | 8000 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 11025 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 12000 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 16000 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 22050 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 24000 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 32000 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S |
44100 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | 48000 | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S | M / S |  

(spécifier alsa fonctionne, spécifier l'index de l'appareil échoue)

Ce n'est pas dans le fichier, j'ai vérifié. Et aussi, mplayer commence à lire le fichier identique OK, mais a des "pops" entre les pistes, bien que la spécification de la sortie audio mplayers semble presque éliminer le popping lors du changement de piste.

  mplayer -msglevel all = 6 -ao alsa file.mp3MPlayer 1.3.0 (Debian), construit avec gcc-6.2.1 (C) 2000-2016 MPlayer TeamCPU: ARMAUDIO: 16000 Hz, 2 canaux, s16le, 24,0 kbit / 4,69 % (ratio: 3000->64000) Codec audio sélectionné: [mpg123] afm: mpg123 (MPEG 1.0 / 2.0 / 2.5 couches I, II, III) =================== =================================================== ====== Construction d'une chaîne de filtres audio pour 16000Hz / 2ch / s16le -> 0Hz / 0ch / ?? ... [libaf] Ajout d'un filtre factice [factice] A été réinitialisé: 16000Hz / 2ch / s16le [factice] A été réinitialisé: 16000Hz / 2ch / s16leEssai du pilote audio préféré 'alsa', options '[aucun]' alsa-init: format demandé: 16000 Hz, 2 canaux, 9alsa-init: en utilisant ALSA 1.1.3alsa-init: configuration pour 1/2 canal ( s) alsa-init: utilisation du périphérique defaultalsa-init: ouverture du périphérique en blocage modealsa-init: périphérique rouvert en bloquant modealsa-init: got buffersize = 32768alsa-init: taille de période obtenue 1024alsa: 44100 Hz / 2 canaux / 4 bpf / 32768 octets buffer / Signé 16 bits Little EndianAO: [alsa] 44100Hz 2ch s16le ( 2 octets par échantillon) AO: Description: Sortie audio ALSA-0.9.x-1.xAO: Auteur: Alex Beregszaszi, Zsolt Barat <joy@***.de>AO: Commentaire: en cours de développementConstruction d'une chaîne de filtres audio pour 16000Hz / 2ch / s16le - > 44100Hz / 2ch / s16le ... [factice] A été réinitialisé: 16000Hz / 2ch / s16le [libaf] Ajout de filtre lavcresample [SWR @ 0xb6841020] Utilisation de s16p en interne entre les filtres [factice] A été réinitialisé: 44100Hz / 2ch / s16le [factice] A été réinitialisé: 44100Hz / 2ch / s16le
Vidéo: pas de vidéo Libération de 0 blocs vidéo inutilisés Démarrage de la lecture ...  

La taille de la mémoire tampon ne correspond pas à celle de la configuration.

MPD (contrôlé par mpc) clique / saute une fois au début de la lecture, mais apparemment "diffuse" en continu pour que le changement de piste ne cause aucun bruit.

Alors, quelle que soit la cause des pops en premier lieu (matériel? pilote? ), certains joueurs semblent mieux éviter cette situation (ouverture / reconfiguration de l'appareil).
Toute information sur la façon de trouver la cause première et de la corriger est très appréciée!


Recherche plus approfondie

La configuration des plugins ALSA dans le plug-in de commande -> dmix -> softvol -> pcm, entraîne mplayer donnant une erreur:

[AO_ALSA] alsa-lib: pcm_dmix.c: 1057: (snd_pcm_dmix_open) le plugin dmix ne peut être connecté qu'au plugin hw

Donc, retour à: plug -> softvol -> dmix - > I2S DAC (noyau PCM).

Le fichier de configuration peut être écrit hiérarchiquement comme suit:

  pcm.! Default { type plug slave {pcm {type softvol slave {pcm {type dmix ipc_key 1024 ipc_perm 0666 slave {pcm {type hw card 0} #format "S16" rate 32000 canaux 2 period_size 2048 # bytes buffer_size 32768 # usec} liaisons {0 0 1 1}}} control {name "PCM" card 0}}}}  

Le control de Softvol est ce qui apparaît comme appareil de mixage par exemple alsamixer . Je ne sais toujours pas ce que fait ctl.Alsa stocke généralement sa configuration / ses paramètres de manière persistante. Cela peut provoquer l'apparition de périphériques de mixage obsolètes.

Ceci a fonctionné pour les supprimer (utilisez sudo):

  rm /var/lib/alsa/asound.state # supprimer le fichier d'état
chmod -x / usr / sbin / alsactl # rend alsactl non exécutable pour empêcher l'écriture des paramètres lors de l'arrêt<REBOOT>chmod + x / usr / sbin / alsactl  

Avec mplayer et l'audio à 32 kHz seulement pops occasionnels lorsque changer de piste. L'augmentation de la taille de la mémoire tampon semble avoir résolu la lecture occasionnelle de "bégaiement / écho".

dmix est le plugin supprimant la plupart des pops lors de la lecture / arrêt. Il [les pop occasionnels changeant de piste avec mplayer] ne fait pas de différence notable si les sources ou le taux par défaut sont définis dans le taux de l'esclave dmix.

Superpositions de l'arborescence des périphériques (lien vers la documentation ci-dessous):

  $ ls / boot / overlaysadau1977- adc.dtbo fe-pi-audio.dtbo iqaudio-dacplus.dtbo pitft28-capacitive.dtbo sdtweak.dtboadau7002-simple.dtbo goodix.dtbo iqaudio-digi-wm8804-audio.dtbo pitft28-resistive.dtbo smi-dev.dtboads1015. dtbo googlevoicehat-soundcard.dtbo justboom-dac.dtbo pitft35-resistive.dtbo smi.dtboads1115.dtbo gpio-ir.dtbo justboom-digi.dtbo pps-gpio.dtbo smi-nand.dtboads7846.dtbo gpio-poweroff.dtbo lirc-rpi.dtbo pwm-2chan.dtbo spi0-cs.dtboakkordion-iqdacplus.dtbo gpio-shutdown.dtbo mcp23017.dtbo pwm.dtbo spi0-hw-cs.dtboallo-boss-dac-audio-pcm512 .dtbo hifiberry-amp.dtbo mcp23s17.dtbo qca7000.dtbo spi1-1cs.dtboallo-digione.dtbo hifiberry-dac.dtbo mcp2515-can0.dtbo raspidac3.dtbo spi1-2cs.dtboallo-piano-dac-audio.dtcm512 hifiberry-dacplus.dtbo mcp2515-can1.dtbo README spi1-3cs.dtbo
allo-piano-dac-plus-pcm512x-audio.dtbo hifiberry-digi.dtbo mcp3008.dtbo encodeur-rotatif.dtbo spi2-1cs.dtboat86rf233.dtbo hifiberry-digi-pro.dtbo midi-uart0.dtbo rpi-backlight.dtbo spi2-2cs.dtboaudioinjector-addons.dtbo hy28a.dtbo midi-uart1.dtbo rpi-cirrus-wm5102.dtbo spi2-3cs.dtboaudioinjector-wm8731-audio.dtbo hy28b.dtbo mmc.dtbo rpi-dac.dtbo spi- 39.dtboaudremap.dtbo i2c0-bcm2708.dtbo mpu6050.dtbo rpi-display.dtbo spi-rtc.dtbobmp085_i2c-sensor.dtbo i2c1-bcm2708.dtbo mz61581.dtbo rpi-ft5406.dtbo tinylcd35 papirus.dtbo rpi- proto.dtbo uart1.dtbodionaudio-loco.dtbo i2c-gpio.dtbo pi3-act-led.dtbo rpi-sense.dtbo vc4-fkms-v3d.dtbodionaudio-loco-v2.dtbo i2c-mux.dtbo pi3-disable-bt .dtbo rpi-tv.dtbo vc4-kms-v3d.dtbodpi18.dtbo i2c-pwm-pca9685a.dtbo pi3-disable-wifi.dtbo rra-digidac1-wm8741-audio.dtbo vga666.dtbodpi24.dtbo i2c-rtc.dtbo -miniuart-bt.dtbo sc16is750-i2c.dtbo w1-gpio.dtbodwc2.dtbo i2c-rtc-gpio.dtbo piscreen2r.dtbo sc16is752-spi1.dtbo w1-gpio-pullup.dtbodwc-otg.dt.dtbo2c .dtbo sdhost.dtbo wittypi.dtbo
enc28j60.dtbo i2s-gpio28-31.dtbo pisound.dtbo sdio-1bit.dtboenc28j60-spi2.dtbo iqaudio-dac.dtbo pitft22.dtbo sdio.dtbo  

Les fichiers de superposition sont binaires, mais la recherche des sources sur https://github.com/raspberrypi/linux/search?utf8=%E2%9C%93&q=hifiberry&type=

donne quelques résultats:

et plus

Il existe donc un pilote spécifique. Est-il disponible dans Raspbian?

  $ find / lib / modules / $ (uname -r) -type f -name \ *. Ko | grep son / lib / modules / 4.9.59 + / noyau / son / ac97_bus.ko / lib / modules / 4.9.59 + / noyau / son / drivers / mpu401 / snd-mpu401.ko / lib / modules / 4.9.59 + / kernel / sound / drivers / mpu401 / snd-mpu401-uart.ko / lib / modules / 4.9.59 + / kernel / sound / drivers / snd-virmidi.ko / lib / modules / 4.9.59 + / kernel / sound / drivers / snd-dummy.ko / lib / modules / 4.9.59 + / kernel / sound / drivers / snd-aloop.ko / lib / modules / 4.9.59 + / kernel / sound / drivers / snd-mtpav. ko / lib / modules / 4.9.59 + / kernel / sound / drivers / snd-serial-u16550.ko / lib / modules / 4.9.59 + / kernel / sound / soc / codecs / snd-soc-wm5102.ko / lib / modules / 4.9.59 + / noyau / son / soc / codecs / snd-soc-pcm512x-i2c.ko
/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-adau7002.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-spdif-tx.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-sigmadsp-i2c.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-spdif-rx.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-wm8731.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-adau1701.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-cs42xx8-i2c.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-adau1977-i2c.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-ak4554.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-wm8804-i2c.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-pcm512x.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-sgtl5000.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-wm8741.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-pcm1794a.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-wm8804.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-arizona.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-tas5713.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-sigmadsp.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-adau1977.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-tpa6130a2.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-wm-adsp.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-cs42xx8.ko/lib/modules/4.9.59+/kernel/sound/soc/codecs/snd-soc-pcm5102a.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-googlevoicehat-soundcard.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-rpi-cirrus.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-hifiberry-dacplus.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-hifiberry-amp.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-hifiberry-dac.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-allo-piano-dac-plus.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-raspidac3.ko
/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-digidac1-soundcard.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-adau1977-adc.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-rpi-dac.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-audioinjector-pi-soundcard.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-allo-piano-dac.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-fe-pi-audio.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-allo-digione.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-dionaudio-loco.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-bcm2835-i2s.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-rpi-proto.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-allo-boss-dac.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-hifiberry-digi.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-iqaudio-digi.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-pisound.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-iqaudio-dac.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-justboom-digi.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-audioinjector-octo-soundcard.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-dionaudio-loco-v2.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-justboom-dac.ko/lib/modules/4.9.59+/kernel/sound/soc/bcm/snd-soc-googlevoicehat-codec.ko/lib/modules/4.9.59+/kernel/sound/soc/snd-soc-core.ko/lib/modules/4.9.59+/kernel/sound/soc/generic/snd-soc-simple-card.ko/lib/modules/4.9.59+/kernel/sound/soc/generic/snd-soc-simple-card-utils.ko/lib/modules/4.9.59+/kernel/sound/core/snd-hwdep.ko/lib/modules/4.9.59+/kernel/sound/core/oss/snd-mixer-oss.ko/lib/modules/4.9.59+/kernel/sound/core/oss/snd-pcm-oss.ko/lib/modules/4.9.59+/kernel/sound/core/snd-pcm.ko/lib/modules/4.9.59+/kernel/sound/core/snd-compress.ko/lib/modules/4.9.59+/kernel/sound/core/snd-timer.ko/lib/modules/4.9.59+/kernel/sound/core/snd-rawmidi.ko/lib/modules/4.9.59+/kernel/sound/core/snd-hrtimer.ko
/lib/modules/4.9.59+/kernel/sound/core/seq/snd-seq-virmidi.ko/lib/modules/4.9.59+/kernel/sound/core/seq/oss/snd-seq-oss .ko / lib / modules / 4.9.59 + / kernel / sound / core / seq / snd-seq-midi-event.ko / lib / modules / 4.9.59 + / kernel / sound / core / seq / snd-seq -device.ko / lib / modules / 4.9.59 + / kernel / sound / core / seq / snd-seq.ko / lib / modules / 4.9.59 + / kernel / sound / core / seq / snd-seq-midi .ko / lib / modules / 4.9.59 + / kernel / sound / core / seq / snd-seq-dummy.ko / lib / modules / 4.9.59 + / kernel / sound / core / snd.ko / lib / modules /4.9.59+/kernel/sound/core/snd-pcm-dmaengine.ko/lib/modules/4.9.59+/kernel/sound/arm/snd-bcm2835.ko/lib/modules/4.9.59+/ kernel / sound / usb / snd-usb-audio.ko / lib / modules / 4.9.59 + / kernel / sound / usb / caiaq / snd-usb-caiaq.ko / lib / modules / 4.9.59 + / kernel / son / usb / misc / snd-ua101.ko / lib / modules / 4.9.59 + / kernel / sound / usb / 6fire / snd-usb-6fire.ko / lib / modules / 4.9.59 + / kernel / sound / usb / snd-usbmidi-lib.ko / lib / modules / 4.9.59 + / kernel / sound / pci / ac97 / snd-ac97-codec.ko  

Non.

Un effort plus ancien pour faire fonctionner le pilote pour une carte différente: http://community.onion.io/topic/1761/resolved-attaching-pcm5102-to-omega2-i2s/13

Cela montre potentiellement comment créer une arborescence d'appareils correspondante overlay et spécifiez le pilote (doit être compilé?):

https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=8496&start=750#p1216305


Mise à jour 2

Elle doit être causée par la (ré) ouverture de l'appareil. Avec $ aplay -D default -c 2 -f S16 -r 48000 / dev / zero & les pops sont partis avec n'importe quel joueur. Mais jouer des zéros et les mélanger par logiciel semble un peu gourmand en CPU:

  $ w 18:21:38 jusqu'à 1:17, 1 utilisateur, moyenne de charge: 0.11, 0.15, 0.12 ... 

Tuez-le avec

  pi @ raspberry: ~ $ ps | grep aplay16697 pts / 0 00:00:28 aplaypi @ framboise: ~ $ ps aux | grep aplaypi 16697 2,6 0,6 5828 2996 pts / 0 SL 18:08 0:29 aplay -D par défaut -c 2 -f S16 -r 48000 / dev / zéro
pi 21159 0.0 0.3 4364 1764 pts / 0 S + 18:26 0:00 grep --color = auto aplaypi @ raspberry: ~ $ kill 16697pi @ raspberry: ~ $ Aborted by signal Terminé ... aplay: pcm_write: 2011: erreur d'écriture : Appel système interrompu ^ C [1] + Exit 1 aplay -D default -c 2 -f S16 -r 48000 / dev / zeropi @ ​​raspberry: ~ $  

(On pourrait "démarrer automatiquement "ceci via une entrée dans /etc/rc.local.)


Mise à jour 3

MPD semble pour avoir une option pour "garder cette sortie audio toujours ouverte": https://www.musicpd.org/doc/user/config_audio_outputs.html Mais cela semble être pour le streaming uniquement, car il le fait n'affecte pas les pops au démarrage de la lecture:

sudo nano /etc/mpd.conf

audio_output {type "alsa" nom "par défaut" # device "hw: 0,0" # optional # mixer_type "hardware" # optional # mixer_device "default" # optional mixer_control "PCM" # optional # mixer_index "0" # facultatif always_on "yes"}  

sudo service mpd restart

mpc play

mpc stop

Autres mesures et comparaison avec l'enregistrement audio montrent:

  • SI le pépin / pop / fissure audible se produit au début de la lecture (démarrage I2S), il est visible sur les deux sorties haut-parleurs comme un pic positif
  • Je suppose que cela pourrait être causé par le LRCLK commençant env. 500 us après BCLK
  • la fiche technique montre un ordre différent dans "TURN-ON RESPONSE (STANDBY MODE)"

Revenons donc à l'interface et au pilote I2S

Construire et exécuter (attention: arrêter le programme même via desetup_io () n'arrête pas l'I2S) ...

  ~ $ git clone https://github.com/arisena- com / rpi_src ... ~ / rpi_src / apps / i2s_test / src $ make ... ~ / rpi_src / apps / i2s_test / src $ sudo ./i2s_test -t 2  

démarre le LRCLK sur le troisième front montant de BCLK et entraîne une belle montée en puissance comme indiqué dans la fiche technique, bien que BLCK démarre en premier.


Avec _i2s_test_. L'horloge (jaune) démarre deux impulsions avant LRCLK (cyan). Accélération de la sortie audio visible sur les deux canaux ( pas de pop ni de grésillement): good

Lecture audio. Remarque glitch / gap dans l'horloge (jaune, environ 30 heures US suivi de 150 US haut). La sortie (rose / bleu) semble indéfinie avant le pop (au déclenchement) lorsque LRCLK démarre, environ 30 ms avant le début des données (non affiché): bad

Parfois le pop n'est pas perceptible, mais la trace semble très similaire.


Est-ce donc le problème BLCK (ce qui cause cela, ce n'est probablement pas intentionnel) ou la polarité (i2s_test commence à bas niveau) tandis le fonctionnement normal a un niveau élevé?

Alors, essayons d'utiliser le pilote approprié comme indiqué dans https://raspberrypi.stackexchange.com/a/74804/75483

[la construction du noyau prend probablement un jour ou deux, cela vaut probablement la peine de se pencher sur la compilation croisée ..]

Bien que la construction semble correcte (son / soc / codecs / snd- soc-max98357a.ko), le pi0w ne semble pas démarrer correctement après, au moins il ne se connecte pas au wifi. Je vais devoir le brancher sur un écran et un HID.


Je n'ai pas pu faire fonctionner un clavier non plus, et ce n'est pas parce que j'ai utilisé un simple adaptateur A-micro B au lieu de d'abord un adaptateur OTG approprié.

Maintenant, je pourrais probablement m'y attacher via le port série ...

La fin de la sortie du processus de démarrage (Stretch lite default kernel) sur les looks série comme

  [0.000000] Linux version 4.9.41+ (dc4 @ dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) # 1023 Mar 8 août 15:47:12 BST 2017 [OK] Démarré Configurez les modems Bluetooth connectés par UART. [OK] Démarré Charger / Enregistrer l'état du commutateur RF Kill. [OK] Démarré LSB: Redimensionne le système de fichiers racine pour remplir la partition. [OK] Démarré dhcpcd sur toutes les interfaces. [OK] Réseau cible atteint. [OK] Le réseau cible atteint est en ligne. [OK] Démarré Activités quotidiennes de téléchargement apt. [OK] Démarré Mise à jour quotidienne d'apt et activités de nettoyage. [OK] Minuteurs cible atteints. Démarrage du serveur OpenBSD Secure Shell ... Démarrage des sessions utilisateur autorisées ... Démarrage de la compatibilité /etc/rc.local ... Mon adresse IP est xxxx: xx: xxxx: xxxx: xxxx: xxxx: xxx: xxxx [OK] Démarrage d'OpenBSD Serveur Secure Shell. [OK] Démarré Autoriser les sessions utilisateur. [OK] Démarrage de la compatibilité /etc/rc.local. Démarrage des activités de téléchargement quotidiennes d'apt ... Démarrage de Hold jusqu'à la fin du processus de démarrage ... Démarrage de l'écran de démarrage Terminate Plymouth ...  

L'image avec un noyau personnalisé (pas de wifi, pas de clavier) en résulte dans

  [0.000000] Linux version 4.9.61+ (pi @ raspberry) (gcc version 6.3.0 20170516 (Raspbian 6.3.0-18 + rpi1)) # 1 Mon 13 novembre 03: 14:02 CET 2017 [ÉCHEC] Échec du démarrage de la configuration des modems Bluetooth connectés par UART. Voir «systemctl status hciuart.service» pour plus de détails. [OK] Démarrage de dhcpcd sur toutes les interfaces. [OK] Réseau cible atteint. Démarrage du serveur OpenBSD Secure Shell ... [OK] Le réseau cible atteint est en ligne. Démarrage de LSB: Démarrez le démon NTP ... [OK] Démarrez le lecteur de musique. Démarrage des sessions utilisateur autorisées ... Démarrage de la compatibilité /etc/rc.local ... [OK] Démarrage de la compatibilité /etc/rc.local. [OK] Démarrage des sessions utilisateur autorisées. Démarrage de l'écran de démarrage Terminate Plymouth ... Démarrage de la mise en attente jusqu'à la fin du processus de démarrage ... [OK] Tranche créée User Slice of root.
[OK] Démarrage de la session c1 de l'utilisateur root. Démarrage du Gestionnaire des utilisateurs pour l'UID 0 ...  

Le WIFI et le Bluetooth ne sont-ils pas sur la même puce? Aucune information matérielle ni aucun schéma réel disponible auprès de RPi Foundation.

  pi @ raspberry: ~ $ ifconfig wlan0wlan0: erreur lors de la récupération des informations d'interface: appareil non trouvé  

J'ai donc cassé le Wifi. Y a-t-il une chance de revenir au noyau / configuration de travail sans perdre mes modifications / fichiers? Remplacer les fichiers du noyau de la SD en état de marche? Non , le remplacement de tout ce qui se trouve dans / boot / sauf config.txt entraîne un démarrage suspendu à

  [2.930955] mmc1: nouveau haut speed SDIO card à l'adresse 0001 [22.411095] random: crng init done  

Alors maintenant, je vais vraiment devoir repartir à zéro. Je pourrais peut-être lire mes données à partir du répertoire personnel en attachant le système endommagé via USB OTG et lecteur de carte, quelque chose comme

  sudo mkdir / media / usbsudo chown -R pi: pi / media / usbsudo mount / dev / sda2 / media / usb / media / usb / home / pi $ cp -r * ~  

J'aurais peut-être dû mettre à jour d'abord:

  pi @ raspberrypi: ~ $ sudo rpi-update *** Mise à jour du micrologiciel Raspberry Pi par Hexxeh, amélioré par AndrewS et Dom ... *** Sauvegarde des modules 4.9.41 + ... *** depmod 4.9.62-v7 + *** depmod 4.9.62 + ... *** Si aucune erreur n'est apparue, votre firmware a été mis à jour avec succès vers 23b1614bb794dfce586f1300da75198befa4951d *** Un redémarrage est nécessaire pour activer le nouveau firmwarepi @ raspberrypi: ~ $ sudo redémarrer  
  • Je pourrais réessayer demain (après avoir effectué une sauvegarde).
  • Pas de Wifi / IP après la mise à jour (mais wlan0 affiché dans ifconfig )

    • définir le pays du wifi avec sudp raspi-config (4> I4)
  • Pas besoin d'activer i2s-mmap ni i2s co de>, la superposition hifiberry-dac le fait automatiquement et mmap est disponible implicitement depuis la version 4.9 (avril 2017).

Consultez https://github.com/raspberrypi/linux/issues/2212 à propos de ces problèmes et quelques détails sur le pilote I2S


Ressources:
Ouais, pour le débogage itératif, vous devriez certainement faire une compilation croisée du noyau. Dommage que la recompilation ait cassé le WiFi. Passer de 4.9.41+ à 4.9.61+ n'est pas un énorme changement, donc je suppose que le noyau / les modules ne sont pas bien testés pour la compilation avec gcc 6.3.0. Avec un environnement de compilation croisée sur Debian 9, vous pouvez affiner cela. Quant à "travailler le noyau / la configuration sans perdre mes modifications / fichiers? Remplacer les fichiers du noyau de la SD fonctionnante?", Oui au plus vous n'avez besoin que de sauvegarder /boot/kernel.img, /boot/*.dtb, / boot / overlays / et / lib / modules /
@jdonald Merci, je n'ai pas complètement abandonné, même si la configuration de Virtualbox avec lubuntu n'a pas encore fonctionné pour moi. Je n'ai pas eu de configuration Linux depuis un bon moment donc c'est un gros effort et je préfère faire autre chose. En fait, je fais cela en ce moment (je travaille autour de la taille de la mémoire tampon codée en dur dans py-spidev). J'ai sauvegardé ma carte avec Win32DiskImager mais j'essaierai votre suggestion la prochaine fois.
@jdonald VirtualBox (+ Extensions pour les dossiers partagés et un lecteur de carte USB) avec Ubuntu 16 LTS a maintenant abouti à un noyau fonctionnel, mais il semble que ce soit le pilote et / ou le matériel I2S à l'origine du pépin BCLK qui est en fait responsable du pop ( en conjonction avec ce DAC spécifique).
Cinq réponses:
jdonald
2017-11-06 12:45:15 UTC
view on stackexchange narkive permalink

Il existe donc un pilote spécifique. Est-il disponible dans Raspbian?

Non.

(doit être compilé?)

Alors oui, il est disponible en le spécifiant comme module et recompilation du noyau. Une façon de configurer pour max98357a est d'éditer sound / soc / bcm / Kconfig ajouter la ligne:

  sélectionnez SND_SOC_MAX98357A  

juste sous la ligne avec PCM5102A, puis ajoutez CONFIG_SND_SOC_MAX98357A = m à votre .config avant de reconstruire.

On me dit ce genre d'édition directe de .config est mal vu, mais dans l'état actuel des choses, ce module n'apparaît pas dans menuconfig.

Quand je charge le module via sudo modprobe snd-soc- max98357a sur mon Pi Zero W, il ne montre aucune erreur dans dmesg, pour ce que ça vaut. Si cela peut vous rapprocher de votre objectif ou au moins écarter quelque chose, heureux de vous fournir ces binaires compilés.

Les fichiers de superposition sont binaires, mais ... https: //github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts

Bien, vous pouvez essayer de modifier hifiberry-dac-overlay.dts et de remplacer pcm5102a par max98357a. Les superpositions de l'arborescence des périphériques sont automatiquement reconstruites avec la cible dtbs dans le flux de construction standard du noyau.

Merci, j'ai cela sur ma liste de choses à faire, il semble y avoir quelques différences entre les pilotes mais je ne l'ai pas encore approfondi. L'interface I2S montre un comportement dépendant de l'application, c'est-à-dire que mpg123 semble ouvrir l'appareil deux fois, provoquant des pop très visibles. mplayer ne semble pas faire cela, et les pops ne sont pas aussi "extrêmes", mais quand même, ils se produisent régulièrement à l'ouverture de la transmission I2S. J'ai remarqué que l'horloge de bits démarre et fonctionne pendant un bref instant avant de s'arrêter puis de recommencer. Je ne sais pas encore si c'est intentionnel, je ne pense pas. Cependant, ce n'est probablement pas un direct ...
... cause de l'éclatement. C'est peut-être un problème de timing. Je vais vérifier cela avec un analyseur logique. Concernant les pilotes: j'ai trouvé quelques endroits qui montrent comment travailler avec les superpositions de l'arborescence des périphériques, j'ajouterai des liens plus tard.
J'ai mis à jour la question avec les traces de l'oscilloscope et un lien vers ce problème exact sur le RPi Github où des informations sur le pilote ont été fournies, mais aucune solution pour le moment (la recommandation est d'arrêter l'IC). Changer le pilote de périphérique peut ne pas aider, il semble que le pilote I2S soit impliqué.
Il y a eu une superposition de l'arborescence des périphériques pour MAX98357A dans Raspbian depuis un certain temps, mais le module de pilote n'est actuellement toujours pas construit / inclus. [Il sera configurable dans 5.4] (https://github.com/raspberrypi/linux/commit/3d1e5203531fd1791762f018538e670bf10f722c). Le pilote implémente un signal d'arrêt qui par défaut GPIO4, qui pourrait éviter le problème de bruit, comme suggéré précédemment, mais cela semble causer un autre problème avec le niveau de tension sur SD sélectionnant l'audio L / R / M quand il pousse la broche haut (à gauche canal uniquement).
user51705
2017-11-06 21:49:56 UTC
view on stackexchange narkive permalink

Vous devez essayer un RPi plus puissant. Le mélange du processeur monocœur Zero W et du Linux donne un système qui, dans certains cas, n'est pas aussi réactif. Une "pause" de quelques millisecondes au mauvais moment est une fissure ou un pop.

Le fait qu'un tampon plus grand ait quelque peu aidé est un symptôme important. Donc, peut-être, il n'est pas possible de résoudre votre problème.

Les problèmes dus à un traitement non en temps réel semblent plausibles. @handle y a-t-il une différence de comportement lorsque vous exécutez mplayer / mpc avec `nice -20`? Si ces commandes génèrent des sous-processus, vous devrez peut-être regarder `top` et` renice` les processus enfants. C'est une approche logicielle pour tester l'explication d'@nicolap8's. L'approche matérielle, en fonction de la difficulté de reconstruction de votre configuration, consiste à tester avec un Pi 3.
Malheureusement, je n'ai pas accès à un modèle avec un meilleur processeur pour comparer. La brève interruption de l'horloge I2S ne semble pas être la cause fondamentale car elle est toujours présente, même lorsque le démarrage de la lecture ne provoque pas de «pop» notable. @jdonald Je testerai également ces paramètres, mais probablement seulement vendredi.
Aucune différence notable.
handle
2020-06-07 15:35:57 UTC
view on stackexchange narkive permalink

Mise à jour / résumé de 2020-06

  • Le MAX98357 ne gère pas bien la sortie I2S du RPi, ce qui provoque des pops / fissures
    • la cause première est une brève interruption de haut niveau de BCLK avant le démarrage de LRCLK (oscillogrammes: réels, générés)
    • ne sait pas si la cause est le pilote I2S ou le périphérique SoC
    • ne sait pas si d'autres SoC que BCM2835 (Raspberry Pi 1 A, B, B +, module de calcul, zéro) sont concernés (veuillez laisser un commentaire)
  • Solutions de contournement:

    • utiliser l'entrée shutdown (SD) là où elle est disponible pour éliminer complètement les pop / craquements lors du démarrage / arrêt de la lecture
      • Le pilote MAX98357 prenant en charge SD existe pour Raspberry Pi Linux, mais n'est pas construit par défaut
      • L'entrée SD nécessite des niveaux de tension spécifiques pour la sélection du canal. Le fait de mettre cette broche en haut remplace tous les diviseurs de tension, donc le matériel
    • en gardant le périphérique audio ouvert, élimine tout sauf les pops / fissures d'activation et de désactivation

      • pas besoin de gaspiller la puissance du processeur en jouant des zéros de /dev/null:

          aplay -i  

        utilise aplay en mode interactif, qui ouvre et configure l'appareil, mais ne joue rien car il ne reçoit pas de données via stdin


À mon avis, Adafruit ne devrait pas encore faire de la publicité avec

"... fonctionne incroyablement bien avec le Raspberry Pi!"

et les fonctionnalités de la puce comique

  • Réduction Click + Pop
    ...
  • Excellente suppression des clics et des pop

car ils sont également état

"Nous n'avons pas de solution pour cela"

User98764431
2017-11-01 22:08:40 UTC
view on stackexchange narkive permalink

Si je comprends vraiment votre question correctement: cela devrait vous aider: Sinon, je la supprimerai:

C'est parce qu'une sortie PWM du processeur BCM2835 est utilisée, plutôt qu'un > DAC standard. Lorsque la fonction PWM est activée, il y a un saut de tension de sortie> qui se traduit par un bruit sec.

Jusqu'à ce qu'il y ait une modification du pilote, la solution de contournement suggérée (autre que l'utilisation de la sortie audio HDMI ou d'un USB) consiste à exécuter PulseAudio sur ALSA et à maintenir le pilote actif même lorsqu'aucun son n'est émis. Ceci est réalisé en désactivant le module PulseAudio en mode veille au repos, puis en configurant les applications pour utiliser PulseAudio plutôt que ALSA. Daniel Bader décrit cette solution et comment configurer MPD, dans un article de blog. Cependant, lorsque j'ai essayé cette approche, la solution de contournement n'a pas fonctionné.

Lorsque module-suspend-on-idle était activé, il y avait un bruit sec mais lorsque module-suspend-on-idle était désactivé, il n'y avait pas de sortie audio. J'ai étudié cela, principalement via les journaux de débogage dans / var / log / messages produits par PulseAudio après son démarrage avec pulseaudio --start --log-target = syslog --log-level = 4. J'ai également dû regarder la source de temps en temps.

Le problème s'est avéré être parce que les fichiers audio que je lisais étaient mono avec une fréquence d'échantillonnage de 16 000 Hz ou 48 000 Hz, et le format d'entrée audio par défaut pour le pilote ALSA était stéréo (avec une fréquence d'échantillonnage de 48 000 Hz). Lors de la lecture de l'audio, PulseAudio a dû changer le format d'entrée pour qu'il corresponde, même si le seul changement était stéréo à mono. Ce changement de format implique la réinitialisation du pilote et provoque ainsi un pop car il est désactivé et réactivé même si module-suspend-on-idle n'a pas suspendu le pilote. Une fois la lecture audio terminée, le format audio d'origine est restauré, ce qui entraîne également un pop.

Ce qui est pire, c'est que si le module-suspend-on-idle est désactivé, il n'y a pas sortie audio. Lorsque PulseAudio change le format, le pilote est suspendu mais ne reprend jamais. Il y a quelques commentaires dans la source PulseAudio qui suggèrent que le module-suspend-on-idle est supposé être disponible et qu'il est responsable de la reprise des pilotes lors d'un changement de format. Par conséquent, la solution de contournement pour le popping, qui consiste à désactiver la suspension du module au repos, ne convient pas lorsque le format d'entrée audio n'est pas stéréo à 48 000 Hz.

Plutôt que de désactiver le module-suspension-on -idle, la solution de contournement sur laquelle je suis arrivé était de définir un délai d'inactivité très long. Cela se fait en ajoutant timeout = 604800 à la ligne commençant par load-module module-suspend-on-idle dans /etc/pulse/default.pa. Désormais, lorsqu'il y a eu un changement de format, le pilote est toujours réactivé mais le pilote ne sera suspendu qu'une semaine (604 800 secondes) après la lecture du dernier audio.

En faisant cela, nous ne le faisons pas obtenir des sauts entre les pistes lorsqu'elles sont toutes stéréo à 48 000 Hz et qu'au moins d'autres formats d'entrée audio sont lus. Cependant, cela ne résout pas le changement de format. Pour faire face à cela, j'ai converti l'audio en stéréo 48 000 Hz avant de l'envoyer à PulseAudio. Un programme qui peut faire cela est mplayer. Par exemple, pour lire un fichier audio en utilisant PulseAudio, procédez comme suit:

mplayer -ao pulse -af channels = 2, resample = 48000: 1 FILENAME

Les canaux = 2 convertissent le mono en stéréo et le rééchantillonnage = 48 000: 1 convertit la fréquence d'échantillonnage en 48 000 Hz. La page de manuel mplayer donne plus de détails. Ces options peuvent également être combinées avec d'autres utilisations de mplayer, par exemple en tant que programme de sortie audio pour le programme de synthèse vocale Festival, en ajoutant ce qui suit à votre ~ / .festivalrc:

(Parameter.set 'Audio_Command "mplayer -really-quiet -noconsolecontrols -nojoystick -nolirc -nomouseinput -demuxer rawaudio -rawaudio channels = 1: rate = $ SR $ FILE -ao pulse -af channels = 2, resample = 48000: 1")

Source

Alors que votre [source citée] (https://www.lightbluetouchpaper.org/2013/02/10/fixing-poppingclicking-audio-on-raspberry-pi/) (j'ai ajouté une mise en forme appropriée) contient des informations intéressantes, vous avez oublié que mon La question concerne un appareil I2S, qui est dans le titre et la première phrase, donc PWM n'est pas le problème. Si c'était le cas, votre qoute omet qu'il a été corrigé: `Mise à jour (07/03/2013): Selon un commentaire sur le traqueur de bogues Raspberry Pi, ce problème a maintenant été corrigé.
Cependant, j'essaierai davantage les effets des paramètres de fréquence d'échantillonnage demain (les tests initiaux avec l'ajustement d'ALSA à la fréquence d'échantillonnage du fichier source n'ont pas résolu le problème). Veuillez ne pas supprimer votre réponse, cela peut être utile aux autres.
désolé je vais continuer à chercher
** S'il n'y a pas d'autres réponses ** puis-je au moins obtenir la prime complète?
DBunting
2019-05-20 08:17:27 UTC
view on stackexchange narkive permalink

Lors du dépannage d'un autre problème I2S, je suis tombé sur une référence à ce problème. Il s'agit en fait de l'ouverture et de la fermeture de l'appareil.

Il existe une option pour "Veille automatique" du son. Vous voudrez désactiver cette option si vous l'éteignez, le périphérique audio sera maintenu ouvert en utilisant plus de puissance, mais pas de pop

Merci de votre intérêt! Pourriez-vous s'il vous plaît élaborer sur "un problème", "référence", "une option" - sinon je n'ai aucun moyen de savoir (et d'essayer) de quoi vous faites référence ... Avez-vous pu résoudre votre problème?


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...