الرئيسية
» PC Tips
»
أنشئ برنامجًا نصيًا لتبديل إخراج PipeWire يقوم بنقل الصوت النشط
أنشئ برنامجًا نصيًا لتبديل إخراج PipeWire يقوم بنقل الصوت النشط
لتشغيل مفتاح تبديل صوتي بسيط في نظام دبيان، استخدم pactlخادم PulseAudio المتوافق مع PipeWire. يقوم البرنامج النصي أدناه بالتبديل بين مخرجين صوتيين مُسميين، وتعيين المخرج الافتراضي الجديد، ونقل مسارات التشغيل المفتوحة بالفعل. استبدل أسماء مخرجات العينات بالأسماء الظاهرة على جهازك.
1. تأكد من خادم PipeWire Pulse وابحث عن مخرجاتك
يُوفّر مُكوّن PipeWire pipewire-pulseخادمًا مُتوافقًا مع PulseAudio، ما يسمح للأدوات القياسية مثله pactlبالتحكّم في مُخرجات الصوت (المخرجات الصوتية). حدّد الخادم الذي يتصل به عميلك، واعرض قائمة بالمخرجات المُتاحة.
pactl info | grep -E 'Server Name|Server Version'
pactl list short sinks
في هذه العملية، يجب أن يتضمن اسم الخادم كلمة PipeWire. تحتوي قائمة المخرجات على أسماء رمزية مثل alsa_output.pci-0000_00_1f.3.analog-stereo. انسخ اسمين بدقة: اسم لكل مخرج ترغب في التبديل بينه. هذه الأسماء خاصة بالأجهزة المتصلة وملف تعريف الصوت؛ لا تنسخ أسماء من المثال أو تستخدم فهرس مخرجات رقمي، فقد يتغير أثناء الجلسة.
إذا pactlكان الملف مفقودًا، توفره دبيان pulseaudio-utils. ثبّت حزمة العميل هذه فقط عند الحاجة. إذا pactl infoتعذّر الاتصال أو أبلغ عن خادم صوت مختلف، فتأكد أولًا من تشغيل بديل PulseAudio الخاص بـ PipeWire في جلسة المستخدم الخاصة بك؛ لا تقم بتثبيت خوادم الصوت أو تغييرها بشكل عشوائي.
انسخ أسماء الوجهات الرمزية الدقيقة من قائمة الإخراج المباشر قبل ملء نص التبديل.
2. أنشئ برنامج التبديل
أنشئ مجلدًا للبرامج النصية لكل مستخدم وافتح ملفًا جديدًا:
ألصق هذا النص البرمجي، مع استبدال القيمتين في 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"
يتحقق البرنامج النصي من وجود كلا المخرجين قبل إجراء أي تغييرات. يختار المخرج المُهيأ الآخر عندما يكون الافتراضي الحالي هو `<default>` SINK_A؛ أما إذا كان الافتراضي الحالي هو مخرج آخر، فيبدأ بـ `<default>` SINK_A. set-default-sinkيؤثر الأمر على التدفقات الجديدة، بينما تستخدم الحلقة ` move-sink-input<default>` لتوجيه تدفقات التشغيل الحالية أيضًا. إذا كنت ترغب فقط في أن تستخدم التطبيقات المستقبلية الافتراضي الجديد، فاحذف الحلقة while؛ وستبقى التدفقات قيد التشغيل في مكانها. شغّل هذا البرنامج النصي بنفس مستخدم سطح المكتب المُسجّل دخوله والذي يملك جلسة PipeWire. لا تستخدم `<default>` ، حيث يمكنه الاتصال من خلال وقت تشغيل مستخدم مختلف ويفشل في التحكم في صوت سطح المكتب. هذه العمليات موثقة في دليل pactlsudo الخاص بنظام Debian .
قم بتعيين كل متغير إلى أحد أسماء الوجهات التي أبلغ عنها pactl في جلسة Debian هذه.
3. احفظ المفتاح، وشغّله، وتحقق منه
احفظ الملف في محرر Nano باستخدام الأمر ` Ctrl+Ocd`، ثم اضغط على مفتاح الإدخال Enter، ثم اخرج باستخدام الأمر `cd` Ctrl+X. حدد الملف النصي كملف تنفيذي وقم بتشغيله.
ينبغي أن يطبع المخرج الافتراضي الجديد. تحقق من المخرج الافتراضي الحالي للخادم وأي تدفقات تشغيل نشطة:
pactl get-default-sink
pactl list short sink-inputs
شغّل البرنامج النصي مرة ثانية للعودة إلى الوضع السابق. وللتحقق من الصوت عمليًا، شغّل مقطعًا صوتيًا قصيرًا أثناء التبديل وتأكد من أنه صادر من الجهاز المحدد. تختلف أسماء الأجهزة وسلوك العرض باختلاف نوع الجهاز وحالة اتصال البلوتوث وملفات تعريف الصوت النشطة.
يُبلغ البرنامج النصي عن اسم المخرجات التي أصبحت هي المخرجات الافتراضية الجديدة.تأكد من وجهة الإخراج الافتراضية وتحقق من توجيه دفق نشط إلى المخرج المحدد.
عندما لا يقوم البرنامج النصي بتغيير الصوت
"لم يتم العثور على نقطة التجميع": أعد التشغيل pactl list short sinks. قد يكون فصل سماعة الرأس أو تغيير الملف الشخصي قد أدى إلى تغيير اسم نقطة التجميع؛ قم بتحديث المتغير المطابق.
تعذر الاتصال: تأكد من تشغيل خدمات مستخدم PipeWire، وأن هذه الخدمات pactl infoتحدد خادم PipeWire Pulse. توفر حزمة pipewire-pulse في دبيان هذا الخادم البديل، بينما تتضمن حزمة pulseaudio-utilspactl العميل.
تتحرك ملفات الصوت الجديدة ولكن التطبيق الحالي لا يتحرك: أعد تشغيل البرنامج النصي أثناء ظهور هذا التدفق pactl list short sink-inputs. بعض التطبيقات تعيد فتح التدفقات أو تحتفظ بتحديد الجهاز الخاص بها، لذا اختر "افتراضي" في ذلك التطبيق إذا ظل مثبتًا على مخرج.
توضح وثائق بروتوكول Pulse الخاصة بـ PipeWire سبب قدرة عملاء سطر الأوامر PulseAudio على التحكم في PipeWire عندما pipewire-pulseيكون الخادم نشطًا. يستخدم هذا البرنامج النصي طبقة التوافق هذه؛ فهو لا يُهيئ ملفات تعريف الأجهزة ولا يضمن توفر جهاز غير متصل.