PipeWire: ناقل الصوت / الفيديو Linux

54

جرب LWN مجانًا لمدة شهر واحد: لا يلزم الدفع أو بطاقة الائتمان. قم بتنشيط اشتراكك التجريبي الآن واعرف سبب اشتراك آلاف القراء في LWN.net.

2 مارس 2021

لأكثر من عقد من الزمان ، كان PulseAudio يخدم سطح مكتب Linux باعتباره الخفي السائد لخلط الصوت وتوجيهه – وواجهة برمجة تطبيقات الصوت الخاصة به. لسوء الحظ ، لا تتناسب البنية الداخلية لـ PulseAudio مع حالة استخدام التطبيقات ذات وضع الحماية المتزايد ، على الرغم من وجود محاولات لتعديل ذلك. PipeWire ، وهو برنامج خفي جديد تم إنشاؤه (جزئيًا) من هذه المحاولات ، سيحل محل PulseAudio في إصدار Fedora 34 القادم. إنه انتقال قادم يستحق نظرة.

الحديث عن التحولات ، لم يكن تحول Fedora 8 الخاص إلى PulseAudio في أواخر عام 2007 أمرًا سلسًا. لا يزال مستخدمو Linux منذ فترة طويلة يتذكرون وجود البرنامج الخفي الذي يحمل علامة تجارية على أنه البرنامج الذي سيكسر الصوت. بعد بداية صعبة ، برز PulseAudio باعتباره الفائز في كفاح خادم الصوت في Linux. لقد وفرت واجهة برمجة تطبيقات صوتية للعميل الأصلي ، ولكنها دعمت أيضًا التطبيقات التي استخدمت واجهات برمجة التطبيقات الصوتية الشائعة في ذلك الوقت – بما في ذلك واجهة برمجة تطبيقات Linux ALSA الصوتية الأولية ، والتي تتيح عادةً لتطبيق واحد فقط الوصول إلى بطاقة الصوت. قام PulseAudio بمزج التدفقات الصوتية للتطبيقات المختلفة وتوفير نقطة مركزية لإدارة الصوت والتكوين الدقيق والتوجيه السلس إلى Bluetooth أو USB أو HDMI. لقد وضع نفسه كمكافئ لسطح مكتب Linux لمحرك الصوت في وضع المستخدم لنظام التشغيل Windows Vista و macOS CoreAudio daemon.

شقوق في PulseAudio

بحلول عام 2015 ، كان PulseAudio لا يزال يتمتع بمكانته باعتباره خفيًا فعليًا لنظام Linux الصوتي ، إلا أن التشققات بدأت في التطور. قد يكون التحول التدريجي إلى تطبيقات سطح المكتب ذات وضع الحماية قاتلاً لتصميمها: باستخدام PulseAudio ، يمكن للتطبيق التطفل على صوت التطبيقات الأخرى ، أو الوصول غير الوسيط إلى الميكروفون ، أو تحميل وحدات الخادم التي يمكن أن تتداخل مع التطبيقات الأخرى. جرت محاولات لإصلاح PulseAudio ، بشكل أساسي من خلال طبقة التحكم في الوصول والنقل المدعوم بواسطة memfd لكل عميل. كان هذا كله ضروريًا ولكنه غير كافٍ حتى الآن لعزل صوت العملاء.

في ذلك الوقت تقريبًا ، ديفيد هينينغسون ، أحد مطوري PulseAudio الأساسيين استقال من المشروع. وأشار إلى الإحباطات بشأن ضعف ملاءمة البرنامج الخفي لحالة استخدام التطبيقات ذات وضع الحماية ، واختلاطه بين الآلية والسياسة لقرارات التوجيه الصوتي. في نهاية رسالته ، تساءل عما إذا كان مزيج هذه المشاكل قد يكون آلام ولادة خفي جديد ومطلوب بشدة لينكس صوتي:

لا شيء مستحيل في البرامج ، ولكن لإعادة تصميم PulseAudio لدعم كل هذه المتطلبات بطريقة جيدة (بدلاً من “إنشاء طبقة أخرى في الأعلى” ) سيكون صعبًا جدًا ، لذا فإن رأيي أنه سيكون من الأسهل كتابة شيء جديد من الصفر.

