Unterstützung für I2S-DAC-Geräte (Kerneltreiber?) Und Rauschen („Pop“, „Knistern“) bei der Wiedergabe

8

Ich versuche eine Adafruit I2S 3W Stereo-Lautsprecherhaube für Raspberry Pi - Mini Kit , die auf zwei MAX98357 (Datenblatt: Adafruit , Maxim ) basiert , auf einem Raspberry Pi Zero W mit Raspbian Stretch (gestern aktualisiert).

Das Problem ist, dass ich beim Starten / Ändern von Tracks "Pops" habe, selbst bei gleicher Audiorate. Ihre Anweisungen, um diese zu "reparieren", fügen den alsa-Konfigurationsdateien /etc/asound.confund meistens redundante Einstellungen hinzu ~/.asoundrc.

Ich habe derzeit nur asound.conf, wie folgt:

$ cat /etc/asound.conf
pcm.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
     channels 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"

}

softvolexistiert, um die Lautstärke global steuern zu können (in Software, Verschwendung von Auflösung), da der DAC keine Hardwaresteuerung hat. Aber anscheinend können einige Spieler dies auch selbst tun, also sollte beides ausreichen.

In Bezug auf den Fahrer, die Anweisungen hinzufügen , dtoverlay=hifiberry-daczu /boot/config.txt, aber die Hifiberry DAC (veraltet) auf einem (einzigen) anderen Chip, die PCM5102 basieren.

pi@raspberry:~ $ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Hifiberry listet die Konfiguration für ihre Produkte unter https://www.hifiberry.com/build/documentation/configuring-linux-3-18-x/ auf .

Ich würde gerne wissen, was die Unterschiede sind und ob der Vorschlag zum IC passt. Könnte der Treiber zusätzliche Daten senden, die ein "Knallen" oder "Knistern" verursachen?

Interessanterweise scheint der Lautsprechertest bei der Wiedergabe niemals das anfängliche Rauschen zu erzeugen

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

, während mpg123 dies tut (mit einem 16-kHz-Mono-MP3), auch zwischen Tracks:

High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.23.8; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes
Decoder: generic
Trying output module: alsa, device: <nil>
Using default module dir: /usr/lib/arm-linux-gnueabihf/mpg123
Module dir: /usr/lib/arm-linux-gnueabihf/mpg123
Module path: ./output_alsa.so
Chosen output module: alsa
...
Audio driver: alsa
Audio device: (null)
Audio capabilities:
(matrix of [S]tereo or [M]ono support for sample format and rate in 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  |

(Die Angabe von alsa funktioniert, die Angabe des Geräteindex schlägt fehl.)

Es ist nicht in der Datei, habe ich überprüft. Außerdem beginnt mplayer mit der Wiedergabe der identischen Datei in Ordnung, weist jedoch "Pops" zwischen den Titeln auf, obwohl die Angabe der Audioausgabe des mplayers das Knallen beim Wechseln der Titel fast zu eliminieren scheint.

mplayer -msglevel all=6 -ao alsa file.mp3

MPlayer 1.3.0 (Debian), built with gcc-6.2.1 (C) 2000-2016 MPlayer Team
CPU: ARM

AUDIO: 16000 Hz, 2 ch, s16le, 24.0 kbit/4.69% (ratio: 3000->64000) 
Selected audio codec: [mpg123] afm: mpg123 (MPEG 1.0/2.0/2.5 layers I, II, III)
========================================================================== 

Building audio filter chain for 16000Hz/2ch/s16le -> 0Hz/0ch/??...
[libaf] Adding filter dummy
[dummy] Was reinitialized: 16000Hz/2ch/s16le
[dummy] Was reinitialized: 16000Hz/2ch/s16le
Trying preferred audio driver 'alsa', options '[none]'
alsa-init: requested format: 16000 Hz, 2 channels, 9
alsa-init: using ALSA 1.1.3
alsa-init: setup for 1/2 channel(s)
alsa-init: using device default
alsa-init: opening device in blocking mode
alsa-init: device reopened in blocking mode
alsa-init: got buffersize=32768
alsa-init: got period size 1024
alsa: 44100 Hz/2 channels/4 bpf/32768 bytes buffer/Signed 16 bit Little Endian
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)
AO: Description: ALSA-0.9.x-1.x audio output
AO: Author: Alex Beregszaszi, Zsolt Barat <joy@***.de>
AO: Comment: under development
Building audio filter chain for 16000Hz/2ch/s16le -> 44100Hz/2ch/s16le...
[dummy] Was reinitialized: 16000Hz/2ch/s16le
[libaf] Adding filter lavcresample
[SWR @ 0xb6841020]Using s16p internally between filters
[dummy] Was reinitialized: 44100Hz/2ch/s16le
[dummy] Was reinitialized: 44100Hz/2ch/s16le
Video: no video
Freeing 0 unused video chunks.
Starting playback...

