WASAPI
Windows Audio Session API、通称 WASAPI(ワサピ)はアプリ-オーディオデバイス間のストリームを管理する低レベルWin32 APIである[1]。Core Audio APIsの1つ。
概要
編集オーディオを扱うアプリケーションはマイク・スピーカー等の"オーディオエンドポイントデバイス"と連携して機能する。デバイスはOSによって管理されており、これらデバイスとアプリケーションを繋ぐオーディオストリームの管理がWASAPIの役割である。
例えばスピーカー出力を行うためにはWASAPIを用いて"エンドポイントバッファ"へ音声データを書きこめばよい[2]。APIコールを受けたOSはAudioEngineによるミキシング、デバイスドライバを介したスピーカー制御をおこない、実際にスピーカーから音声が出力される。
WASAPIは基本的にどのようなサウンドデバイスでも利用することができるが、使用するアプリケーションがWASAPIに対応している必要がある。
動作モード
編集排他モード(exclusive)
編集OS標準のミキサーや各種エフェクト(APO)処理を一切介さずにエンドポイントバッファ上のオーディオサンプルをアプリケーションが直接読み書きできる構造となっている。
共有モード
編集他のアプリケーションの出力と共にOS標準のミキサーや各種エフェクト(APO)を介して再生されるため、複数の音声再生・録音アプリケーションを同時に使用する場合に適している。
利用
編集WASAPIはWin32 APIすなわちOSに対するシステムコールである。Windows OSはAudioclient.h
とAudiopolicy.h
で定義されるWASAPIインターフェースを介してOSのオーディオストリーム管理を公開することで[3]、アプリケーションによる低レイテンシの音声入出力を可能にしている。アプリケーションはWASAPIを呼び出すことでI/Oストリームを利用できる。
WASAPIの利用ではまずストリームの準備を次のようにおこなう。
- クライアント初期化 -
IAudioClient::Initialize
- サービス(read/write/etc)の選択 -
IAudioClient::GetService
- ストリームの開始 -
IAudioClient::Start
オーディオI/Oの場合、開始に引き続いて、必要に応じてパケット単位のread/writeを次のようにおこなう。
- read待ち/write済みバッファ長確認 -
IAudioClient::GetCurrentPadding
[4][5] - パケットバッファ取得/ロック -
IAudioCaptureClient::GetBuffer
/IAudioRenderClient::GetBuffer
- read/write - 取得したアドレスへのread/write
- 解放/送出 -
IAudioCaptureClient::ReleaseBuffer
/IAudioRenderClient::ReleaseBuffer
このように、WASAPIはクライアントとエンドポイントバッファ間のデータ転送を簡潔に記述できる。高レベルAPIと異なりバッファ取得を明示的に都度おこなうため、read/writeされるデータ量や転送頻度の調整を柔軟にプログラムできる。また初期化時の設定により排他モード/共有モード、バッファ全長、デバイス動作周期など、Windows OSが提供するストリーム管理の様々な側面を調整できる。
対応ソフトウェア
編集以下はWASAPI対応ソフトウェアの一例である。
DTMソフトウェア
編集波形編集ソフトウェア
編集メディアプレーヤー
編集- Media Player Classic
- foobar2000 (バージョン1.6から共有モードでの出力が既定。バージョン1.6.7からコンポーネントを必要とせず単体での排他モードでの出力に対応[6])
- Music Center for PC
- x-アプリ
- AIMP
- KbMedia Player
- PowerDVD(PowerDVD 14シリーズ以降より対応)
- MusicBee
- XMPlay(WASAPI output plugin の追加が必要)
歴史
編集Core Audio APIの一部としてMicrosoft Windows Vistaにて導入された。それ以降も機能が追加されている(例: IAudioClient3)。
脚注
編集- ^ "The Windows Audio Session API (WASAPI) enables client applications to manage the flow of audio data between the application and an audio endpoint device." Windows Developer. About WASAPI.
- ^ "To play an audio stream through a rendering endpoint device, an application periodically writes audio data to a rendering endpoint buffer. The audio engine mixes the streams from the various applications." Windows Developer. About WASAPI.
- ^ "Header files Audioclient.h and Audiopolicy.h define the WASAPI interfaces." About WASAPI. Windows App Development.
- ^ "the client can call the IAudioClient::GetCurrentPadding method to get the total amount of captured data that is available in the buffer." Capturing a Stream. Windows App Development.
- ^ "For a rendering buffer, the padding value that is reported by the IAudioClient::GetCurrentPadding method represents the amount of rendering data that is queued up to play in the buffer." Rendering a Stream. Windows App Development.
- ^ “foobar2000: Change Log”. 2022年7月15日閲覧。