Hỗ trợ thiết bị I2S DAC (trình điều khiển hạt nhân?) Và tiếng ồn (phát trực tiếp, bật crack crack) khi phát lại


8

Tôi đang dùng thử Bonnet Loa âm thanh nổi Adaf nhung I2S 3W cho Raspberry Pi - Mini Kit , được chế tạo khoảng hai MAX98357 (datasheet: adafbean , maxim ), trên Raspberry Pi Zero W với Raspbian Stretch (được nâng cấp ngày hôm qua).

Vấn đề là tôi có "bật" khi bắt đầu / thay đổi bản nhạc, ngay cả với cùng tốc độ âm thanh. Hướng dẫn của họ để "sửa chữa" những thứ này thêm phần lớn các thiết lập dự phòng vào các tệp cấu hình alsa /etc/asound.conf~/.asoundrc.

Tôi hiện chỉ có asound.conf, như thế này:

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

}

softvoltồn tại để có thể kiểm soát âm lượng trên toàn cầu (trong phần mềm, lãng phí độ phân giải), do DAC không có điều khiển phần cứng. Nhưng rõ ràng một số người chơi cũng có thể tự làm điều này, vì vậy hoặc là đủ.

Về trình điều khiển, các hướng dẫn của họ được thêm dtoverlay=hifiberry-dacvào /boot/config.txt, nhưng Hifiberry DAC (lỗi thời) dựa trên một chip (đơn) khác nhau, PCM5102.

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 liệt kê cấu hình cho các sản phẩm của họ tại https://www.hifiberry.com/build/documentation/configuring-linux-3-18-x/ .

Tôi muốn biết sự khác biệt là gì và liệu đề xuất có phù hợp với IC không. Trình điều khiển có thể gửi dữ liệu bổ sung gây ra "pop" hoặc "crackle" không?

Thật thú vị, kiểm tra loa không bao giờ xuất hiện để tạo ra tiếng ồn ban đầu khi phát lại

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

, trong khi mpg123 làm (với MP3 đơn âm 16kHz), cũng giữa các bản nhạc:

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  |

(chỉ định alsa hoạt động, chỉ định thiết bị không thành công)

Nó không có trong tập tin, tôi đã kiểm tra. Ngoài ra, mplayer bắt đầu phát tệp giống hệt OK, nhưng có "bật" giữa các bản nhạc, mặc dù đầu ra âm thanh của trình phát âm thanh cụ thể dường như gần như loại bỏ popping khi thay đổi bản nhạc.

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 buffersize không khớp với cấu hình.

MPD (được điều khiển bởi mpc) nhấp / bật một lần khi bắt đầu phát, nhưng sau đó rõ ràng "phát" liên tục để thay đổi bản nhạc không gây ra bất kỳ tiếng ồn nào.

Vì vậy, bất cứ điều gì gây ra pops ở vị trí đầu tiên (phần cứng? Trình điều khiển?), Một số người chơi dường như tốt hơn trong việc tránh tình huống đó (mở / cấu hình lại thiết bị).
Bất kỳ đầu vào về làm thế nào để đi đến nguyên nhân gốc và sửa chữa nó đánh giá cao nhiều!


Đào thêm

Định cấu hình các plugin ALSA trong trình cắm thứ tự -> dmix -> softvol -> pcm, dẫn đến lỗi mplayer gây ra lỗi:

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

Vì vậy, quay lại: plug -> softvol -> dmix -> I2S DAC (kernel PCM).

Tệp cấu hình có thể được viết theo thứ bậc như sau:

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 controllà những gì hiển thị như thiết bị trộn trong ví dụ alsamixer. Tôi vẫn chưa rõ những gì ctl làm. Alsa thường lưu trữ cấu hình / cài đặt liên tục. Điều này có thể gây ra các thiết bị trộn cũ xuất hiện.