Alsa Puffergröße stimmt nicht mit der Konfiguration überein.

MPD (gesteuert von mpc) klickt / knallt einmal, wenn die Wiedergabe beginnt, "strömt" dann aber anscheinend kontinuierlich, sodass das Wechseln der Titel kein Rauschen verursacht.

Unabhängig davon, was die Pops verursacht (Hardware? Treiber?), Können einige Spieler diese Situation besser vermeiden (Öffnen / Neukonfigurieren des Geräts).
Jede Eingabe, wie man zur Grundursache kommt und sie behebt, wird sehr geschätzt!


Weiter graben

Wenn Sie die ALSA-Plugins im Order-Plug -> dmix -> softvol -> pcm konfigurieren, wird im mplayer ein Fehler angezeigt:

[AO_ALSA] alsa-lib: pcm_dmix.c:1057:(snd_pcm_dmix_open) dmix plugin can be only connected to hw plugin

Also zurück zu: plug -> softvol -> dmix -> I2S DAC (Kernel PCM).

Die Konfigurationsdatei kann wie folgt hierarchisch geschrieben werden:

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
            channels 2
            period_size 2048  # bytes
            buffer_size 32768 # usec
          }
          bindings
          {
            0 0
            1 1
          }
        }
      }
      control
      {
        name "PCM" 
        card 0
      }
    }
  }
}

Softvol's controlist das, was als Mischgerät in z alsamixer. Ich bin mir immer noch nicht sicher, was CTLs tun. Alsa speichert seine Konfiguration / Einstellungen normalerweise dauerhaft. Dies kann dazu führen, dass veraltete Mischgeräte angezeigt werden.

Dies funktionierte, um sie zu entfernen (verwenden Sie sudo):

rm /var/lib/alsa/asound.state # remove the state file
chmod -x /usr/sbin/alsactl # make alsactl non-executable to prevent settings being written on shutdown
<REBOOT>
chmod +x /usr/sbin/alsactl

Mit mplayer und 32kHz Audio knallt nur gelegentlich, wenn Titel gewechselt werden. Das Erhöhen der Puffergröße scheint die gelegentliche Wiedergabe von "Stottern / Echo" gelöst zu haben.

dmix ist das Plugin, das die meisten Pops beim Abspielen / Stoppen entfernt. Es macht keinen merklichen Unterschied, ob die Quellen oder die Standardrate in der Rate des dmix-Slaves eingestellt sind.

Gerätebaum-Overlays (Link zur Dokumentation unten):

