การจำลอง Pulseaudio สำหรับ Alsa
โปรแกรมนี้ให้การใช้งานทางเลือกบางส่วนของ Pulseaudio API ประกอบด้วยสคริปต์โหลดเดอร์และไลบรารีที่ใช้ร่วมกันจำนวนหนึ่งที่มีชื่อเดียวกันกับ Pulseaudio ดั้งเดิมดังนั้นแอปพลิเคชันสามารถโหลดได้แบบไดนามิกและคิดว่าพวกเขากำลังพูดคุยกับ Pulseaudio ภายในไม่มีการใช้ daemon ผสมเสียงแยกต่างหาก Apulse ขึ้นอยู่กับ dmix , dsnoop และ plug ของ ALSA แต่ปลั๊กอินเพื่อจัดการแหล่งเสียงหลายตัวและการจับกระแสที่ทำงานในเวลาเดียวกัน ปลั๊กอิน dmix MUXES หลายสตรีมการเล่น ปลั๊กอิน dsnoop อนุญาตให้แอปพลิเคชันหลายตัวจับจากไมโครโฟนเดี่ยว และ plug ปลั๊กอินแปลงเสียงระหว่างรูปแบบตัวอย่างต่าง ๆ อัตราตัวอย่างและหมายเลขช่อง เป็นเวลากว่าทศวรรษแล้วที่ ALSA มาพร้อมกับปลั๊กอินเหล่านี้ที่เปิดใช้งานและกำหนดค่าตามค่าเริ่มต้น
apulse ไม่ได้ออกแบบมาให้แทนที่ Pulseaudio มันไม่มีจุดหมายเนื่องจากจะเป็นการปรับปรุงใหม่ของ Pulseaudio ดั้งเดิมด้วยสถาปัตยกรรมลูกค้า Daemon เดียวกันซึ่งต้องการโดยชุดคุณสมบัติที่สมบูรณ์ แต่มีเพียงส่วนหนึ่งของ API ที่มีความสำคัญต่อแอปพลิเคชันเฉพาะเท่านั้น นั่นเป็นเหตุผลว่าทำไมจึงมีสคริปต์ตัวโหลดชื่อ apulse มันอัปเดตค่าของตัวแปรสภาพแวดล้อม LD_LIBRARY_PATH ไปยังจุดไปยังไดเรกทอรีที่ติดตั้งไลบรารีของ Apulse ทำให้สามารถใช้งานได้กับแอปพลิเคชัน
ชื่อมาจากชื่อของทั้ง Alsa และ Pulseaudio เนื่องจาก aoss เป็นเลเยอร์ความเข้ากันได้ระหว่างโปรแกรม OSS และ ALSA, apulse ได้รับการออกแบบให้เป็นเลเยอร์ความเข้ากันได้ระหว่างแอปพลิเคชัน Pulseaudio และ ALSA
คุณต้องมีไลบรารี ALSA และ GLIB ที่ติดตั้ง ในการแจกแจงแบบอิงตาม Debian พวกเขาอยู่ในแพ็คเกจ 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 ดังนั้นใน Debian มันจะเป็นเช่น:
$ 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 daemon กำลังทำงานหรือสามารถเริ่มต้นได้ จากนั้นพวกเขาก็เปลี่ยนเป็น Alsa การตัดสินใจเกิดขึ้นครั้งเดียวในตอนแรก มันทำงานได้ดีกับ Pulseaudio แต่ไม่ทำงานกับ apulse หลังไม่มี daemons มันมีความสุขบอกว่าทุกอย่างเรียบร้อยดีและมันสามารถเล่นเสียงได้ แอปพลิเคชันจากนั้นพยายามโทรหาฟังก์ชั่นเพิ่มเติมและในที่สุดก็สัมผัสชิ้นส่วนที่ไม่ได้ใช้งานบ่อยครั้งด้วยการล่ม ดังนั้นห้องสมุดจะถูกซ่อนและจะปรากฏให้เห็นเฉพาะเมื่อโปรแกรมถูกเรียกผ่านสคริปต์ Wrapper apulse
เป็นไปได้ที่จะติดตั้งไลบรารี Apulse เป็น /usr/lib ไม่จำเป็นต้องใช้สคริปต์ Wrapper แต่แอปพลิเคชันทั้งหมดจะพยายามใช้ Pulseaudio API แม้ว่าพวกเขาจะสามารถใช้ ALSA ได้
มีคุณสมบัติ RPATH ของรูปแบบการปฏิบัติการ ELF ซึ่งใช้เพื่อระบุเส้นทางเพื่อค้นหาไลบรารีไดนามิก มันเหมือนกับตัวแปร LD_LIBRARY_PATH แต่ต่อการใช้งานได้ เนื่องจากสคริปต์ apulse Launcher ทั้งหมดนั้นคือการตั้งค่าค่า LD_LIBRARY_PATH ก่อนที่จะเปิดตัวแอปพลิเคชันจึงเป็นไปได้ที่จะอบพา ธ ไปยังไลบรารี Apulse เข้าสู่เป้าหมายที่เรียกใช้งานได้เอง และเพื่อเปิดตัวตามปกติโดยไม่มีสคริปต์ผู้ช่วย
ตัวอย่างเช่นสำหรับ Firefox มันจะเป็น:
# patchelf --set-rpath /usr/lib/apulse /usr/lib/firefox/libxul.so
ด้วยเหตุผลบางอย่างมันไม่ได้ผลถ้า RAPT ถูกตั้งค่าสำหรับ /usr/lib/firefox/firefox เองดังนั้นการทดลองบางอย่างจะต้องทำให้มันทำงานได้
ส่วนใหญ่ของ Pulseaudio API ไม่ได้ใช้งาน มีฟังก์ชั่นที่ไม่ทำอะไรเลยและส่งคืนค่าอนุญาโตตุลาการ บ่อยครั้งหากแอปพลิเคชันพยายามเรียกสิ่งที่ไม่ได้ใช้งานมันจะล่มขณะที่พยายามทำตัวชี้โมฆะ โดยค่าเริ่มต้นระดับการติดตามถูกตั้งค่าเป็น 0 ซึ่งหมายความว่าไม่มีข้อความถูกพิมพ์ไปยังเอาต์พุตมาตรฐาน เป็นไปได้ที่จะเพิ่มค่านั้นเป็น 1 ซึ่งแสดงการโทรฟังก์ชั่นที่ไม่ได้ใช้งานหรือ 2 ซึ่งแสดงการเรียกใช้ฟังก์ชันทั้งหมด
หากต้องการเปลี่ยนระดับให้ใช้พารามิเตอร์ WITH_TRACE เมื่อเรียก cmake บางอย่างเช่น cmake -DWITH_TRACE=1 ..
การสร้าง Apulse ด้วยการติดตามระดับ 1 จะไม่แก้ไขปัญหา แต่อย่างน้อยก็ช่วยในการระบุว่าการล่มนั้นเกิดจากฟังก์ชั่นที่ไม่ได้ใช้งาน
Apulse ทำหน้าที่เป็นไคลเอนต์ ALSA ทั่วไป มันพยายามเปิดอุปกรณ์เสียงและบางครั้งก็ล้มเหลว ที่แกนกลางของมัน Apulse ไม่ได้ผสมเสียงหรือการสุ่มตัวอย่างใหม่ แต่ต้องอาศัย plug ปลั๊กอิน dmix และ dsnoop ALSA ซึ่งมักจะเปิดใช้งานตามค่าเริ่มต้น ปลั๊กอินเหล่านี้จัดการแหล่งเสียงหลายแหล่งทำการสุ่มตัวอย่างใหม่และผสมอย่างโปร่งใส เป็นเวลาหลายปีแล้วที่ ALSA มาพร้อมกับปลั๊กอินที่เปิดใช้งาน เสียงใช้งานได้โดยไม่ต้องกำหนดค่าอะไร แต่ไม่ใช่ทุกคนที่ใช้การตั้งค่าเริ่มต้น
ในการกำหนดค่าที่กำหนดเอง Apulse อาจล้มเหลวในการส่งออกและ/หรือจับเสียง อาจไม่มีเสียงเลยหรือเพียงแค่สตรีมเสียงเดียวที่เล่นในแต่ละครั้ง นอกจากนี้ยังเป็นไปได้ว่าอะแดปเตอร์ที่มีเครื่องผสมฮาร์ดแวร์ซึ่งสามารถเล่นหลายสตรีมได้อาจยังไม่สามารถจัดการกับสตรีมการจับภาพได้หลายแบบ ขึ้นอยู่กับฮาร์ดแวร์คุณอาจต้องใช้ปลั๊กอิน dmix หรือ dsnoop หรือทั้งสองอย่าง
กล่าวอีกนัยหนึ่งเพื่อให้ Apulse ทำงานการตั้งค่าของคุณควรจะสามารถเล่นและจับภาพสตรีมหลายสายพร้อมกันได้
หากแอปพลิเคชันอื่น ๆ ส่งออกได้ดีเป็นไปได้ว่าแอปพลิเคชันที่คุณใช้การ จำกัด ตัวเอง
ตัวอย่างเช่น Firefox ตอนนี้มี Sandbox ซึ่งบล็อกการเข้าถึงไฟล์ มันมีรายการเส้นทางที่ได้รับอนุญาต แต่อุปกรณ์ ALSA ไม่รวมอยู่ในค่าเริ่มต้น โชคดีที่เป็นไปได้ที่จะเพิ่มเส้นทางเหล่านั้นด้วยมือ เพิ่ม "/dev/snd/" ถึง "security.sandbox.content.write_path_whitelist" พารามิเตอร์ about:config โปรดทราบว่าจำเป็นต้องมีการเฉือนต่อท้ายใน "/dev/snd/"
Firefox 58 (ทุกคืน) ทำให้ Sandbox แน่นขึ้นอีกเล็กน้อย ตอนนี้การโทร ioctl() ถูกห้ามด้วย แต่ใช้โดยไลบรารี ALSA นั่นทำให้เกิดการละเมิด Sandbox ด้วยการยกเลิกกระบวนการที่ตามมา สามารถเพิ่มข้อยกเว้นได้โดยการตั้งค่าพารามิเตอร์ security.sandbox.content.syscall_whitelist sandbox.content.syscall_whitelist ใน about:config ฟิลด์นั้นยอมรับรายการหมายเลขโทรของระบบที่คั่นด้วยเครื่องหมายจุลภาค เพิ่ม 16 สำหรับ x86-64 หรือ 54 สำหรับ x86 หรือแขน
Firefox 60 ได้ลดเนื้อหา Sandbox มากขึ้น แต่ในขณะเดียวกันก็ย้ายการเข้าถึงเสียงจากกระบวนการเนื้อหาไปยังกระบวนการหลัก จาก Firefox 60 เป็นต้นไปไม่จำเป็นต้องมีการเปลี่ยนแปลงการตั้งค่า Sandbox
ซอร์สโค้ดมีการแจกจ่ายภายใต้ข้อกำหนดของใบอนุญาต MIT ดู License.mit สำหรับข้อความเต็ม
/3rdparty/pulseaudio-headers มีส่วนหนึ่งของโครงการ Pulseaudio และมีการแจกจ่ายภายใต้เงื่อนไข LGPLV2.1+ ดูเนื้อหาของไฟล์สำหรับรายละเอียด