مضاهاة pulseaudio لـ ALSA.
يوفر البرنامج تنفيذًا جزئيًا بديلاً ل API Pulseaudio. إنه يتكون من برنامج نصي محمل وعدد من المكتبات المشتركة مع نفس الأسماء كما هو الحال من Pulseaudio الأصلي ، بحيث يمكن للتطبيقات تحميلها ديناميكيًا وتعتقد أنها تتحدث إلى Pulseaudio. داخليًا ، لا يتم استخدام الخفي على خلط الصوت. بدلاً من ذلك ، يعتمد Apulse على dmix من ALSA و dsnoop plug المكونات الإضافية للتعامل مع مصادر الصوت المتعددة ودفقات التقاط في نفس الوقت. dmix Plugin Muxes تدفقات تشغيل متعددة ؛ يتيح المكون الإضافي dsnoop تطبيقات متعددة للالتقاط من ميكروفون واحد ؛ plug البرنامج المساعد بتحويل الصوت بشفافية بين تنسيقات العينات المختلفة ومعدلات العينة وأرقام القنوات. لأكثر من عقد من الزمان الآن ، تأتي ALSA مع تمكين هذه المكونات الإضافية وتكوينها افتراضيًا.
لم يكن apulse مصممًا ليكون بديلاً عن Pulseaudio. إنه لا معنى له ، لأن ذلك سيكون مجرد إعادة تنفيذ Pulseaudio الأصلي ، مع نفس بنية العميل-Daemon ، المطلوبة في مجموعة الميزات الكاملة. بدلاً من ذلك ، يتم تنفيذ أجزاء من واجهة برمجة التطبيقات فقط التي تعد حاسمة لتطبيقات محددة. لهذا السبب يوجد نص محمل يدعى apulse . يقوم بتحديث قيمة LD_LIBRARY_PATH Environment المتغير أيضًا للإشارة أيضًا إلى الدليل حيث يتم تثبيت مكتبات Apulse ، مما يجعلها متاحة للتطبيق.
الاسم يأتي من أسماء كل من ALSA و Pulseaudio. نظرًا لأن aoss كانت طبقة توافق بين برامج OSS و ALSA ، فقد تم تصميم apulse لتكون طبقة توافق بين تطبيقات Pulseaudio و ALSA.
أنت بحاجة إلى مكتبات ALSA و GLIB مثبتة. على التوزيعات المستندة إلى دبيان ، فهي في حزم libasound2-dev و libglib2.0-dev .
للبناء والتثبيت ، قم بتشغيل دليل المصدر:
$ mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
سيؤدي ذلك إلى إنشاء دليل build ، وبناء هناك. من الممكن التثبيت فقط عن طريق make install root ، كما هو موضح أعلاه. لكنك لن تتمكن من إلغاء تثبيت الملفات المثبتة. لهذا السبب يوصى بلف الملفات في حزمة. استخدم checkinstall ، أو بديل.
إذا كنت تريد ثنائيات 32 بت على جهاز 64 بت (على سبيل المثال ، من أجل Skype) ، استخدم:
$ mkdir build && cd build
$ CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
تستخدم إصدارات GLIB الحديثة ملفات .pc مختلفة لـ i386 و amd64 . لمساعدة pkg-config في العثور على إصدارات 32 بت ، استخدم متغير PKG_CONFIG_PATH . لذلك ، على دبيان سيكون شيئًا مثل:
$ PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
هناك طريقة لتكوين حيث سيتم تثبيت مكتبات Apulse ، عبر متغير APULSEPATH Cmake. على سبيل المثال ، إذا كنت ترغب في تثبيت المكتبات في المسار الافتراضي ، /usr/lib ، استخدم
cmake -DAPULSEPATH=/usr/lib -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
إذا تم تثبيت المكتبات على مسار مكتبة منتظم ، فلن تحتاج إلى تشغيل تطبيقات من خلال apulse Wrapper.
$ apulse <program-name> [program-parameters]
يمكن استخدام متغيرات البيئة APULSE_CAPTURE_DEVICE و APULSE_PLAYBACK_DEVICE لتكوين أجهزة الالتقاط والتشغيل. جرب hw:0,0 ، plughw:0,0 وما شابه. ارجع إلى دليل مستخدم ALSA للحصول على قائمة كاملة بأسماء الأجهزة.
بشكل افتراضي ، يتم تثبيت المكتبات من apulse في دليل منفصل ، لإخفائها من جميع التطبيقات.
معظم التطبيقات في البرية ، التي تدعم كل من Pulseaudio و ALSA ، تحاول توسيع نطاق نظام الصوت المستخدم. أولاً ، تحاول التطبيقات البدء بـ Pulseaudio. تفشل مكتبات العملاء الأصلية مبكرًا إذا لم يتم تشغيل الخفي Pulseaudio أو يمكن بدء تشغيله. ثم يتحولون إلى ALSA. يتم اتخاذ القرار مرة واحدة ، في البداية. إنه يعمل بشكل جيد مع Pulseaudio ، لكنه لا يعمل مع apulse . الأخير ليس له شياطين ، ويقول بسعادة أن كل شيء على ما يرام ، وأنه قادر على لعب الصوت. ثم حاول التطبيقات استدعاء المزيد من الوظائف ، وفي النهاية تلمس الأجزاء غير المنفذة ، غالبًا مع حوادث. لذلك ، يتم إخفاء المكتبات ، وتصبح مرئية فقط عندما يتم استدعاء البرنامج من خلال البرنامج النصي لفائف apulse .
من الممكن تثبيت مكتبات Apulse على /usr/lib . لن تكون هناك حاجة إلى برنامج البرنامج النصي للكوف ، ولكن بعد ذلك ستحاول جميع التطبيقات استخدام Pulseaudio API ، على الرغم من أنه يمكنها استخدام ALSA.
هناك خاصية RPTH لتنسيق ELF القابل للتنفيذ ، والذي يتم استخدامه لتحديد مسارات للبحث عن المكتبات الديناميكية. إنه مثل متغير ld_library_path ، ولكن لكل تنفيذي. نظرًا لأن كل ما يفعله برنامج apulse Launcher هو ضبط قيمة LD_Library_Path قبل بدء تطبيق ما ، فمن الممكن خبز المسارات إلى المكتبات في الهدف القابل للتنفيذ نفسه. وهكذا لإطلاقه كالمعتاد ، دون نص المساعد.
على سبيل المثال ، بالنسبة لـ Firefox ، سيكون:
# patchelf --set-rpath /usr/lib/apulse /usr/lib/firefox/libxul.so
لسبب ما ، لا يعمل إذا تم تعيين RPTH لـ /usr/lib/firefox/firefox نفسها ، لذلك هناك حاجة إلى بعض التجارب لجعلها تعمل.
لا يتم تنفيذ جزء كبير من Pulseaudio API. هناك وظائف لا تفعل شيئًا وتعيد بعض القيم التعسفية. في كثير من الأحيان ، إذا حاول التطبيق استدعاء شيء لم يتم تنفيذه ، فإنه يتعطل أثناء محاولة إلغاء تحديد مؤشر فارغ. بشكل افتراضي ، يتم تعيين مستوى التتبع على 0 ، مما يعني عدم طباعة أي رسائل إلى الإخراج القياسي. من الممكن زيادة هذه القيمة إلى 1 ، مما يدل على مكالمات الوظائف غير المنقولة ، أو إلى 2 ، مما يوضح جميع مكالمات الوظائف.
لتغيير المستوى ، استخدم معلمة WITH_TRACE عند استدعاء cmake . شيء مثل cmake -DWITH_TRACE=1 ..
إن بناء apulse مع Trace Level 1 لن يصلح المشكلات ، ولكنه على الأقل سيساعد في تحديد ما إذا كانت الحوادث ناتجة عن عدم تنفيذ الوظائف.
Apulse بمثابة عميل ALSA عام. يحاول فتح جهاز الصوت ، ويفشل في بعض الأحيان. في جوهرها ، لا يقوم Apulse بخلط الصوت ولا إعادة تشكيله. بدلاً من ذلك ، يعتمد على المكونات الإضافية plug ، dmix ، و dsnoop ALSA ، والتي عادة ما يتم تمكينها افتراضيًا. تتعامل هذه المكونات الإضافية مع مصادر صوتية متعددة ، وتنفيذ إعادة أخذ عينات وخلط شفاف. لسنوات الآن ، يأتي ALSA مع تمكين تلك الإضافات. يعمل الصوت فقط دون تكوين أي شيء. ولكن لا يستخدم الجميع الإعدادات الافتراضية.
في التكوينات المخصصة ، قد تفشل apulse في إخراج و/أو التقاط الصوت. لا يمكن أن يكون هناك صوت على الإطلاق ، أو مجرد دفق صوت واحد يتم تشغيله في وقت واحد. من الممكن أيضًا أن لا تزال المحولات التي تحتوي على خلاطات للأجهزة ، والتي قادرة على تشغيل تدفقات متعددة ، غير قادرة على التعامل مع تدفقات التقاط متعددة. اعتمادًا على الأجهزة ، قد لا تزال بحاجة إلى إما مكونات dmix أو dsnoop . أو كليهما.
بمعنى آخر ، لكي يعمل Apulse ، يجب أن يكون الإعداد الخاص بك قادرًا على اللعب والتقاط تدفقات متعددة في وقت واحد.
إذا كان الإخراج الآخر يبدو على ما يرام ، فمن المحتمل أن يكون التطبيق الذي تستخدمه يقيد نفسه.
على سبيل المثال ، يحتوي Firefox الآن على صندوق رمل ، يحظر الوصول إلى الملف. لديها قائمة محددة مسبقا من المسارات المسموح بها ، ولكن لا يتم تضمين أجهزة ALSA بشكل افتراضي. لحسن الحظ ، من الممكن إضافة هذا المسار باليد. أضف "/dev/snd/" إلى "security.sandbox.content.write_path_whitelist" المعلمة في about:config . لاحظ أن SLASH المتخلف في "/dev/snd/" مطلوب.
شدد Firefox 58 (ليلا) صندوق الرمل أكثر قليلاً. الآن يتم حظر مكالمات ioctl() أيضًا ، ولكن يتم استخدامها من قبل مكتبات ALSA. الذي يسبب انتهاك صندوق الرمل مع إنهاء العملية اللاحقة. يمكن إضافة الاستثناء عن طريق تعيين Parameter security.sandbox.content.syscall_whitelist في about:config . يقبل هذا الحقل قائمة مفصولة بفاصلة من أرقام مكالمات النظام. أضف هناك 16 لـ x86-64 ، أو 54 لـ x86 أو ARM.
قام Firefox 60 بتعبئة صندوق رمل المحتوى الخاص به أكثر ، ولكن في نفس الوقت نقلت الوصول إلى الصوت من عمليات المحتوى إلى العملية الرئيسية. من Firefox 60 فصاعدًا ، لا توجد تغييرات على إعدادات صندوق الرمل ضرورية.
يتم توزيع رمز المصدر بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا. انظر الترخيص.
/3rdparty/pulseaudio-headers يحتوي على جزء من مشروع Pulseaudio ويتم توزيعه بموجب شروط LGPLV2.1+. انظر محتوى الملفات للحصول على التفاصيل.