$ ls /boot/overlays
adau1977-adc.dtbo                       fe-pi-audio.dtbo               iqaudio-dacplus.dtbo            pitft28-capacitive.dtbo         sdtweak.dtbo
adau7002-simple.dtbo                    goodix.dtbo                    iqaudio-digi-wm8804-audio.dtbo  pitft28-resistive.dtbo          smi-dev.dtbo
ads1015.dtbo                            googlevoicehat-soundcard.dtbo  justboom-dac.dtbo               pitft35-resistive.dtbo          smi.dtbo
ads1115.dtbo                            gpio-ir.dtbo                   justboom-digi.dtbo              pps-gpio.dtbo                   smi-nand.dtbo
ads7846.dtbo                            gpio-poweroff.dtbo             lirc-rpi.dtbo                   pwm-2chan.dtbo                  spi0-cs.dtbo
akkordion-iqdacplus.dtbo                gpio-shutdown.dtbo             mcp23017.dtbo                   pwm.dtbo                        spi0-hw-cs.dtbo
allo-boss-dac-pcm512x-audio.dtbo        hifiberry-amp.dtbo             mcp23s17.dtbo                   qca7000.dtbo                    spi1-1cs.dtbo
allo-digione.dtbo                       hifiberry-dac.dtbo             mcp2515-can0.dtbo               raspidac3.dtbo                  spi1-2cs.dtbo
allo-piano-dac-pcm512x-audio.dtbo       hifiberry-dacplus.dtbo         mcp2515-can1.dtbo               README                          spi1-3cs.dtbo
allo-piano-dac-plus-pcm512x-audio.dtbo  hifiberry-digi.dtbo            mcp3008.dtbo                    rotary-encoder.dtbo             spi2-1cs.dtbo
at86rf233.dtbo                          hifiberry-digi-pro.dtbo        midi-uart0.dtbo                 rpi-backlight.dtbo              spi2-2cs.dtbo
audioinjector-addons.dtbo               hy28a.dtbo                     midi-uart1.dtbo                 rpi-cirrus-wm5102.dtbo          spi2-3cs.dtbo
audioinjector-wm8731-audio.dtbo         hy28b.dtbo                     mmc.dtbo                        rpi-dac.dtbo                    spi-gpio35-39.dtbo
audremap.dtbo                           i2c0-bcm2708.dtbo              mpu6050.dtbo                    rpi-display.dtbo                spi-rtc.dtbo
bmp085_i2c-sensor.dtbo                  i2c1-bcm2708.dtbo              mz61581.dtbo                    rpi-ft5406.dtbo                 tinylcd35.dtbo
dht11.dtbo                              i2c-bcm2708.dtbo               papirus.dtbo                    rpi-proto.dtbo                  uart1.dtbo
dionaudio-loco.dtbo                     i2c-gpio.dtbo                  pi3-act-led.dtbo                rpi-sense.dtbo                  vc4-fkms-v3d.dtbo
dionaudio-loco-v2.dtbo                  i2c-mux.dtbo                   pi3-disable-bt.dtbo             rpi-tv.dtbo                     vc4-kms-v3d.dtbo
dpi18.dtbo                              i2c-pwm-pca9685a.dtbo          pi3-disable-wifi.dtbo           rra-digidac1-wm8741-audio.dtbo  vga666.dtbo
dpi24.dtbo                              i2c-rtc.dtbo                   pi3-miniuart-bt.dtbo            sc16is750-i2c.dtbo              w1-gpio.dtbo
dwc2.dtbo                               i2c-rtc-gpio.dtbo              piscreen2r.dtbo                 sc16is752-spi1.dtbo             w1-gpio-pullup.dtbo
dwc-otg.dtbo                            i2c-sensor.dtbo                piscreen.dtbo                   sdhost.dtbo                     wittypi.dtbo
enc28j60.dtbo                           i2s-gpio28-31.dtbo             pisound.dtbo                    sdio-1bit.dtbo
enc28j60-spi2.dtbo                      iqaudio-dac.dtbo               pitft22.dtbo                    sdio.dtbo

Die Overlay-Dateien sind binär, durchsuchen jedoch die Quellen unter https://github.com/raspberrypi/linux/search?utf8=%E2%9C%93&q=hifiberry&type=

führt zu ein paar Treffern:

und weiter

Es existiert also ein bestimmter Treiber. Ist es in Raspbian verfügbar?

$ find /lib/modules/$(uname -r) -type f -name \*.ko | grep sound
/lib/modules/4.9.59+/kernel/sound/ac97_bus.ko
/lib/modules/4.9.59+/kernel/sound/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+/kernel/sound/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/sound/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

Nee.

Ältere Bemühungen, den Fahrer für ein anderes Board zu begeistern : http://community.onion.io/topic/1761/resolved-attaching-pcm5102-to-omega2-i2s/13

Dies zeigt möglicherweise, wie eine passende Gerätebaumüberlagerung erstellt und der Treiber angegeben wird (muss kompiliert werden?):

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


Update 2

Dies muss durch (erneutes) Öffnen des Geräts verursacht werden. Mit $ aplay -D default -c 2 -f S16 -r 48000 /dev/zero &den Pops sind mit jedem Spieler weg. Das Spielen von Nullen und das Mischen von Software scheint jedoch etwas CPU-intensiv zu sein:

$ w
 18:21:38 up  1:17,  1 user,  load average: 0.11, 0.15, 0.12
 ...

Töte es mit

