สำหรับการสลับเสียงใน Debian ขนาดเล็ก ให้ใช้pactlผ่านเซิร์ฟเวอร์ที่เข้ากันได้กับ PulseAudio ของ PipeWire สคริปต์ด้านล่างจะสลับระหว่างเอาต์พุตสองตัวที่มีชื่อ ตั้งค่าเริ่มต้นใหม่ และย้ายสตรีมการเล่นที่เปิดอยู่แล้ว แทนที่ชื่อ sink ตัวอย่างด้วยชื่อที่แสดงบนเครื่องของคุณอย่างถูกต้อง
1. ยืนยันเซิร์ฟเวอร์ PipeWire Pulse และค้นหาเอาต์พุตของคุณ
คอมponent ของ PipeWire pipewire-pulseมีเซิร์ฟเวอร์ที่เข้ากันได้กับ PulseAudio ดังนั้นเครื่องมือมาตรฐานต่างๆ เช่นpactlสามารถควบคุม sinks (เอาต์พุตเสียง) ได้ ตรวจสอบว่าไคลเอ็นต์ของคุณเชื่อมต่อกับเซิร์ฟเวอร์ใด และแสดงรายการ sinks ที่ใช้งานได้:
pactl info | grep -E 'Server Name|Server Version'
pactl list short sinks
สำหรับขั้นตอนนี้ ชื่อเซิร์ฟเวอร์ควรระบุ PipeWire รายการ Sink ประกอบด้วยชื่อเชิงสัญลักษณ์ เช่นalsa_output.pci-0000_00_1f.3.analog-stereoคัดลอกชื่อสองชื่อให้เหมือนกันทุกประการ: ชื่อหนึ่งสำหรับแต่ละเอาต์พุตที่คุณต้องการสลับใช้งาน ชื่อเหล่านี้เป็นชื่อเฉพาะสำหรับฮาร์ดแวร์ที่เชื่อมต่อและโปรไฟล์เสียง อย่าคัดลอกชื่อจากตัวอย่างหรือใช้ดัชนี Sink ที่เป็นตัวเลข ซึ่งอาจเปลี่ยนแปลงได้ระหว่างเซสชัน
หากpactlไม่มีไฟล์ดังกล่าว Debian จะจัดเตรียมไว้ให้ในpulseaudio-utils. ติดตั้งแพ็กเกจไคลเอ็นต์นั้นเฉพาะเมื่อจำเป็นเท่านั้น หากpactl infoไม่สามารถเชื่อมต่อได้หรือรายงานว่าใช้เซิร์ฟเวอร์เสียงอื่น ให้ตรวจสอบก่อนว่าโปรแกรม PulseAudio ที่ใช้แทน PipeWire กำลังทำงานอยู่ในเซสชันผู้ใช้ของคุณหรือไม่ อย่าติดตั้งหรือเปลี่ยนเซิร์ฟเวอร์เสียงโดยไม่ตรวจสอบให้ดีก่อน
คัดลอกชื่อซิงค์เชิงสัญลักษณ์ที่ถูกต้องจากรายการเอาต์พุตแบบเรียลไทม์ก่อนที่จะกรอกสคริปต์สลับสถานะ
2. สร้างสคริปต์สลับการทำงาน
สร้างไดเร็กทอรีสคริปต์สำหรับผู้ใช้แต่ละราย และเปิดไฟล์ใหม่:
mkdir -p ~/.local/bin
nano ~/.local/bin/toggle-audio-output
วางสคริปต์นี้ลงไป โดยแทนที่ค่าทั้งสองในSINK_AและSINK_Bด้วยชื่อที่คุณคัดลอกมา:
#!/usr/bin/env bash
set -euo pipefail
SINK_A='alsa_output.pci-0000_00_1f.3.analog-stereo'
SINK_B='alsa_output.usb-Generic_Headset-00.analog-stereo'
command -v pactl >/dev/null || { echo "pactl is missing" >&2; exit 1; }
server_name=$(pactl info | sed -n 's/^Server Name: //p')
case "$server_name" in
*PipeWire*) ;;
*) echo "pactl is not connected to PipeWire's Pulse server" >&2; exit 1 ;;
esac
sinks=$(pactl list short sinks | awk '{print $2}')
for sink in "$SINK_A" "$SINK_B"; do
if ! grep -Fqx -- "$sink" <<< "$sinks"; then
printf 'Sink not found: %s\n' "$sink" >&2
exit 1
fi
done
current=$(pactl get-default-sink)
if [[ "$current" == "$SINK_A" ]]; then
target=$SINK_B
else
target=$SINK_A
fi
pactl set-default-sink "$target"
while IFS= read -r input_id; do
[[ -n "$input_id" ]] || continue
pactl move-sink-input "$input_id" "$target"
done < <(pactl list short sink-inputs | awk '{print $1}')
printf 'Default output: %s\n' "$target"
สคริปต์จะตรวจสอบว่ามีเอาต์พุตทั้งสองอยู่ก่อนที่จะเปลี่ยนแปลงใดๆ หากค่าเริ่มต้นปัจจุบันเป็น `false` สคริปต์จะเลือกเอาต์พุตที่กำหนดค่าไว้ตัวอื่น แต่SINK_Aถ้าค่าเริ่มต้นปัจจุบันเป็น sink อื่น สคริปต์จะเริ่มต้นด้วย ` SINK_Afalse` set-default-sinkคำสั่ง `false` จะมีผลกับสตรีมใหม่ ในขณะที่ลูปจะใช้ `false` move-sink-inputเพื่อกำหนดเส้นทางสตรีมการเล่นที่มีอยู่ด้วย หากคุณต้องการให้แอปในอนาคตใช้ค่าเริ่มต้นใหม่เท่านั้น ให้ลบwhileลูปออก สตรีมที่กำลังเล่นอยู่จะยังคงอยู่ที่เดิม เรียกใช้สคริปต์นี้โดยใช้ผู้ใช้เดสก์ท็อปที่ล็อกอินอยู่คนเดียวกับที่เป็นเจ้าของเซสชัน PipeWire อย่าใช้ `pipeWire.js` ซึ่งสามารถเชื่อมต่อผ่านรันไทม์ของผู้ใช้ที่แตกต่างกันและไม่สามารถควบคุมเสียงเดสก์ท็อปของคุณได้ การดำเนินการเหล่านี้มีเอกสารอยู่ใน คู่มือ pactl sudoของDebian
กำหนดค่าตัวแปรแต่ละตัวให้เป็นชื่อ sink ชื่อใดชื่อหนึ่งที่ pactl รายงานในเซสชัน Debian นี้
3. บันทึก เรียกใช้งาน และตรวจสอบสวิตช์
บันทึกใน Nano ด้วยคำสั่ง `npm install` จากนั้นCtrl+Oกด Enter Enterแล้วออกจากCtrl+XNano ด้วยคำสั่ง `npm start` ทำเครื่องหมายสคริปต์ให้เป็นไฟล์ปฏิบัติการแล้วเรียกใช้:
chmod +x ~/.local/bin/toggle-audio-output
~/.local/bin/toggle-audio-output
ควรแสดง sink เริ่มต้นใหม่ ตรวจสอบ sink เริ่มต้นปัจจุบันของเซิร์ฟเวอร์และสตรีมการเล่นที่ใช้งานอยู่:
pactl get-default-sink
pactl list short sink-inputs
เรียกใช้สคริปต์อีกครั้งเพื่อสลับกลับ สำหรับการตรวจสอบด้วยการฟัง ให้เล่นตัวอย่างเสียงสั้นๆ ขณะสลับ และยืนยันว่าเสียงมาจากอุปกรณ์ที่เลือก ชื่ออุปกรณ์และลักษณะการแสดงผลจะแตกต่างกันไปตามฮาร์ดแวร์ สถานะการเชื่อมต่อบลูทูธ และโปรไฟล์เสียงที่ใช้งานอยู่
สคริปต์จะรายงานว่าชื่อเอาต์พุตใดกลายเป็นค่าเริ่มต้นใหม่
ยืนยันปลายทางเริ่มต้น (default sink) และตรวจสอบว่ามีการส่งสตรีมที่ใช้งานอยู่ไปยังเอาต์พุตที่เลือกไว้แล้ว
เมื่อสคริปต์ไม่สลับเสียง
“ไม่พบอุปกรณ์รับสัญญาณ”: ลองpactl list short sinksใหม่อีกครั้ง ชุดหูฟังที่ถอดออกหรือโปรไฟล์ที่เปลี่ยนแปลงอาจทำให้ชื่ออุปกรณ์รับสัญญาณเปลี่ยนไป โปรดอัปเดตตัวแปรให้ตรงกัน
ไม่สามารถเชื่อมต่อได้: ตรวจสอบว่าบริการผู้ใช้ PipeWire ทำงานอยู่และpactl infoระบุเซิร์ฟเวอร์ PipeWire Pulse ได้ อย่างถูกต้อง แพ็คเกจ pipewire-pulse ของ Debian มีเซิร์ฟเวอร์ทดแทนให้ ในขณะที่pulseaudio-utils มีpactlไคลเอ็นต์ ให้
ไฟล์เสียงใหม่จะเคลื่อนที่ แต่แอปปัจจุบันจะไม่เคลื่อนที่: ให้เรียกใช้สคริปต์อีกครั้งในขณะที่สตรีมนั้นยังปรากฏอยู่pactl list short sink-inputsบางแอปพลิเคชันจะเปิดสตรีมใหม่หรือคงการเลือกอุปกรณ์ของตนเองไว้ ดังนั้นให้เลือก “ค่าเริ่มต้น” ในแอปพลิเคชันนั้นหากยังคงตรึงไว้ที่เอาต์พุตใดเอาต์พุตหนึ่ง
เอกสาร Protocol Pulse ของ PipeWire อธิบายว่าเหตุใดไคลเอนต์บรรทัดคำสั่ง PulseAudio จึงสามารถควบคุม PipeWire ได้เมื่อpipewire-pulseเป็นเซิร์ฟเวอร์ที่ใช้งานอยู่ สคริปต์นี้ใช้เลเยอร์ความเข้ากันได้ดังกล่าว โดยไม่ได้กำหนดค่าโปรไฟล์ฮาร์ดแวร์หรือรับประกันว่าอุปกรณ์ที่ไม่ได้เชื่อมต่อจะพร้อมใช้งาน