การส่งสัญญาณเสียงไปยังอุปกรณ์เสียงหลายเครื่องพร้อมกัน


10

ฉันต้องการให้ RasPi ของฉันส่งสัญญาณเสียงไปยังพอร์ตสัญญาณเสียงออกของบอร์ดและไปยังการ์ด Digital out ของฉัน (I2S Hifiberry Digi) สิ่งนี้ควรจะเป็นไปได้ด้วย ALSA ฉันโหลดไดรเวอร์แล้วและสามารถส่งไปยังอุปกรณ์เสียงทั้งสองแบบแยกกัน แต่การรวมเข้าด้วยกันไม่ทำงาน มีหลายโพสต์ที่อธิบายถึงวิธีการทำเช่นนี้ แต่ฉันไม่สามารถกำหนดค่าให้ทำงานได้

ข้อผิดพลาดจาก 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

ผลลัพธ์ของ "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

ผลลัพธ์ของ "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`

เนื้อหาของ /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
}

ฉันคิดว่าคุณควรดูเป็น pulseaudio แต่ฉันอาจผิดที่นี่
Gerben

3
ฉันดูเป็น pulseaudio ประสบการณ์ของฉันคือการที่มันใช้งานไม่ได้
Christi

หลังจากการตรวจสอบเพิ่มเติม (และความพยายามครั้งที่สองกับ pulseaudio) ฉันคิดว่าปัญหาคือคุณลักษณะนี้ต้องการการเข้าถึงหน่วยความจำการ์ดเสียงและ / หรือการสนับสนุน mmap ที่ใช้ร่วมกัน ไดรเวอร์ RasPi I2S ไม่รองรับสิ่งนี้ ฉันไม่สามารถยืนยันสิ่งนี้ได้จริง ๆ เนื่องจากไม่มีข้อมูลการดีบักที่มีประโยชน์โดยเฉพาะอย่างยิ่งจาก ALSA หรือ PulseAudio - โดยทั่วไปทุกอย่างทำงานได้จนกว่าคุณจะพยายามดึงดูดแหล่งเสียงหลายแหล่ง ฉันไม่แน่ใจว่าสิ่งนี้จะได้รับการแก้ไขในเมล็ด RasPi หรือไม่ แต่พยายามแก้ไขมันจะใช้เวลามากกว่าที่ฉันเต็มใจลงทุน
Christi

ฉันสามารถแนะนำให้พยายามใช้ pulseaudioเท่านั้นเนื่องจากสามารถทำสิ่งที่คุณต้องการได้อย่างแน่นอน (รวมถึงการขยายไปยังการ์ดเสียงอื่น ๆ ในเครือข่าย)
earthmeLon

ดังที่ฉันได้กล่าวไปแล้วฉันได้ทำงานกับ Pulseaudio มันทำงานได้ดีบนอุปกรณ์แต่ละชิ้นและล้มเหลวเมื่อคุณพยายามสร้างกระแสข้อมูลไปยังเอาต์พุตหลายรายการพร้อมกัน ฉันเชื่อว่าการขาดการแม็พหน่วยความจำในไดรเวอร์ RasPi I2S เป็นตัวการ แต่การดีบักเพิ่มเติมจะเกี่ยวข้องกับการเรียนรู้โครงสร้างภายในของ ALSA และ / หรือ Pulseaudio ซึ่งฉันไม่มีเวลาหรือชอบทำอะไร
Christi

คำตอบ:


1

มันค่อนข้างแฮ็คแต่คุณได้พิจารณาteeคำสั่งแล้วหรือยัง? อ่านเพิ่มเติมเกี่ยวกับ StackExchangeเกี่ยวกับทิศทางใหม่และดูตัวอย่างของ Wikiสำหรับตัวอย่างเพิ่มเติม ฉันคิดว่าถ้าคุณมีคำสั่งที่ส่งออกชื่อไฟล์หรือลิงค์ไปยังเนื้อหาสื่อlsบางทีและใช้teeในการโทรคำสั่งไปยังเครื่องเล่นสื่อที่คุณต้องการ นี่คือวิธีที่ฉันจะสคริปต์แก้ไขปัญหา ...


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

หมายเหตุ:

ข้างต้นอาจเป็นรหัสยากที่จะมีตัวเลือกที่แน่นอนสำหรับการตีออกแต่ละครั้งและInputParcerตัวแปรควรได้รับการแก้ไขหากคุณวางแผนที่จะส่งไดเรกทอรีหรือเว็บลิงค์ที่มีไฟล์สื่อมากกว่าหนึ่งไฟล์ แต่หนึ่งไฟล์ในเวลานี้ควรจะส่งออกไปทั้งสองถ้าMediaOptions1/2 เป็นรหัสยากหรือตั้งค่าในการทำงานแต่ละครั้ง มันค่อนข้างแฮ็คคุณได้รับการเตือนแล้ว

... หลังจากการทดสอบและฉันก็น่าจะโยนเข้าไปif [ ${#} < 4]; then echo "error"; fiใกล้ด้านบน; การแก้ไข4จำนวนข้อโต้แย้งที่ฉันรู้สึกว่าจำเป็นต้องมี ทำงานตามที่มันจะต้องbash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'ให้แน่ใจว่าได้ปรับเปลี่ยนระบบและตัวเลือกไฟล์ที่คุณต้องการเรียกใช้สำหรับระบบของคุณ <>สิ่งที่ระหว่าง

ปัญหาเกี่ยวกับการใช้งานteeคือมันไม่สามารถพกพาได้ระหว่างรสชาติของ Linux และอาจทำให้เกิดปัญหากับเสียงที่ไม่ได้เล่นอยู่ในการซิงค์ระหว่างเอาต์พุต แต่ผมขอแนะนำให้ใช้omxplayer -o bothสำหรับการแสดงผลเสียงให้กับอุปกรณ์ทั้งสองแยกจากกัน แต่เช่นนี้มีเพียงการทดสอบบน RPI ที่มี HDMI และเสียงออกมาเสียบไม่มากการตั้งค่าที่ใช้โดย OP และ OP alsaบางสิ่งบางอย่างที่ร้องขอสำหรับ

นอกจากนี้ยังมีบล็อกที่ดีในเรื่องของการตั้งค่าผู้ใช้หลายอัลซาการ์ดเสียงหลายคุณอาจต้องการที่จะมองผ่าน; บางทีคุณอาจมีข้อผิดพลาดในของคุณที่จะทำให้รหัสข้างต้นของฉันบล็อกจุดที่สงสัย; เพียงแค่ทราบว่าคำแนะนำที่มีการมุ่งสู่ Slaker Linux ปรุงแต่งไม่ใช่ Raspbian

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.