WASAPI

**Windows Audio Session API**（ウィンドウズ・オーディオ・セッション・エーピーアイ）、通称 **WASAPI**（ワサピ）はアプリ-オーディオデバイス間のストリームを管理する低レベルWin32 APIである。Core Audio APIsの1つ。

## 概要
オーディオを扱うアプリケーションはマイク・スピーカー等の"オーディオエンドポイントデバイス"と連携して機能する。デバイスはOSによって管理されており、これらデバイスとアプリケーションを繋ぐオーディオストリームの管理がWASAPIの役割である。

例えばスピーカー出力を行うためにはWASAPIを用いて"エンドポイントバッファ"へ音声データを書きこめばよい。APIコールを受けたOSはAudioEngineによるミキシング、デバイスドライバを介したスピーカー制御をおこない、実際にスピーカーから音声が出力される。

WASAPIは基本的にどのようなサウンドデバイスでも利用することができるが、使用するアプリケーションがWASAPIに対応している必要がある。

## 動作モード
### 排他モード（exclusive）
OS標準のミキサーや各種エフェクト（APO）処理を一切介さずにエンドポイントバッファ上のオーディオサンプルをアプリケーションが直接読み書きできる構造となっている。

### 共有モード
他のアプリケーションの出力と共にOS標準のミキサーや各種エフェクト（APO）を介して再生されるため、複数の音声再生・録音アプリケーションを同時に使用する場合に適している。

## 利用
WASAPIはWin32 APIすなわちOSに対するシステムコールである。Windows OSは`[https://learn.microsoft.com/ja-jp/windows/win32/api/audioclient/ Audioclient.h]`と`[https://learn.microsoft.com/ja-jp/windows/win32/api/audiopolicy/ Audiopolicy.h]` で定義されるWASAPIインターフェースを介してOSのオーディオストリーム管理を公開することで、アプリケーションによる低レイテンシの音声入出力を可能にしている。アプリケーションはWASAPIを呼び出すことでI/Oストリームを利用できる。

WASAPIの利用ではまずストリームの準備を次のようにおこなう。

* クライアント初期化 - `[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient-initialize IAudioClient::Initialize]`
* サービス（read/write/etc）の選択 - `[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient-getservice IAudioClient::GetService]`
* ストリームの開始 - `[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient-start IAudioClient::Start]`

オーディオI/Oの場合、開始に引き続いて、必要に応じてパケット単位のread/writeを次のようにおこなう。

* read待ち/write済みバッファ長確認 - `[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient-getcurrentpadding IAudioClient::GetCurrentPadding]`
* パケットバッファ取得/ロック - `[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudiocaptureclient-getbuffer IAudioCaptureClient::GetBuffer]`/`[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudiorenderclient-getbuffer IAudioRenderClient::GetBuffer]`
* read/write - 取得したアドレスへのread/write
* 解放/送出 - `[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudiocaptureclient-releasebuffer IAudioCaptureClient::ReleaseBuffer]`/`[https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudiorenderclient-releasebuffer IAudioRenderClient::ReleaseBuffer]`

このように、WASAPIはクライアントとエンドポイントバッファ間のデータ転送を簡潔に記述できる。高レベルAPIと異なりバッファ取得を明示的に都度おこなうため、read/writeされるデータ量や転送頻度の調整を柔軟にプログラムできる。また初期化時の設定により排他モード/共有モード、バッファ全長、デバイス動作周期など、Windows OSが提供するストリーム管理の様々な側面を調整できる。

## 対応ソフトウェア
以下はWASAPI対応ソフトウェアの一例である。

### DTMソフトウェア
*Steinberg Cubase 5
*Cakewalk SONAR8.5
### 波形編集ソフトウェア
* Audacity
### メディアプレーヤー
*Media Player Classic
*foobar2000 （バージョン1.6から共有モードでの出力が既定。バージョン1.6.7からコンポーネントを必要とせず単体での排他モードでの出力に対応）
*Music Center for PC
*x-アプリ
*AIMP
*KbMedia Player
*PowerDVD（PowerDVD 14シリーズ以降より対応）
*MusicBee
*XMPlay（WASAPI output plugin の追加が必要）
*AudioGate

## 歴史
Core Audio APIの一部としてMicrosoft Windows Vistaにて導入されたのが初出。それ以降も機能が追加されている（例: IAudioClient3）。

## 脚注


## 関連項目
* Windows Multimedia Extensions（MME）
* DirectSound
* Sound Manager
* Core Audio (Windows)
* レイテンシ
* Virtual Studio Technology, VST
* ASIO

## 外部リンク
* MSDN
** About WASAPI (Windows)
* 楽しいハック講座 (4) Windows7 オーディオアーキテクチャの概要