وأعتقد أنه سيكون من الممكن كتابة شيء يأخذ أفضل ما في PulseAudio و JACK و AudioFlinger ، والحصول على شيء يعمل بشكل جيد لكل من الأجهزة المحمولة وسطح المكتب ؛ لتشغيل الصوتيات الاحترافية ، والألعاب ، وتشغيل الموسيقى منخفض الطاقة ، وما إلى ذلك. أعتقد أننا ، كمجتمع مفتوح المصدر ، يمكننا الاستفادة بشكل كبير من خادم الصوت هذا.

PulseVideo إلى Pinos

وفي الوقت نفسه ، طُلب من مبتكر GStreamer Wim Taymans العمل على خدمة Linux للتوسط في وصول متصفحات الويب إلى أجهزة الكاميرا. في البداية ، أطلق على مشروع PulseVideo. كانت الفكرة وراء الاسم بسيطة: على غرار الطريقة التي تم بها إنشاء PulseAudio للتوسط في الوصول إلى أجهزة ALSA الصوتية ، تم إنشاء PulseVideo للتوسط والوصول المتعدد إلى عقد جهاز الكاميرا Video4Linux2.

بعد ذلك بقليل ، اكتشف Taymans نموذجًا مشابهًا يسمى PulseVideo

، التي أنشأها William Manley ، وساعدت في نشر ميزات GStreamer التي يتطلبها الكود الخاص بها. لتجنب التعارض مع اسم PulseAudio ، وبسبب امتداد النطاق الذي يتجاوز مجرد الوصول إلى الكاميرا ، أعاد Taymans لاحقًا تسمية المشروع إلى Pinos – في إشارة إلى بلدته التي يقيم فيها في إسبانيا. تم بناء Pinos فوق خطوط أنابيب GStreamer ، باستخدام بعض البنية التحتية التي تم تنقيحها سابقًا لنموذج مانلي الأولي. تم استخدام D-Bus مع تمرير واصف الملف للتواصل بين العمليات. في مؤتمر GStreamer 2015 ، وصف Taymans بنية Pinos [PDF] للحضور وقدم عرضًا توضيحيًا لتطبيقات متعددة تصل إلى تغذية كاميرا النظام بشكل متوازٍ. نظرًا لما تتميز به من مرونة ، وقائمة على خطوط الأنابيب ، وواصف الملفات- بعد مرور العمارة ، دعم Pinos أيضًا بث الوسائط في الاتجاه الآخر: يمكن للتطبيقات “تحميل” دفق وسائط عن طريق تمرير واصف ملف memfd أو dma-buf. يمكن بعد ذلك معالجة دفق الوسائط وتوزيعه على التطبيقات الأخرى وأحواض الوسائط المتعددة للنظام مثل أجهزة ALSA الصوتية. بينما تتم مناقشتها فقط بشكل عابر ، فإن القدرة على إرسال التدفقات في كليهما الاتجاهات وعبر التطبيقات سمحت لـ Pinos بالعمل كناقل صوت / فيديو عام – يقوم بتوجيه الوسائط بكفاءة بين عمليات المستخدم المعزولة ، والتي من المحتمل أن تكون في وضع الحماية. يمكن أن يتداخل نطاق Pinos (إذا تم تمديده بشكل صحيح) مع PulseAudio وربما يحل محله. تم طرح سؤال صريح على Taymans

، فأجاب: “إن استبدال PulseAudio ليس بالمهمة السهلة ؛ فهو ليس على جدول الأعمال […] ولكن [Pinos] واسع جدًا ، حتى تتمكن من القيام بالمزيد لاحقًا “. نظرًا لأن أوجه القصور في PulseAudio التي تمت مناقشتها في القسم السابق أصبحت أكثر إشكالية ، “يمكن أن تفعل المزيد لاحقًا” لم يكن هدفًا بعيد المنال.

بايب واير بحلول عام 2016 ، بدأ Taymans في إعادة التفكير في أسس Pinos ، توسيع نطاقه ليصبح البرنامج الخفي القياسي للصوت / الفيديو على نظام Linux. وشمل ذلك “الكثير من المخازن المؤقتة الصغيرة” لحالة استخدام الصوت بزمن انتقال منخفض والتي تغطيها عادةً JACK. كان هناك مجالان رئيسيان يجب معالجتهما.