Điều này làm việc để loại bỏ chúng (sử dụng 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

Với mplayer và âm thanh 32kHz chỉ thỉnh thoảng bật lên khi thay đổi bản nhạc. Việc tăng kích thước bộ đệm dường như đã giải quyết được việc phát lại "nói lắp / tiếng vang" thỉnh thoảng.

dmix là plugin loại bỏ hầu hết các cửa sổ bật lên khi phát / dừng. Nó [thỉnh thoảng bật các bản nhạc thay đổi bằng mplayer] không tạo ra sự khác biệt đáng chú ý cho dù các nguồn hoặc tỷ lệ mặc định được đặt theo tỷ lệ của nô lệ dmix.

Lớp phủ cây thiết bị (liên kết đến tài liệu bên dưới):

$ 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

Các tệp lớp phủ là nhị phân, nhưng tìm kiếm các nguồn tại https://github.com/raspberrypi/linux/search?utf8=%E2%9C%93&q=hifiberry&type=

kết quả trong một vài lần truy cập:

và xa hơn

Vì vậy, một trình điều khiển cụ thể tồn tại. Nó có sẵn trong Raspbian?

$ 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

Không.

Nỗ lực cũ hơn để đưa tài xế đi cho bảng khác nhau: http://community.onion.io/topic/1761/resolve-attaching-pcm5102-to-omega2-i2s/13

Điều này có khả năng cho thấy cách tạo lớp phủ cây thiết bị phù hợp và chỉ định trình điều khiển (cần biên dịch?):

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


Cập nhật 2

phải được gây ra bởi (mở lại) thiết bị. Với $ aplay -D default -c 2 -f S16 -r 48000 /dev/zero &các pops đã biến mất với bất kỳ người chơi. Nhưng chơi số không và trộn phần mềm có vẻ hơi tốn CPU:

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

Giết nó bằng

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

(Người ta có thể "tự động khởi động" điều này thông qua một mục trong /etc/rc.local .)


Cập nhật 3

MPD dường như có một tùy chọn để "giữ đầu ra âm thanh này luôn mở": https://www.musicpd.org/doc/user/config_audioDefputs.html Nhưng dường như nó chỉ dành cho phát trực tuyến, vì nó không ảnh hưởng đến phát lại khi phát lại khởi đầu:

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

Đo lường và so sánh với chương trình ghi âm thanh:

  • NẾU sự cố / pop / crack âm thanh xảy ra khi bắt đầu phát lại (bắt đầu I2S), nó có thể nhìn thấy trên cả hai đầu ra loa dưới dạng tăng đột biến
  • Tôi nghi ngờ nó có thể gây ra bởi LRCLK bắt đầu khoảng. 500 chúng tôi sau BCLK
  • biểu dữ liệu hiển thị thứ tự khác nhau trong "TACK-ON RESPONSE (CHẾ ĐỘ STANDBY)"

Quay lại giao diện và trình điều khiển I2S

Xây dựng và chạy (cảnh báo: dừng chương trình ngay cả thông qua desetup_io () không dừng 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

bắt đầu LRCLK trên cạnh tăng thứ ba của BCLK và dẫn đến kết quả tốt đẹp như được hiển thị trong biểu dữ liệu, mặc dù BLCK bắt đầu trước.


Với _i2s_test_ . Đồng hồ (màu vàng) bắt đầu hai xung trước LRCLK (màu lục lam). Âm thanh phát ra tăng vọt trên cả hai kênh ( không có pop hoặc crackle): tốt

Chơi âm thanh. Lưu ý trục trặc / khoảng cách trong đồng hồ (màu vàng, khoảng 30 us đồng hồ theo sau là 150 us cao). Đầu ra (màu hồng / xanh) dường như không được xác định trước khi pop xuất hiện (lúc kích hoạt) khi bắt đầu LRCLK, khoảng 30 ms trước khi dữ liệu bắt đầu (không hiển thị): xấu

Đôi khi pop không đáng chú ý, nhưng dấu vết trông rất giống nhau.


Vì vậy, đó có phải là trục trặc BLCK (nguyên nhân gây ra điều này, có thể không cố ý) hoặc phân cực (i2s_test bắt đầu từ cấp thấp) trong khi hoạt động thường xuyên có mức độ cao?

Vì vậy, hãy thử sử dụng trình điều khiển thích hợp như được nêu trong https://raspberrypi.stackexchange.com/a/74804/75483

[việc xây dựng kernel có thể mất một ngày hoặc lâu hơn, có lẽ đáng để xem xét biên dịch chéo ..]

Mặc dù có vẻ như xây dựng OK (âm thanh / soc / codec / snd-soc-max98357a.ko), pi0w dường như không khởi động đúng sau đó, ít nhất là nó không kết nối với wifi. Tôi sẽ phải nối nó với màn hình và HID.


Tôi cũng không thể làm cho bàn phím hoạt động được và không phải vì tôi đã sử dụng bộ chuyển đổi A-micro B đơn giản thay vì bộ chuyển đổi OTG thích hợp trước tiên.

Bây giờ tôi có thể gắn nó qua cổng nối tiếp ...

Kết thúc đầu ra của quá trình khởi động (kernel lite default kernel) trên serial trông giống như

[    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...

Hình ảnh với kernel tùy chỉnh (không có wifi, không có bàn phím) dẫn đến

[    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...

Không phải WIFI và bluetooth trên cùng một con chip sao? Không có thông tin phần cứng hoặc sơ đồ thực tế có sẵn từ RPi Foundation.

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

Vì vậy, tôi đã phá vỡ Wifi. Bất kỳ cơ hội nào để trở lại kernel / cấu hình hoạt động mà không làm mất các thay đổi / tệp của tôi? Thay thế tập tin kernel từ SD làm việc? Không , thay thế mọi thứ trong / boot / ngoại trừ kết quả config.txt trong khởi động treo tại

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

Vì vậy, bây giờ tôi thực sự phải bắt đầu mới. Tôi có thể đọc dữ liệu của mình từ thư mục gia đình bằng cách gắn hệ thống bị hỏng qua USB OTG và đầu đọc thẻ, đại loại như

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

Có lẽ tôi nên cập nhật trước:

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
  • Tôi có thể thử lại vào ngày mai (sau khi tạo bản sao lưu).
  • Không có Wifi / IP sau khi cập nhật (nhưng wlan0 hiển thị ifconfig)

    • đặt quốc gia wifi với sudp raspi-config(4> I4)
  • Không cần phải bật i2s-mmapcũng không i2s, hifiberry-daclớp phủ thực hiện điều này tự động và mmap có sẵn hoàn toàn kể từ ngày 4.9 (tháng 4 năm 2017).


Xem https://github.com/raspberrypi/linux/issues/2212 về vấn đề chính xác này và một số chi tiết trình điều khiển I2S


Tài nguyên:


Vâng, để gỡ lỗi lặp, bạn chắc chắn nên biên dịch chéo kernel. Bummer mà biên dịch lại đã phá vỡ WiFi. Chuyển từ 4.9.41+ sang 4.9.61+ không phải là một thay đổi lớn vì vậy tôi đoán hạt nhân / mô-đun không được kiểm tra tốt để biên dịch với gcc 6.3.0. Với môi trường biên dịch chéo trên Debian 9, bạn có thể thu hẹp điều đó. Đối với "kernel / cấu hình làm việc mà không làm mất các thay đổi / tệp của tôi? Thay thế các tệp kernel khỏi SD hoạt động?", Có, nhiều nhất bạn chỉ cần sao lưu /boot/kernel.img, /boot/*.dtb, / boot / lớp phủ / và / lib / mô-đun /
jdonald

@jdonald Cảm ơn, tôi đã không từ bỏ hoàn toàn, mặc dù việc thiết lập Virtualbox với Lubfox vẫn chưa hiệu quả với tôi. Tôi đã không có một thiết lập linux trong một thời gian dài vì vậy đó là một nỗ lực khá lớn và tôi muốn làm những việc khác. Trên thực tế, tôi đang thực hiện những điều này ngay bây giờ (làm việc xung quanh kích thước bộ đệm được mã hóa cứng trong py-spidev). Tôi đã sao lưu thẻ của mình với Win32DiskImager nhưng sẽ thử đề xuất của bạn vào lần tới.
xử lý

1
$ (kết hợp với bộ DAC cụ thể này).
xử lý

Câu trả lời:


2

Vì vậy, một trình điều khiển cụ thể tồn tại. Nó có sẵn trong Raspbian?

Không.

(cần biên dịch?)

Vì vậy, có sẵn bằng cách chỉ định nó như một mô-đun và biên dịch lại kernel . Một cách để định cấu hình cho max98357a là chỉnh sửa sound/soc/bcm/Kconfigthêm dòng:

select SND_SOC_MAX98357A

ngay dưới dòng với PCM5102A, sau đó thêm CONFIG_SND_SOC_MAX98357A=mvào .configtrước khi xây dựng lại.

Tôi đã nói rằng loại chỉnh sửa trực tiếp .confignày được tán thành, nhưng hiện tại mô-đun này không xuất hiện trong menuconfig.

Khi tôi tải mô-đun qua sudo modprobe snd-soc-max98357atrên Pi Zero W của mình, nó không hiển thị bất kỳ lỗi nào trong dmesg, với giá trị của nó. Nếu điều này có thể giúp bạn tiến gần hơn đến mục tiêu của mình hoặc ít nhất loại trừ điều gì đó, vui lòng cung cấp cho bạn các tệp nhị phân được biên dịch này.

Các tệp lớp phủ là nhị phân, nhưng ... https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts

Phải, bạn có thể thử chỉnh sửa hifiberry-dac-overlay.dtsvà thay thế pcm5102a bằng max98357a. Lớp phủ cây thiết bị được tự động xây dựng lại với dtbsmục tiêu trong luồng xây dựng hạt nhân tiêu chuẩn.


Cảm ơn, tôi có trong danh sách việc cần làm của tôi, dường như có một vài sự khác biệt đối với các trình điều khiển nhưng tôi chưa xem xét thêm. Giao diện I2S hiển thị hành vi phụ thuộc vào ứng dụng, tức là mpg123 dường như mở thiết bị hai lần, gây ra các thông báo rất đáng chú ý. mplayer dường như không làm điều này và pop không phải là "cực đoan", nhưng vẫn có, chúng xảy ra thường xuyên khi mở đường truyền I2S. Tôi nhận thấy rằng đồng hồ bit bắt đầu và chạy trong một thời gian ngắn trước khi dừng và sau đó bắt đầu lại. Tôi chưa biết nếu điều này là cố ý, tôi nghĩ là không. Tuy nhiên, đây có lẽ không phải là trực tiếp ...
xử lý

... Nguyên nhân cho sự xuất hiện. Có lẽ đó là một vấn đề thời gian. Tôi sẽ kiểm tra điều đó với một bộ phân tích logic. Về trình điều khiển: Tôi đã tìm thấy một vài nơi chỉ ra cách làm việc với lớp phủ cây thiết bị, tôi sẽ thêm liên kết sau.
xử lý

Tôi đã cập nhật câu hỏi với dấu vết dao động và liên kết đến vấn đề chính xác này trên RPi Github nơi một số thông tin chi tiết về trình điều khiển đã được đưa ra, nhưng vẫn chưa có giải pháp nào (khuyến nghị là tắt IC). Thay đổi trình điều khiển thiết bị có thể không giúp ích, có vẻ như trình điều khiển I2S có liên quan.
xử lý

2

Bạn phải thử một RPi mạnh hơn. Sự pha trộn giữa CPU lõi đơn Zero W và Linux tạo ra một hệ thống mà trong một số trường hợp không đáp ứng được. Một "tạm dừng" của một vài mili giây trong thời điểm sai là một vết nứt hoặc pop.

Thực tế là một bộ đệm lớn hơn đã giúp phần nào là một triệu chứng quan trọng. Vì vậy, có lẽ, không thể giải quyết vấn đề của bạn.


2
Sự cố do xử lý không theo thời gian thực có vẻ hợp lý. @handle có sự khác biệt nào trong hành vi khi bạn chạy mplayer / mpc với nice -20? Nếu các lệnh này sinh ra các quy trình con, bạn có thể phải xem xét toprenicecác tiến trình con. Đó là cách tiếp cận phần mềm để kiểm tra lời giải thích của @ nicolap8. Cách tiếp cận phần cứng, tùy thuộc vào độ khó của việc xây dựng lại thiết lập của bạn, là thử nghiệm với Pi 3.
jdonald

Thật không may, tôi không có quyền truy cập vào một mô hình với CPU tốt hơn để so sánh. Sự gián đoạn ngắn của đồng hồ I2S dường như không phải là nguyên nhân cơ bản vì nó luôn ở đó, ngay cả khi bắt đầu phát lại không gây ra tiếng "pop" đáng chú ý. @jdonald Tôi cũng sẽ kiểm tra các thông số đó, nhưng có khả năng chỉ vào thứ sáu.
xử lý

Không có sự khác biệt đáng chú ý ..
xử lý

0

Nếu tôi thực sự hiểu chính xác câu hỏi của bạn: điều này sẽ giúp bạn: Nếu không tôi sẽ xóa nó:

Điều này là do đầu ra PWM của CPU BCM2835 đang được sử dụng, chứ không phải là một bộ chuẩn DAC. Khi chức năng PWM được kích hoạt, sẽ có một bước nhảy trong điện áp> dẫn đến âm thanh bật ra.

Cho đến khi có sửa đổi trình điều khiển, công việc được đề xuất (ngoài việc sử dụng đầu ra âm thanh HDMI hoặc thẻ âm thanh USB bên ngoài) là chạy PulseAudio trên ALSA và giữ cho trình điều khiển hoạt động ngay cả khi không có âm thanh phát ra. Điều này đạt được bằng cách vô hiệu hóa mô-đun PulseAudio tạm dừng mô-đun, sau đó định cấu hình các ứng dụng để sử dụng PulseAudio thay vì ALSA. Daniel Bader mô tả công việc này và cách định cấu hình MPD, trong một bài đăng trên blog. Tuy nhiên, khi tôi thử phương pháp này, công việc xung quanh không hoạt động.

Khi bật chế độ tạm dừng mô-đun, có âm thanh bật lên nhưng khi chế độ tạm dừng mô-đun bị tắt, không có âm thanh phát ra. Tôi đã nghiên cứu điều này, chủ yếu là mặc dù bản ghi gỡ lỗi trong / var / log / message do PulseAudio tạo ra sau khi khởi động nó với pulseaudio --start --log-target = syslog --log-level = 4. Tôi cũng phải thỉnh thoảng nhìn vào nguồn.

Vấn đề hóa ra là do các tệp âm thanh tôi đang phát là đơn âm với tốc độ lấy mẫu là 16.000 Hz hoặc 48.000 Hz và định dạng đầu vào âm thanh mặc định cho trình điều khiển ALSA là âm thanh nổi (với tốc độ lấy mẫu 48.000 Hz). Khi âm thanh đang được phát, PulseAudio phải thay đổi định dạng đầu vào cho phù hợp, ngay cả khi thay đổi duy nhất là âm thanh nổi thành đơn âm. Thay đổi định dạng này liên quan đến việc thiết lập lại trình điều khiển và do đó gây ra một cửa sổ bật lên vì nó bị vô hiệu hóa và được kích hoạt lại ngay cả khi mô-đun tạm dừng không hoạt động đã không treo trình điều khiển. Khi phát lại âm thanh kết thúc, định dạng âm thanh gốc sẽ được khôi phục, dẫn đến bật nhạc.

Điều tồi tệ hơn là nếu tắt chế độ tạm dừng mô-đun, không có đầu ra âm thanh. Khi PulseAudio chuyển định dạng, trình điều khiển bị treo nhưng không bao giờ tiếp tục. Có một số ý kiến ​​trong nguồn PulseAudio cho thấy rằng việc tạm dừng mô-đun được cho là có sẵn và chịu trách nhiệm nối lại trình điều khiển khi thay đổi định dạng. Do đó, cách khắc phục để bật, tắt tính năng tạm dừng mô-đun, không phù hợp khi định dạng đầu vào âm thanh không phải là âm thanh nổi ở 48.000 Hz.

Thay vì vô hiệu hóa mô-đun tạm dừng khi không hoạt động, công việc xung quanh tôi đã thực hiện là đặt thời gian chờ rất lâu. Điều này được thực hiện bằng cách nối thêm thời gian chờ = 604800 vào dòng bắt đầu bằng mô-đun tải-mô-đun-đình chỉ-idle trong /etc/pulse/default.pa. Bây giờ, khi có sự thay đổi định dạng, trình điều khiển vẫn được tiếp tục nhưng trình điều khiển sẽ không bị đình chỉ cho đến một tuần (604.800 giây) sau khi âm thanh cuối cùng được phát.

Làm điều này, chúng tôi sẽ không xuất hiện giữa các bản nhạc khi tất cả chúng đều là âm thanh nổi ở 48.000 Hz và ít nhất các định dạng đầu vào âm thanh khác phát lại. Tuy nhiên, điều này không khắc phục được sự thay đổi định dạng. Để giải quyết vấn đề này, tôi đã chuyển đổi âm thanh thành âm thanh nổi 48.000 Hz trước khi gửi nó đến PulseAudio. Một chương trình có thể làm điều này là mplayer. Ví dụ: để phát lại tệp âm thanh bằng PulseAudio:

mplayer -ao xung -af kênh = 2, resample = 48000: 1 FILENAME

Các kênh = 2 chuyển đổi đơn âm thành âm thanh nổi và mẫu lại = 48000: 1 chuyển đổi tốc độ lấy mẫu thành 48.000 Hz. Các trang web mplayer cho chi tiết hơn. Các tùy chọn này cũng có thể được kết hợp với các ứng dụng khác của mplayer, ví dụ như một chương trình đầu ra âm thanh cho chương trình tổng hợp giọng nói Festival, bằng cách thêm đoạn sau vào ~ / .fansionrc của bạn:

(Tham số )

Nguồn


1
Mặc dù nguồn trích dẫn của bạn (tôi đã thêm định dạng phù hợp) có thông tin thú vị, bạn đã bỏ qua rằng câu hỏi của tôi là về một thiết bị I2S, có trong tiêu đề và câu đầu tiên, do đó, PWM không phải là vấn đề. Nếu đúng như vậy, qoute của bạn bỏ qua rằng nó đã được sửa:Update (2013-03-07): According to a comment on the Raspberry Pi bug tracker, this problem has now been fixed.
xử lý

1
Tuy nhiên, tôi sẽ thử thêm hiệu ứng của cài đặt tốc độ mẫu vào ngày mai (các thử nghiệm ban đầu với việc điều chỉnh ALSA theo tỷ lệ mẫu của tệp nguồn không giải quyết được vấn đề). Xin đừng xóa câu trả lời của bạn, nó có thể hữu ích cho người khác.
xử lý

xin lỗi tôi sẽ tiếp tục tìm kiếm
User98764431

Nếu không có câu trả lời nào khác, ít nhất tôi có thể nhận được tiền thưởng đầy đủ không?
Người dùng98764431

0

Trong khi gặp sự cố khi chụp một vấn đề I2S khác, tôi đã gặp phải vấn đề này. Trên thực tế, nó có tác dụng hàng đầu với việc mở và đóng thiết bị.

Có một tùy chọn cho âm thanh "Tự động ngủ". Bạn sẽ muốn tắt nó đi, điều đó có nghĩa là thiết bị âm thanh sẽ được mở bằng cách sử dụng nhiều năng lượng hơn, nhưng không bật


Cảm ơn sự nhiệt tình của bạn! Bạn có thể giải thích rõ hơn về "một vấn đề", "tham khảo", "một lựa chọn" - nếu không tôi không có cách nào để biết (và cố gắng) những gì bạn đang đề cập đến ... Bạn có thể giải quyết vấn đề của mình không?
xử lý
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.