Mengeluarkan audio ke beberapa perangkat suara secara bersamaan

10

Saya ingin RasPi saya mengirim audio ke port audio out board saya, dan juga ke kartu Digital out saya (I2S Hifiberry Digi). Ini seharusnya dimungkinkan dengan ALSA. Saya memiliki driver yang dimuat dan dapat mengirim ke kedua perangkat suara secara terpisah, tetapi menggabungkannya tidak berfungsi. Ada beberapa pos di luar sana yang menjelaskan cara melakukan ini, tetapi konfigurasi saya tidak bisa berfungsi.

Kesalahan dari aplay:

Playing WAVE 'sin1000_48khz.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM not usable
aplay: set_params:1059: Broken configuration for this PCM: no configurations available

Output dari "aplay -l"

**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Output dari "aplay -L"

null
   Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=sndrpihifiberry
    snd_rpi_hifiberry_digi,
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device`

Isi dari /etc/asound.conf

pcm.both {
    type route
    slave.pcm {
        type multi    
        slaves.a.pcm "hw:0,0"
        slaves.b.pcm "hw:1,0"
        slaves.a.channels 2
        slaves.b.channels 2

        bindings.0.slave a
        bindings.0.channel 0    
        bindings.1.slave a
        bindings.1.channel 1

        bindings.2.slave b
        bindings.2.channel 0
        bindings.3.slave b
        bindings.3.channel 1
    }

    ttable.0.0 1
    ttable.1.1 1

    ttable.0.2 1
    ttable.1.3 1
}

ctl.both {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.hifiberry {
    type hw    
    card sndrpihifiberry
    device 0
}

ctl.hifiberry {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.audioout {
    type hw
    card ALSA
    device 0
}

ctl.audioout {
    type hw
    card ALSA
    device 0
}

pcm.!default {
    type plug
    slave {
        pcm both
    }
}

#pcm.!default {    
#    type hw
#    card sndrpihifiberry
#    device 0
#}

ctl.!default {
    type hw
    card sndrpihifiberry
    device 0
}
Christi
sumber
Saya pikir Anda harus melihat ke pulseaudio. Tapi saya mungkin salah di sini
Gerben
3
Saya telah melihat ke pulseaudio. Pengalaman saya adalah bahwa pada dasarnya itu tidak berhasil.
Christi
Setelah penyelidikan lebih lanjut (dan upaya kedua dengan pulseaudio), saya pikir masalahnya adalah bahwa fitur semacam ini memerlukan akses bersama ke memori kartu suara dan / atau dukungan mmap. Driver RasPi I2S tidak mendukung ini. Saya tidak dapat benar-benar mengkonfirmasi hal ini, karena tidak ada informasi debug yang sangat berguna baik dari ALSA atau PulseAudio - secara umum, semuanya berfungsi sampai Anda mencoba melibatkan beberapa sumber suara. Saya tidak yakin apakah ini akan diperbaiki di kernel RasPi atau tidak, tetapi mencoba untuk memperbaikinya akan membutuhkan waktu lebih lama daripada yang saya ingin investasikan.
Christi
Saya hanya dapat menyarankan mencoba agar pulseaudio berfungsi , karena ia mampu melakukan persis apa yang ingin Anda lakukan (termasuk memperluas ke kartu suara lain di jaringan).
earthmeLon
Seperti yang saya sebutkan di atas, saya memang membuat Pulseaudio bekerja. Ini berfungsi dengan baik pada setiap perangkat individu, dan kemudian gagal ketika Anda mencoba untuk membuat aliran ke beberapa output sekaligus. Saya percaya kurangnya pemetaan memori pada driver RasPi I2S untuk menjadi pelakunya, tetapi debugging lebih lanjut pada dasarnya akan melibatkan mempelajari struktur internal ALSA dan / atau Pulseaudio, yang saya tidak punya waktu atau kecenderungan untuk melakukannya.
Christi

Jawaban:

1

Agak gila tapi apakah Anda sudah mempertimbangkan teeperintahnya? Baca lebih lanjut tentang StackExchange di tee re-direction dan lihat artical Wiki untuk lebih banyak contoh. Saya berpikir bahwa jika Anda memiliki perintah yang menampilkan nama file atau tautan ke konten media, lsmungkin, dan gunakan teeuntuk memanggil perintah ke pemutar media pilihan Anda. Begini cara saya menulis tentang masalah ...


#!/bin/bash
MediaPlayer="$1"
MediaOptions1="$2"
MediaOptions2="$3"
InputParcer="ls $4"
${InputParcer} | tee >(${MediaPlayer} ${MediaOptions1}) >(${MediaPlayer} ${MediaOptions2}) || echo 'Exiting baddly'

Catatan:

Kode di atas mungkin sulit dikodekan untuk memiliki opsi tertentu untuk setiap fork out-put dan InputParcervariabel harus diedit jika Anda berencana mengirimkan direktori atau tautan web yang berisi lebih dari satu file media. Tetapi satu file pada satu waktu ini akan menghasilkan keduanya jika MediaOptions1/2 dikodekan atau disetel pada setiap proses. Agak gila, Anda sudah diperingatkan.

... setelah pengujian dan semacamnya saya kemungkinan akan melemparkan if [ ${#} < 4]; then echo "error"; fidekat bagian atas; mengedit 4untuk berapa banyak argumen yang saya rasakan perlu ada di sana. Berjalan sebagaimana adanya, bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'pastikan untuk memodifikasi untuk sistem Anda opsi dan jalur file yang ingin Anda jalankan; hal-hal di antara <>.

Masalah dengan penggunaannya teeadalah bahwa hal itu tidak terlalu mudah dibawa di antara rasa Linux dan itu dapat menyebabkan masalah dengan audio yang tidak diputar secara sinkron antara output. Sebaliknya saya akan menyarankan menggunakan omxplayer -o bothuntuk mengeluarkan suara ke dua perangkat yang terpisah, tetapi karena ini hanya diuji pada RPi yang memiliki HDMI & Audio out terpasang, tidak cukup pengaturan yang digunakan oleh OP dan OP meminta sesuatu untuk alsa.

Ada juga blog yang bagus tentang masalah konfigurasi kartu multi-kartu alsa multi-suara yang mungkin ingin Anda lihat; mungkin Anda mengalami kesalahan pada kode Anda yang akan membuat kode saya di atas memblokir titik diperdebatkan; Catat saja bahwa panduan di sana diarahkan untuk Linux dengan rasa Slaker, bukan Raspbian.

S0AndS0
sumber