ปัญหาการรีแมปและการรวมลำโพงสองตัวใน pulseaudio

Aug 19 2020

ฉันมีลำโพงบลูทู ธ คู่หนึ่งและลำโพงไลน์อินคู่หนึ่งที่ฉันกำลังพยายามเล่นพร้อมกัน ฉันไม่มีปัญหาในการเชื่อมต่อและเล่นออกจากอย่างใดอย่างหนึ่ง แต่การเชื่อมต่อมีปัญหามากมาย นอกจากนี้การตั้งค่าลำโพงบลูทู ธ ของฉันถูกพลิกดังนั้นฉันจึงทำการแมปใหม่ให้ตรงกับตำแหน่งที่ถูกต้อง

ฉันเห็นหลายหัวข้อที่อธิบายวิธีการพลิกลำโพงโดยใช้ pulseaudio module-remap-sinkและรวมลำโพงโดยใช้module-combine-sink. ฉันยังต้องการเพิ่มเวลาในการตอบสนองให้กับลำโพงฮาร์ดไลน์เพื่อพิจารณาความล่าช้าของบลูทู ธ ดังนั้นฉันจึงรวมmodule-null-sinkและวนแหล่งที่มาของจอภาพเข้ากับฮาร์ดไลน์เพื่อให้ได้ความล่าช้านี้ คำสั่งสี่คำสั่งของฉันแสดงอยู่ด้านล่าง

หมายเหตุ: ฉันแบ่งบรรทัดยาวที่นี่ด้วยแบ็กสแลชเพื่อวัตถุประสงค์ในการจัดรูปแบบ แต่ละคำสั่งคือหนึ่งบรรทัดในโค้ดจริง

pacmd load-module module-null-sink sink_name=delayed_speakers \
    sink_properties=device.description=DelayedSpeakers
pacmd load-module module-remap-sink sink_name=remapped_bluetooth \ 
    master=bluez_sink.EC_81_93_5A_66_BB.a2dp_sink channels=2 \
    master_channel_map=front-left,front-right channel_map=rear-right,rear-left remix=no 
pacmd load-module module-loopback latency_msec=80 source=delayed_speakers.monitor \
    sink=alsa_output.usb-Generic_USB_Audio-00.analog-stereo
pacmd load-module module-combine-sink slaves=remapped_bluetooth,delayed_speakers \ 
    sink_name=CombinedSink sink_properties=device.description=CombinedSpeakers \
    channel_map=front-left,front-right,rear-left,rear-right

ลำดับของคำสั่งนี้ใช้งานได้ดีเมื่อฉันเรียกใช้แต่ละคำสั่งทีละคำสั่งจาก bash terminal แต่ฉันต้องการตั้งค่าให้รันเมื่อบูตดังนั้นฉันจึงเขียน bash script ที่มีบรรทัดเหล่านี้ เมื่อฉันเรียกใช้สคริปต์ bash, CombinedSpeakers จมไม่โหลด การตรวจสอบนี้ผมออกความเห็นเส้นและการทดสอบแต่ละdelayed_speakersและremapped_bluetoothรายบุคคล ถ้าฉันใส่โมดูล - รีแมป - ซิงก์ก่อนโมดูลลูปแบ็คเสียงฮาร์ดไลน์จะรับเอาต์พุตจากเอาต์พุตทั้งdelayed_speakersและremapped_bluetooth(รวมถึงการรีแมปที่เหมาะสม) ถ้าฉันพลิกลำดับของบรรทัดเหล่านี้ลำโพงบลูทู ธ จะได้รับเอาต์พุตของทั้งสองบรรทัด ฉันได้ลองเพิ่มโหมดสลีปเป็นเวลา 10 วินาทีระหว่างการโหลดโมดูลแต่ละครั้ง แต่ก็ไม่สามารถแก้ไขปัญหาได้เช่นกัน ฉันรวมสคริปต์ของฉันไว้ด้านล่าง

#!/bin/bash
echo "Loading null sink";
pacmd load-module module-null-sink sink_name=delayed_speakers \
    sink_properties=device.description=DelayedSpeakers

sleep 10
echo "Loading remap sink"
pacmd load-module module-remap-sink sink_name=remapped_bluetooth \
    master=bluez_sink.EC_81_93_5A_66_BB.a2dp_sink channels=2 \
    master_channel_map=front-left,front-right channel_map=rear-right,rear-left \
    remix=no

sleep 10
echo "Loading delayed speakers loopback"
pacmd load-module module-loopback latency_msec=80 source=delayed_speakers.monitor \
    sink=alsa_output.usb-Generic_USB_Audio-00.analog-stereo

sleep 10
echo "Loading combined sink"
pacmd load-module module-combine-sink slaves=remapped_bluetooth,delayed_speakers \
    sink_name=CombinedSink sink_properties=device.description=CombinedSpeakers \
    channel_map=front-left,front-right,rear-left,rear-right

เมื่อฉันตรวจสอบบันทึกเสียงจาก pulseaudio systemctl --user status pulseaudioฉันเห็นข้อความมากกว่า 100 ข้อความpulseaudio[7998]: q overrun, queuing locallyและข้อความเดียวของ
No remapping configured, proceeding nonetheless!. หลังจากนี้ผมจะไม่สามารถดำเนินการใด ๆpactlหรือคำสั่งจนกว่าฉันจะเริ่มต้นใหม่กับpacmd PulseAudiosudo pkill -9 pulseaudio

แก้ไข: ฉันรู้ว่าฉันสามารถเพิ่มการโหลดโมดูลลงในไฟล์ default.pa ได้ แต่กรณีนี้ใช้ไม่ได้เพราะลำโพงบลูทู ธ ของฉันไม่ได้เชื่อมต่อเมื่อไฟล์ทำงานดังนั้นการโหลดโมดูลจึงล้มเหลว

คำตอบ

1 ScottDriggers Aug 28 2020 at 06:24

ฉันพบปัญหาแล้ว ปรากฎว่าความล้มเหลวไม่ได้เกิดจากการเขียนสคริปต์มันเป็นแค่เรื่องบังเอิญ ความล้มเหลวเกิดขึ้นทุกครั้งที่ฉันพยายามใช้module-remap-sinkอ่างล้างจานที่เป็นซิงก์เริ่มต้น ความล้มเหลวนี้เกิดขึ้นอย่างเงียบ ๆ และ pacmd มีอยู่ตามปกติ เฉพาะเมื่อฉันพยายามที่set-defaultจะรีแมปซิงก์ใหม่นี้หรือสร้างซิงก์รวมซึ่งรวมถึงพัลซีออดิโอไม่ตอบสนอง

วิธีแก้ไข: ใช้pacmd set-default-sink 0ก่อนใช้งานmodule-remap-sink(หรือดัชนีอื่นหากซิงก์ที่มีปัญหาคือซิงก์ 0) หากซิงก์ที่มีปัญหาเป็นซิงก์เดียวคุณสามารถสร้างซิงก์จำลองโดยใช้pacmd load-module module-null-sinkสลับไปใช้กำหนดค่าการรีแมปของคุณและสุดท้ายลบดัมมี่