ALSA的脈衝仿真。
該程序提供了脈衝API的替代部分實現。它由一個加載程序腳本和許多具有與原始pulseaudio相同名稱的共享庫組成,因此應用程序可以動態加載它們並認為它們正在與Pulseaudio交談。在內部,沒有使用單獨的聲音混合守護程序。取而代之的是,Apulse依靠ALSA的dmix , dsnoop和plug插件來處理多個聲源,並同時捕獲流程。 dmix插件Muxes多個播放流; dsnoop插件允許多個應用程序從單個麥克風捕獲; plug插件可以在各種樣本格式,樣本率和頻道編號之間透明地轉換音頻。十多年來,ALSA隨附這些插件,默認情況下配置了這些插件。
apulse並非被設計為脈搏的倒數替換。這是毫無意義的,因為這將僅僅是對原始pulseaudio的重新實現,具有相同的客戶端架構,這是完整功能集所需的。相反,僅實施對特定應用程序至關重要的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目錄,並在此處構建。如上所示,只需運行以root make install即可安裝。但是您將無法卸載安裝的文件。這就是為什麼建議將文件包裝到軟件包中的原因。使用checkinstall或其他替代方案。
如果您想要64位機器上的32位二進製文件(例如,對於Skype),請使用:
$ mkdir build && cd build
$ CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
最近的GLIB版本使用i386和amd64的不同.pc文件。要幫助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 ..
有一種方法可以通過APULSEPATH Cmake變量進行配置安裝APULSE庫。例如,如果要將庫安裝到默認路徑/usr/lib中,請使用
cmake -DAPULSEPATH=/usr/lib -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
如果將庫安裝到常規庫路徑上,則不需要通過apulse包裝器運行應用程序。
$ apulse <program-name> [program-parameters]
環境變量APULSE_CAPTURE_DEVICE和APULSE_PLAYBACK_DEVICE可用於配置捕獲和播放設備。嘗試hw:0,0 , plughw:0,0等。有關設備名稱的完整列表,請參閱《 ALSA用戶指南》。
默認情況下, apulse的庫被安裝到一個單獨的目錄中,以便將其隱藏在所有應用程序中。
支持Pulseaudio和ALSA的野外大多數應用程序,嘗試自動使用哪種聲音系統。首先,應用程序嘗試從脈沖開始。如果沒有脈衝守護程序正在運行或可以啟動,則原始客戶庫會儘早失敗。然後他們切換到ALSA。一開始就做出一次決定。它可以與Pulseaudio一起使用,但不適用於apulse 。後者沒有守護程序,它很高興地說一切都很好,並且能夠播放音頻。然後,應用程序試圖調用更多功能,並最終觸摸未完成的零件,通常會發生崩潰。因此,只有在通過apulse包裝器腳本調用程序時,庫是隱藏的,並且才能看到。
可以將Apulse庫安裝到/usr/lib 。不需要包裝器腳本,但是儘管可以使用ALSA,但所有應用程序都將嘗試使用pulseaudio api。
Elf可執行格式的RPATH屬性,用於指定搜索動態庫的路徑。就像ld_library_path變量一樣,但可以執行。由於apulse Launcher腳本所做的所有功能都是在啟動應用程序之前設置LD_Library_Path值,因此可以烘烤路徑以將apulse庫置於目標可執行文件中。因此,像往常一樣啟動它,而無需輔助腳本。
例如,對於Firefox,它將是:
# patchelf --set-rpath /usr/lib/apulse /usr/lib/firefox/libxul.so
由於某種原因,如果設置了/usr/lib/firefox/firefox本身,則無效,因此需要一些實驗才能使其正常工作。
未實施大部分脈衝API。有些功能無能為力並返回一些仲裁值。通常,如果應用程序試圖調用未實施的東西,則在試圖放置無效指針時會崩潰。默認情況下,跟踪級別設置為0 ,這意味著沒有向標準輸出打印任何消息。可以將該值增加到1 ,該值顯示未完成的函數調用或2顯示所有功能調用。
要更改級別,請在調用cmake時WITH_TRACE參數一起使用。類似cmake -DWITH_TRACE=1 ..
用跟踪級別1構建APULSE不會解決問題,但至少將有助於確定是否沒有實現功能引起崩潰。
Apulse充當通用的ALSA客戶端。它試圖打開音頻設備,有時會失敗。 Apulse既不進行音頻混合也不進行重新採樣。取而代之的是,它依賴plug , dmix和dsnoop ALSA插件,這些插件默認情況下通常啟用。這些插件處理多個音頻源,進行重新採樣和透明混合。多年來,ALSA隨附了這些插件。音頻只是在沒有配置任何內容的情況下工作。但是並非每個人都使用默認設置。
在自定義配置上,Apulse可能無法輸出和/或捕獲音頻。根本沒有聲音,或者只是一次播放一次音頻流。還可能無法處理多個捕獲流的硬件混合器的適配器(能夠播放多個流)。根據硬件,您可能仍然需要dmix或dsnoop插件。或兩者兼而有之。
換句話說,要使Apulse工作,您的設置應該能夠同時播放和捕獲多個流。
如果其他應用程序的輸出聽起來不錯,那麼您可能會使用限製本身的應用程序。
例如,Firefox現在有一個沙盒,可以阻止文件訪問。它具有預定的允許路徑列表,但默認情況下不包含ALSA設備。幸運的是,可以手動添加這些路徑。將“/dev/snd/”添加到“ security.sandbox.content.write_path_whitelist”參數in about:config 。請注意,需要“/dev/snd/”中的拖延斜線。
Firefox 58(夜間)將其沙箱擰緊了一點。現在,也禁止使用ioctl()調用,但ALSA庫使用。這會導致沙箱違規,隨後的過程終止。可以通過設置參數security.sandbox.content.syscall_whitelist in about:config添加異常。該字段接受逗號分開的系統呼叫號碼列表。將16添加為X86-64,為X86或ARM的54 。
Firefox 60將其內容沙箱更加詳盡,但同時將音頻訪問從內容過程移至主過程。從Firefox 60開始,不需要更改沙盒設置。
源代碼根據MIT許可證的條款分發。請參閱許可證。
/3rdparty/pulseaudio-headers包含Pulseaudio項目的一部分,並根據LGPLV2.1+項分佈。有關詳細信息,請參見文件的內容。