أولاً ، أثبت الاعتماد الشديد على عناصر GStreamer وخطوط الأنابيب في البرنامج الخفي الأساسي ومكتبات العملاء أنه يمثل مشكلة. يتمتع GStreamer بالكثير من المنطق وراء الكواليس لتحقيق مرونته. أثناء معالجة خط أنابيب GStreamer ، الذي تم إجراؤه في سياق سلاسل Pinos في الوقت الفعلي ، جاءت هذه المرونة على حساب تخصيصات الذاكرة الضمنية وإنشاء مؤشر ترابط وقفل. هذه كلها إجراءات معروفة جيدًا أنها تؤثر سلبًا على القدرة على التنبؤ اللازمة للتعليمات البرمجية في الوقت الفعلي الصعب.

لتحقيق جزء من مرونة خطوط أنابيب GStreamer بينما لا تزال مرضية بشدة متطلبات الوقت الفعلي ، أنشأ Taymans إطارًا أبسط لخط أنابيب الوسائط المتعددة وأطلق عليه اسم SPA – API Simple Plugin API [PDF]. تم تصميم إطار العمل ليتم تنفيذه بأمان من سلاسل العمليات في الوقت الفعلي (مثل سلاسل معالجة وسائط Pinos) ، بميزانية زمنية محددة لا ينبغي تجاوزها أبدًا. لا ينفذ SPA أي تخصيصات للذاكرة ؛ بدلاً من ذلك ، هذه هي المسؤولية الوحيدة لتطبيق إطار عمل SPA.

لكل عقدة مجموعة محددة جيدًا من الحالات. هناك حالة لتكوين منافذ العقدة ، والتنسيقات ، والمخازن المؤقتة – يتم إجراؤها بواسطة مؤشر الترابط الرئيسي (غير الحقيقي) ، وحالة للمضيف لتخصيص جميع المخازن المؤقتة اللازمة للعقدة بعد تكوينها ، وحالة منفصلة حيث تتم المعالجة الفعلية في خيوط الوقت الحقيقي. أثناء التدفق ، إذا تغيرت حالة أي من عُقد خط أنابيب الوسائط (على سبيل المثال بسبب حدث ما) ، يمكن إخطار خيوط الوقت الفعلي بحيث يتم تبديل التحكم مرة أخرى إلى الخيط الرئيسي لإعادة التكوين.

ثانيًا ، تم استبدال D-Bus كبروتوكول IPC. بدلاً من ذلك ، تم تطبيق بروتوكول أصلي غير متزامن بالكامل مستوحى من Wayland – بدون جزء تسلسل XML – عبر مآخذ مجال Unix. أراد Taymans بروتوكولًا بسيطًا وآمنًا في الوقت الفعلي.

بحلول الوقت الذي تم فيه دمج إطار عمل SPA وبروتوكول IPC أصلي تم تطوير المشروع ، وقد تجاوز غرضه الأصلي منذ فترة طويلة: من D-Bus الخفي لمشاركة الوصول إلى الكاميرا إلى ناقل صوت / فيديو كامل قادر في الوقت الفعلي. وبالتالي تمت إعادة تسميته مرة أخرى إلى PipeWire – مما يعكس مكانته الجديدة كمحرك بارز قائم على خطوط الأنابيب لمشاركة الوسائط المتعددة ومعالجتها.

الدروس المستفادة

