AlsaのPulseaudioエミュレーション。
このプログラムは、Pulseaudio APIの代替部分的な実装を提供します。これは、元のPulseaudioと同じ名前のローダースクリプトと多くの共有ライブラリで構成されているため、アプリケーションは動的にロードし、Pulseaudioと話していると考えることができます。内部的には、デーモンを使用することはありません。代わりに、ApulseはALSAのdmix 、 dsnoop 、 plugプラグインに依存して、複数のサウンドソースを処理し、同時に実行されているストリームをキャプチャします。 dmixプラグインは複数の再生ストリームをマクシングします。 dsnoopプラグインでは、複数のアプリケーションが単一のマイクからキャプチャできるようにします。 plugプラグインは、さまざまなサンプル形式、サンプルレート、チャネル番号間でオーディオを透過的に変換します。現在、10年以上にわたり、ALSAにはこれらのプラグインが有効になり、デフォルトで構成されています。
apulse 、Pulseaudioのドロップイン交換になるように設計されていませんでした。それは、完全な機能セットで要求される同じクライアントダーモンアーキテクチャを使用して、オリジナルの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という名前のディレクトリが作成され、そこに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の両方をサポートする野生のほとんどのアプリケーションは、どのサウンドシステムが使用されるかをオートドテクトしようとします。まず、アプリケーションはPulseaudioから始めようとします。 Pulseaudio Daemonが実行されていない場合、または開始できない場合、元のクライアントライブラリが早期に失敗します。その後、彼らはアルサに切り替えます。最初に決定が行われます。 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
何らかの理由で、RPATが/usr/lib/firefox/firefox自体に設定されていても機能しないため、機能させるにはいくつかの実験が必要です。
Pulseaudio APIの大部分は実装されていません。何もしない関数があり、arbitraty値を返す機能があります。多くの場合、アプリケーションが実装されていないものを呼び出そうとすると、ヌルポインターを抑制しようとしている間にクラッシュします。デフォルトでは、トレースレベルは0に設定されているため、標準の出力にメッセージが印刷されていません。その値を1に増やすことができます。これは、実装されていない関数呼び出しを示す、またはすべての関数呼び出しを示す2に示す可能性があります。
レベルを変更するには、 cmakeを呼び出すときにWITH_TRACEパラメーターを使用します。 cmake -DWITH_TRACE=1 ..
トレースレベル1でapulseを構築することは問題を修正しませんが、少なくともクラッシュが実装されていない関数によって引き起こされるかどうかを識別するのに役立ちます。
Apulseは、一般的なALSAクライアントとして機能します。オーディオデバイスを開こうとし、時には失敗します。そのコアでは、Apulseはオーディオミキシングも再サンプリングも行いません。代わりに、 plug 、 dmix 、およびdsnoop ALSAプラグインに依存しています。これは通常、デフォルトで有効になります。これらのプラグインは、複数のオーディオソースを処理し、再サンプリングを実行し、透過的に混合します。何年もの間、Alsaにはこれらのプラグインが有効になっています。オーディオは何も構成せずに機能します。しかし、誰もがデフォルト設定を使用するわけではありません。
カスタム構成では、Apulseが出力やキャプチャオーディオをキャプチャできない場合があります。サウンドはまったくないか、一度に1つのオーディオストリームを再生することはできません。また、複数のストリームを再生できるハードウェアミキサーを備えたアダプターが、複数のキャプチャストリームを処理できない可能性があります。ハードウェアによっては、 dmixまたはdsnoopプラグインが必要になる場合があります。または両方。
言い換えれば、Apulseが機能するためには、セットアップは複数のストリームを同時に再生およびキャプチャできる必要があります。
他のアプリケーション出力が正常に聞こえる場合、使用しているアプリケーションがそれ自体を制限する可能性があります。
たとえば、Firefoxにはファイルアクセスをブロックするサンドボックスがあります。許可されたパスの事前定義されたリストがありますが、ALSAデバイスはデフォルトでは含まれていません。幸いなことに、それらのパスを手作業で追加することが可能です。 「/dev/snd/」を「security.sandbox.content.write_path_whitelist」に追加しますabout:config 「/dev/snd/」でのトレーリングスラッシュが必要であることに注意してください。
Firefox 58(夜間)は、サンドボックスをもう少し締めました。現在、 ioctl()呼び出しも禁止されていますが、ALSAライブラリで使用されています。これにより、後続のプロセス終了によりサンドボックス違反が発生します。 Parameter security.sandbox.content.syscall_whitelist in about:config 。そのフィールドは、システムコール番号のコンマ分離リストを受け入れます。 X86-64に16追加し、X86またはARMに54します。
Firefox 60はコンテンツのサンドボックスをさらにひれを放ちましたが、同時にコンテンツプロセスからメインプロセスにオーディオアクセスを移動しました。 Firefox 60以降、サンドボックス設定の変更は必要ありません。
ソースコードは、MITライセンスの条件の下で配布されます。全文については、ライセンスを参照してください。
/3rdparty/pulseaudio-headersにはPulseaudioプロジェクトの一部が含まれており、LGPLV2.1+条件で配布されています。詳細については、ファイルのコンテンツを参照してください。