pi@raspberry:~ $ ps | grep aplay
16697 pts/0    00:00:28 aplay
pi@raspberry:~ $ ps aux | grep aplay
pi       16697  2.6  0.6   5828  2996 pts/0    SL   18:08   0:29 aplay -D default -c 2 -f S16 -r 48000 /dev/zero
pi       21159  0.0  0.3   4364  1764 pts/0    S+   18:26   0:00 grep --color=auto aplay
pi@raspberry:~ $ kill 16697
pi@raspberry:~ $ Aborted by signal Terminated...
aplay: pcm_write:2011: write error: Interrupted system call
^C
[1]+  Exit 1                  aplay -D default -c 2 -f S16 -r 48000 /dev/zero
pi@raspberry:~ $

(Man könnte dies über einen Eintrag in /etc/rc.local " automatisch starten" .)


Update 3

MPD scheint die Option zu haben, "diese Audioausgabe immer offen zu halten": https://www.musicpd.org/doc/user/config_audio_outputs.html Aber es scheint nur für das Streaming zu sein, da es keine Auswirkungen auf die Wiedergabe hat Start:

sudo nano /etc/mpd.conf

audio_output {
        type            "alsa"
        name            "default"
#       device          "hw:0,0"        # optional
#       mixer_type      "hardware"      # optional
#       mixer_device    "default"       # optional
        mixer_control   "PCM"           # optional
#       mixer_index     "0"             # optional
        always_on       "yes"
}

sudo service mpd restart

mpc play

mpc stop

Weitere Messungen und Vergleiche mit Audioaufnahmen zeigen:

  • Wenn der hörbare Fehler / Knall / Riss zu Beginn der Wiedergabe auftritt (I2S-Start), ist er an beiden Lautsprecherausgängen als positive Spitze sichtbar
  • Ich vermute, es könnte durch das LRCLK verursacht werden, das ca. 500 uns nach BCLK
  • Datenblatt zeigt unterschiedliche Reihenfolge in "EINSCHALTEN DER ANTWORT (STANDBY-MODUS)"

Also zurück zur I2S-Schnittstelle und zum Treiber

Erstellen und Ausführen (Warnung: Das Stoppen des Programms auch über desetup_io () stoppt das I2S nicht) ...

~ $ 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

Startet das LRCLK an der dritten ansteigenden Flanke von BCLK und führt zu einem schönen Hochlauf, wie im Datenblatt gezeigt, obwohl BLCK zuerst startet.


Mit _i2s_test_ . Die Uhr (gelb) startet zwei Impulse vor LRCLK (cyan). Audioausgang-Hochlauf auf beiden Kanälen sichtbar ( kein Knacken oder Knistern): gut

Audio abspielen. Beachten Sie die Störung / Lücke in der Uhr (gelb, ungefähr 30 us Uhr, gefolgt von 150 us hoch). Die Ausgabe (pink / blau) scheint undefiniert zu sein, bevor Pop auftritt (am Trigger), wenn LRCLK startet, etwa 30 ms vor dem Start der Daten (nicht gezeigt): Schlecht

Manchmal fällt der Pop nicht auf, aber die Spur sieht sehr ähnlich aus.


Ist es also der BLCK-Fehler (was verursacht dies, es ist wahrscheinlich nicht beabsichtigt) oder die Polarität (i2s_test beginnt bei niedrigem Pegel), während der reguläre Betrieb einen hohen Pegel hat?

Versuchen wir also, den entsprechenden Treiber zu verwenden, wie unter https://raspberrypi.stackexchange.com/a/74804/75483 beschrieben

[Das Erstellen des Kernels dauert wahrscheinlich einen Tag oder so, es lohnt sich wahrscheinlich, sich mit Cross-Compiling zu befassen.]

Obwohl es in Ordnung zu sein scheint (sound / soc / codecs / snd-soc-max98357a.ko), scheint das pi0w danach nicht richtig zu booten, zumindest stellt es keine Verbindung zu WLAN her. Ich muss es an ein Display anschließen und verstecken.


Ich konnte auch keine Tastatur zum Laufen bringen, und das liegt nicht daran, dass ich zuerst einen einfachen A-Micro B-Adapter anstelle eines richtigen OTG-Adapters verwendet habe.

Jetzt könnte ich es wahrscheinlich über die serielle Schnittstelle anschließen ...

Das Ende der funktionierenden (Stretch Lite-Standardkernel) Bootprozessausgabe auf seriell sieht aus