منذ البداية ، طبق مطورو PipeWire عنصرًا أساسيًا مجموعة من الدروس المستمدة من البرامج الصوتية الموجودة مثل JACK و PulseAudio و Chromium OS Audio Server (CRAS). على عكس التقسيم المتعمد لـ PulseAudio لمشهد صوت Linux إلى مستوى المستهلك مقابل صوت حقيقي في الوقت الحقيقي ، تم تصميم PipeWire من البداية للتعامل مع كليهما. لتجنب قيود وضع الحماية PulseAudio ، تم توفير الأمان: يتم إرفاق حقل بت أذونات لكل عميل بكل عقدة PipeWire – حيث يتم تغليف عقد SPA واحد أو أكثر. سمح هذا التصميم المدرك للأمان بالتكامل السهل والآمن مع بوابات Flatpak ؛ تمت ترقية واجهة أذونات التطبيقات ذات وضع الحماية الآن إلى معيار XDG المجاني لسطح المكتب. مثل CRAS و PulseAudio ، ولكن على عكس JACK ، يستخدم PipeWire مؤقتًا- جدولة الصوت على أساس. يتم استخدام مؤقت قابل لإعادة التكوين ديناميكيًا لجدولة التنبيهات لملء المخزن المؤقت للصوت بدلاً من الاعتماد على معدل ثابت لمقاطعات بطاقة الصوت. إلى جانب مزايا توفير الطاقة ، يتيح ذلك لبرنامج الصوت توفير زمن انتقال ديناميكي: أعلى لتوفير الطاقة وصوت من فئة المستهلك مثل تشغيل الموسيقى ؛ منخفض لأعباء العمل الحساسة لزمن الوصول مثل الصوت الاحترافي. على غرار CRAS ، ولكن على عكس PulseAudio ، لم يتم تصميم PipeWire على الجزء العلوي من إعادة لف المخزن الصوتي. عند استخدام جدولة الصوت القائمة على المؤقت مع المخازن المؤقتة الضخمة (كما في PulseAudio) ، يلزم دعم إعادة كتابة المخزن المؤقت لبطاقة الصوت لتوفير استجابة بزمن انتقال منخفض للأحداث غير المتوقعة مثل دفق صوتي جديد أو تغيير حجم تيار. يجب إبطال المخزن المؤقت الكبير الذي تم إرساله بالفعل إلى جهاز الصوت ويجب إرسال مخزن مؤقت جديد. وقد أدى ذلك إلى تعقيد كبير في التعليمات البرمجية وحالات جانبية [PDF]. يحد كل من PipeWire و CRAS من الحد الأقصى للكمون / التخزين المؤقت إلى قيم أقل بكثير – وبالتالي يلغي الحاجة إلى إعادة لف المخزن المؤقت تمامًا. مثل JACK ، اختار PipeWire إعداد مدير جلسة خارجية. عادةً ما يقوم مستخدمو الصوت المحترفون ببناء خطوط الأنابيب الصوتية الخاصة بهم في تطبيق مدير الجلسة مثل Catia أو QjackCtl ، ثم دع البرنامج الخفي الصوتي ينفذ النتيجة النهائية. هذا له فائدة من فصل السياسة (كيفية بناء خط أنابيب الوسائط) عن الآلية (كيف ينفذ البرنامج الخفي الصوتي خط الأنابيب). في GUADEC 2018 ، طلب المطورون صراحةً من Taymans

السماح لـ GNOME ، وربما الشياطين الخارجية الأخرى ، بالتحكم في هذا الجزء من مكدس الصوت. واجه العديد من شركات تكامل الأنظمة مشاكل بالفعل لأن PulseAudio يدمج قرارات سياسة التوجيه الصوتي بعمق داخل كود الوحدات الداخلية الخاص به. كانت هذه أيضًا واحدة من نقاط الألم المذكورة في البريد الإلكتروني الخاص باستقالة هينينغسون. أخيرًا ، باتباع اتجاه شياطين النظام المتعددة المؤثرة التي تم إنشاؤها في في العقد الماضي ، استخدمت PipeWire على نطاق واسع واجهات برمجة تطبيقات Linux-kernel-only. يتضمن ذلك memfd و eventfd و timerfd و signalfd و epoll و dma-buf – وكلها تجعل “واصف الملف” المعرف الأساسي للأحداث والمخازن المؤقتة المشتركة في النظام. كان دعم PipeWire لاستيراد واصفات ملفات dma-buf عاملاً أساسيًا في التنفيذ التوجيه الفعال لالتقاط وتسجيل شاشة Wayland. بالنسبة إلى الشاشات الكبيرة بدقة 4K و 8K ، لا تحتاج وحدة المعالجة المركزية إلى لمس أي من مخازن GPU المؤقتة الضخمة: فغمغم GNOME (أو التطبيقات المماثلة) يمرر واصف dma-buf الذي يمكن بعد ذلك دمجه في خطوط أنابيب SPA في PipeWire لمزيد من المعالجة والتقاط.

تبني

تم الإعلان عن استقرار واجهة برمجة تطبيقات PipeWire الأصلية منذ بدء المشروع الإصدار 0.3 الرئيسي. يتم دعم تطبيقات ALSA الخام الحالية من خلال المكوّن الإضافي PipeWire ALSA. يتم دعم تطبيقات JACK من خلال إعادة تنفيذ مكتبات عميل JACK و pw-jack أداة إذا تم تثبيت كل من المكتبات الأصلية ومكتبات PipeWire JACK بالتوازي. يتم دعم تطبيقات PulseAudio من خلال [PipeWirepipeline] pipewire-pulse الشيطان الذي يستمع إلى مقبس PulseAudio الخاص وينفذ بروتوكول الاتصال الأصلي الخاص به. بهذه الطريقة ، لا تزال تطبيقات سطح المكتب المعبأة في حاويات والتي تستخدم نسختها الخاصة من مكتبات عملاء PulseAudio الأصلية مدعومة. WebRTC ، إطار عمل الاتصال (والرمز) المستخدم من قبل جميع المتصفحات الرئيسية ، يتضمن دعم PipeWire الأصلي لمشاركة شاشة Wayland – بوساطة من خلال بوابة Flatpak.

يوضح الرسم البياني أدناه خط أنابيب وسائط PipeWire ، تم إنشاؤه باستخدام pw-dot ثم تم تجميله قليلاً على نظام Arch Linux. يتم عرض مجموعة من تطبيقات PipeWire-native و PulseAudio-native:

[PipeWirepipeline]

 

على اليسار ، تم إنشاء كل من جبنة جنوم ومثيل خط أنابيب GStreamer باستخدام gst-launch-1.0 يقومون بالوصول إلى نفس تغذية الكاميرا بالتوازي. في المنتصف ، يشارك Firefox شاشة النظام (لاجتماع جيتسي) باستخدام بوابتي WebRTC و Flatpak. على اليمين ، يقوم مشغل الموسيقى Spotify (تطبيق PulseAudio) بتشغيل الصوت ، والذي يتم توجيهه إلى حوض ALSA الافتراضي للنظام - مع إعدادات جنوم (تطبيق PulseAudio آخر) يراقب حالة القناة اليسرى / اليمنى لهذا الحوض.

على جانب توزيعات Linux من الأشياء ، كان Fedora يقوم بشحن برنامج PipeWire الخفي (فقط لالتقاط شاشة Wayland) منذ إصداره Fedora 27. تقدم دبيان حزم PipeWire ، لكن استبدال PulseAudio أو JACK يعد “حالة استخدام غير مدعومة.” يوفر Arch Linux PipeWire في مستودعه المركزي ويقدم رسميًا حزمًا إضافية لاستبدال كل من PulseAudio و JACK ، إذا رغبت في ذلك. وبالمثل ، يوفر Gentoo وثائق موسعة لاستبدال كلا الشياطين. سيكون إصدار Fedora 34 القادم هو أول توزيعة Linux ستحل فيها PipeWire بالكامل محل PulseAudio افتراضيًا وخارجه.

بشكل عام ، هذه فترة حرجة في مشهد الوسائط المتعددة في Linux. في حين أن المصادر المفتوحة هي قصة عن التكنولوجيا ، فهي أيضًا قصة عن الأشخاص الذين يعملون بجد لإنشائها. كان هناك اتفاق ملحوظ من مطوري PulseAudio و JACK على أن PipeWire ومؤلفها يسيران على المسار الصحيح. يجب أن يوفر إصدار Fedora 34 القادم اختبارًا عبادًا لاعتماد توزيعات Linux من PipeWire للمضي قدمًا.


هل أعجبك هذا المقال؟ يرجى قبول عرض الاشتراك التجريبي الخاص بنا ليكون قادر على رؤية المزيد من المحتوى مثله والمشاركة في المناقشة.

(تسجيل الدخول لإضافة التعليقات)