[    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 Tue Aug 8 15:47:12 BST 2017

[  OK  ] Started Configure Bluetooth Modems connected by UART.
[  OK  ] Started Load/Save RF Kill Switch Status.
[  OK  ] Started LSB: Resize the root filesystem to fill partition.
[  OK  ] Started dhcpcd on all interfaces.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
[  OK  ] Started Daily apt download activities.
[  OK  ] Started Daily apt upgrade and clean activities.
[  OK  ] Reached target Timers.
         Starting OpenBSD Secure Shell server...
         Starting Permit User Sessions...
         Starting /etc/rc.local Compatibility...
My IP address is xxxx:xx:xxxx:xxxx:xxxx:xxxx:xxx:xxxx
[  OK  ] Started OpenBSD Secure Shell server.
[  OK  ] Started Permit User Sessions.
[  OK  ] Started /etc/rc.local Compatibility.
         Starting Daily apt download activities...
         Starting Hold until boot process finishes up...
         Starting Terminate Plymouth Boot Screen...

Das Bild mit benutzerdefiniertem Kernel (kein WLAN, keine Tastatur) ergibt

[    0.000000] Linux version 4.9.61+ (pi@raspberry) (gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1) ) #1 Mon Nov 13 03:14:02 CET 2017

[FAILED] Failed to start Configure Bluetooth Modems connected by UART.
See 'systemctl status hciuart.service' for details.
[  OK  ] Started dhcpcd on all interfaces.
[  OK  ] Reached target Network.
         Starting OpenBSD Secure Shell server...
[  OK  ] Reached target Network is Online.
         Starting LSB: Start NTP daemon...
[  OK  ] Started Music Player Daemon.
         Starting Permit User Sessions...
         Starting /etc/rc.local Compatibility...
[  OK  ] Started /etc/rc.local Compatibility.
[  OK  ] Started Permit User Sessions.
         Starting Terminate Plymouth Boot Screen...
         Starting Hold until boot process finishes up...
[  OK  ] Created slice User Slice of root.
[  OK  ] Started Session c1 of user root.
         Starting User Manager for UID 0...

Befinden sich WIFI und Bluetooth nicht auf demselben Chip? Keine Hardware-Informationen oder aktuellen Schaltpläne von RPi Foundation erhältlich.

pi@raspberry:~$ ifconfig wlan0
wlan0: error fetching interface information: Device not found

Also habe ich das Wifi kaputt gemacht. Gibt es eine Chance, zum funktionierenden Kernel / zur funktionierenden Konfiguration zurückzukehren, ohne meine Änderungen / Dateien zu verlieren? Kerneldateien von funktionierenden SD ersetzen? Nein , das Ersetzen von allem in / boot / außer config.txt führt zu einem hängenden Start bei

[    2.930955] mmc1: new high speed SDIO card at address 0001
[   22.411095] random: crng init done

Jetzt muss ich wirklich neu anfangen. Möglicherweise kann ich meine Daten von zu Hause aus lesen, indem ich das beschädigte System über USB OTG und Kartenleser anschließe

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

Vielleicht hätte ich zuerst aktualisieren sollen:

pi@raspberrypi:~ $ sudo rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
...
 *** Backing up modules 4.9.41+
...
 *** depmod 4.9.62-v7+
 *** depmod 4.9.62+
...
 *** If no errors appeared, your firmware was successfully updated to 23b1614bb794dfce586f1300da75198befa4951d
 *** A reboot is needed to activate the new firmware
pi@raspberrypi:~ $ sudo reboot
  • Ich könnte es morgen erneut versuchen (nachdem ich ein Backup erstellt habe).
  • Kein Wifi / IP nach dem Update (aber wlan0 in gezeigt ifconfig)

    • setze WLAN-Land mit sudp raspi-config(4> I4)
  • Das Overlay muss i2s-mmapweder aktiviert noch automatisch aktiviert werden i2s, hifiberry-dacund mmap ist seit 4.9 (April 2017) implizit verfügbar .


Informationen zu genau diesen Problemen und einigen Details zum I2S-Treiber finden Sie unter https://github.com/raspberrypi/linux/issues/2212


Ressourcen:

Griff
quelle
Ja, für das iterative Debuggen sollten Sie den Kernel auf jeden Fall überkompilieren. Schade, dass das Neukompilieren WiFi kaputt gemacht hat. Der Wechsel von 4.9.41+ zu 4.9.61+ ist keine große Änderung, daher würde ich vermuten, dass der Kernel / die Module für das Kompilieren mit gcc 6.3.0 nicht gut getestet wurden. Mit einer Cross-Compilation-Umgebung unter Debian 9 können Sie dies eingrenzen. Was "Kernel / Konfiguration funktionieren, ohne meine Änderungen / Dateien zu verlieren? Kerneldateien von der funktionierenden SD ersetzen?", Ja, Sie müssen höchstens nur /boot/kernel.img, /boot/*.dtb, / boot / Overlays / sichern. und / lib / modules /
jdonald
@jdonald Danke, ich habe nicht ganz aufgegeben, obwohl das Einrichten von Virtualbox mit lubuntu bei mir noch nicht funktioniert hat. Ich habe seit einiger Zeit kein Linux-Setup mehr gehabt, daher ist es eine ziemlich große Anstrengung und ich würde lieber andere Dinge tun. Tatsächlich mache ich das gerade (um die fest codierte Puffergröße in py-spidev herum). Ich habe meine Karte mit Win32DiskImager gesichert, werde aber beim nächsten Mal Ihren Vorschlag versuchen.
behandeln
1
@jdonald VirtualBox (+ Erweiterungen für freigegebene Ordner und ein USB-Kartenleser) mit Ubuntu 16 LTS führte nun zu einem funktionierenden Kernel, aber es sieht so aus, als ob der I2S-Treiber und / oder die Hardware den BCLK-Fehler verursachen, der tatsächlich für den Pop verantwortlich ist (in Verbindung mit diesem speziellen DAC).
behandeln

Antworten:

2

Es existiert also ein bestimmter Treiber. Ist es in Raspbian verfügbar?

Nee.

(muss kompiliert werden?)

Ja, es ist verfügbar, indem Sie es als Modul angeben und den Kernel neu kompilieren . Eine Möglichkeit zur Konfiguration für max98357a besteht darin, sound/soc/bcm/Kconfigdie folgende Zeile zu bearbeiten :

select SND_SOC_MAX98357A

direkt unter der Leitung mit PCM5102A, und fügen CONFIG_SND_SOC_MAX98357A=mSie dann Ihre .configvor dem Wiederaufbau hinzu.

Mir wurde gesagt, dass diese Art der direkten Bearbeitung .configverpönt ist, aber so wie es jetzt aussieht, erscheint dieses Modul nicht in der Menükonfiguration.

Wenn ich das Modul über sudo modprobe snd-soc-max98357ameinen Pi Zero W lade, werden in dmesg keine Fehler angezeigt, was es wert ist. Wenn dies Sie Ihrem Ziel näher bringen oder zumindest etwas ausschließen könnte, stellen Sie Ihnen diese kompilierten Binärdateien gerne zur Verfügung.

Die Overlay-Dateien sind binär, aber ... https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts

Richtig, Sie könnten versuchen hifiberry-dac-overlay.dts, pcm5102a durch max98357a zu bearbeiten und zu ersetzen. Gerätebaum-Overlays werden automatisch mit dem dtbsZiel im Standard-Kernel-Build-Flow neu erstellt.

jdonald
quelle
Danke, ich habe das auf meiner ToDo-Liste, es scheint ein paar Unterschiede zu den Fahrern zu geben, aber ich habe es noch nicht weiter untersucht. Die I2S-Schnittstelle zeigt ein anwendungsabhängiges Verhalten, dh mpg123 scheint das Gerät zweimal zu öffnen, was zu sehr auffälligen Pops führt. mplayer scheint dies nicht zu tun, und die Pops sind nicht so "extrem", aber dennoch treten sie regelmäßig beim Öffnen der I2S-Übertragung auf. Mir ist aufgefallen, dass die Bituhr kurz startet und läuft, bevor sie stoppt und dann wieder startet. Ich weiß noch nicht, ob dies beabsichtigt ist, ich denke nicht. Dies ist jedoch wahrscheinlich keine direkte ...
behandeln
... Ursache für das Knallen. Vielleicht ist es ein Zeitproblem. Ich werde das mit einem Logikanalysator überprüfen. In Bezug auf Treiber: Ich habe einige Stellen gefunden, die zeigen, wie mit Gerätebaum-Overlays gearbeitet wird. Ich werde später Links hinzufügen.
behandeln
Ich habe die Frage mit Oszilloskopspuren und einem Link zu genau diesem Problem auf dem RPi Github aktualisiert, wo einige Treibererkenntnisse gegeben wurden, aber noch keine Lösung (Empfehlung ist, den IC herunterzufahren). Das Ändern des Gerätetreibers hilft möglicherweise nicht, anscheinend ist der I2S-Treiber beteiligt.
behandeln
2

Sie müssen ein leistungsfähigeres RPi ausprobieren. Die Mischung aus der Zero W Single Core CPU und Linux ergibt ein System, das in einigen Fällen nicht so reaktionsschnell ist. Eine "Pause" von einigen Millisekunden im falschen Moment ist ein Riss oder ein Knall.

Die Tatsache, dass ein größerer Puffer etwas geholfen hat, ist ein wichtiges Symptom. Vielleicht ist es nicht möglich, Ihr Problem zu lösen.


quelle
2
Störungen aufgrund von Nicht-Echtzeit-Verarbeitung erscheinen plausibel. @handle Gibt es einen Unterschied im Verhalten, wenn Sie mplayer / mpc mit ausführen nice -20? Wenn diese Befehle Laich Subprozesse können Sie sich auch topund renicedie untergeordneten Prozesse. Dies ist ein Softwareansatz zum Testen der Erklärung von @ nicolap8. Der Hardware-Ansatz besteht je nach Schwierigkeit beim Wiederherstellen Ihres Setups darin, mit einem Pi 3 zu testen.
jdonald
Leider habe ich keinen Zugang zu einem Modell mit besserer CPU zum Vergleichen. Die kurze Unterbrechung der I2S-Uhr scheint nicht die Hauptursache zu sein, da sie immer vorhanden ist, auch wenn das Starten der Wiedergabe keinen merklichen "Pop" verursacht. @jdonald Ich werde diese Parameter auch testen, aber wahrscheinlich nur am Freitag.
behandeln
Kein merklicher Unterschied ..
behandeln
0

Wenn ich Ihre Frage wirklich richtig verstehe: Dies sollte Ihnen helfen: Wenn nicht, werde ich sie löschen:

Dies liegt daran, dass ein PWM-Ausgang der BCM2835-CPU anstelle eines> Standard-DAC verwendet wird. Wenn die PWM-Funktion aktiviert ist, springt die Ausgangsspannung>, was zu einem Knallgeräusch führt.

Bis es zu einer Treiberänderung kommt, wird empfohlen, PulseAudio über ALSA auszuführen und den Treiber auch dann aktiv zu halten, wenn kein Ton ausgegeben wird (außer bei Verwendung des HDMI-Soundausgangs oder einer externen USB-Soundkarte). Dies wird erreicht, indem das PulseAudio-Modul zum Anhalten des Moduls im Leerlauf deaktiviert und dann Anwendungen so konfiguriert werden, dass PulseAudio anstelle von ALSA verwendet wird. Daniel Bader beschreibt diese Problemumgehung und die Konfiguration von MPD in einem Blogbeitrag. Als ich diesen Ansatz ausprobierte, funktionierte die Problemumgehung jedoch nicht.

Wenn Modul-Suspend-On-Idle aktiviert war, gab es ein Knallgeräusch, aber wenn Modul-Suspend-On-Idle deaktiviert war, gab es keine Tonausgabe. Ich habe dies untersucht, hauptsächlich obwohl die Debug-Protokolle in / var / log / messages von PulseAudio erstellt wurden, nachdem es mit pulseaudio --start --log-target = syslog --log-level = 4 gestartet wurde. Gelegentlich musste ich auch auf die Quelle schauen.

Das Problem stellte sich heraus, dass die Audiodateien, die ich abspielte, Mono mit einer Abtastrate von 16.000 Hz oder 48.000 Hz waren und das Standard-Audioeingabeformat für den ALSA-Treiber Stereo war (mit einer Abtastrate von 48.000 Hz). Während der Audiowiedergabe musste PulseAudio das Eingabeformat entsprechend anpassen, auch wenn die einzige Änderung Stereo in Mono war. Diese Formatänderung beinhaltet das Zurücksetzen des Treibers und verursacht daher ein Pop, da er deaktiviert und wieder aktiviert wird, selbst wenn das Modul-Suspend-On-Idle den Treiber nicht angehalten hat. Sobald die Audiowiedergabe beendet ist, wird das ursprüngliche Audioformat wiederhergestellt, was ebenfalls zu einem Pop führt.

Schlimmer ist, dass bei deaktiviertem Modul-Suspend-on-Idle keine Audioausgabe erfolgt. Wenn PulseAudio das Format wechselt, wird der Treiber angehalten, aber nie fortgesetzt. In der PulseAudio-Quelle gibt es einige Kommentare, die darauf hindeuten, dass das Anhalten des Moduls im Leerlauf als verfügbar angenommen wird und für die Wiederaufnahme der Treiber bei einer Formatänderung verantwortlich ist. Daher ist die Problemumgehung für das Poppen, das Deaktivieren des Modul-Suspend-on-Idle, nicht geeignet, wenn das Audioeingangsformat bei 48.000 Hz nicht stereo ist.

Anstatt das Anhalten des Moduls im Leerlauf zu deaktivieren, bestand die Problemumgehung darin, ein sehr langes Leerlaufzeitlimit festzulegen. Dies erfolgt durch Anhängen von timeout = 604800 an die Zeile, die mit dem Lademodul module-suspend-on-idle in /etc/pulse/default.pa beginnt. Wenn sich das Format geändert hat, wird der Treiber weiterhin fortgesetzt, der Treiber wird jedoch erst eine Woche (604.800 Sekunden) nach der Wiedergabe des letzten Audios angehalten.

Auf diese Weise wird nicht zwischen den Spuren gewechselt, wenn alle mit 48.000 Hz in Stereo sind und zumindest andere Audioeingangsformate wiedergegeben werden. Dies behebt jedoch nicht das Aufspringen bei Formatänderungen. Um dies zu bewältigen, habe ich das Audio in 48.000 Hz Stereo konvertiert, bevor ich es an PulseAudio gesendet habe. Ein Programm, das dies kann, ist mplayer. Um beispielsweise eine Audiodatei mit PulseAudio wiederzugeben, gehen Sie wie folgt vor:

mplayer -ao puls -af Kanäle = 2, Resample = 48000: 1 FILENAME

Die Kanäle = 2 wandeln Mono in Stereo um und das Resample = 48000: 1 wandelt die Abtastrate in 48.000 Hz um. Die mplayer-Manpage enthält weitere Details. Diese Optionen können auch mit anderen Verwendungen von mplayer kombiniert werden, z. B. als Audioausgabeprogramm für das Sprachsyntheseprogramm des Festivals, indem Sie Ihrem ~ / .festivalrc Folgendes hinzufügen:

(Parameter.set 'Audio_Command "mplayer -really-quiet -noconsolecontrols -nojoystick -nolirc -nomouseinput -demuxer rawaudio -rawaudio Kanäle = 1: rate = $ SR $ FILE -ao Puls -af Kanäle = 2, Resample = 48000: 1" )

Quelle

User98764431
quelle
1
Während Ihre zitierte Quelle (ich habe die richtige Formatierung hinzugefügt) interessante Informationen enthält, haben Sie übersehen, dass es sich bei meiner Frage um ein I2S-Gerät handelt, das im Titel und im ersten Satz enthalten ist, sodass PWM nicht das Problem ist. Wenn es so wäre, dass Ihr qoute vorenthält , wird behoben:Update (2013-03-07): According to a comment on the Raspberry Pi bug tracker, this problem has now been fixed.
Griff
1
Ich werde jedoch morgen weitere Auswirkungen der Einstellungen für die Abtastrate versuchen (erste Tests mit der Anpassung von ALSA an die Abtastrate der Quelldatei haben das Problem nicht behoben). Bitte löschen Sie Ihre Antwort nicht, sie kann für andere hilfreich sein.
behandeln
Entschuldigung, ich werde weiter suchen
User98764431
Wenn es keine anderen Antworten gibt, kann ich dann wenigstens die volle Prämie bekommen?
User98764431
0

Bei der Fehlerbehebung bei einem anderen I2S-Problem bin ich auf dieses Problem gestoßen. Es hat in der Tat oben mit dem Öffnen und Schließen des Geräts zu tun.

Es gibt eine Option für den "Auto Sleep" -Sound. Wenn Sie das deaktivieren möchten, bedeutet dies, dass das Audiogerät mit mehr Strom, aber ohne Knaller offen gehalten wird

DBunting
quelle
Danke für Ihr Interesse! Könnten Sie bitte näher auf "ein Problem", "Referenz", "eine Option" eingehen - ansonsten kann ich nicht wissen (und versuchen), worauf Sie sich beziehen ... Konnten Sie Ihr Problem lösen?
behandeln