ASIOを利用してWAVファイルを再生する
(その1)
ASIO(Audio Streaming Input Output)によるサウンド入出力の方法です。
ASIOとは、Steinberg社より提唱されるサウンド入出力の規格です。
DirectSoundのように高音質の多チャンネル対応がされています。
レイテンシーが非常に小さいのが特徴です。
また、Windows以外のOSでもサポートされています。
但し、ASIOの開発には『ASIO SDK』が別途必要になります。
ASIOを利用したサウンド出力の処理の流れを簡単に説明すると、以下のようになります。
- ASIOデバイスをオープンしてストリームバッファを作成します。
- サウンド出力を開始すると次にサウンド出力を行うバッファが空いた時点でASIOよりコールバック関数が呼ばれるので次に出力するデータを投入します。
- 出力するデータがなくなった場合、サウンド出力を終了します。
※ 本サンプルプログラムは『ASIO SDK 2.2』を参考に作成しました。
作成するサンプルプログラムは以下の仕様にします。
- ウインドウ・スタイルはダイアログにする。
- サウンドを出力するデバイスが複数ある場合、ユーザーが選択できる。
- 再生するWAVファイルは、ユーザーが選択できる。
- WAVファイルを選択後、[再生]ボタンで再生を開始する。
- WAVファイルの再生中に[一時停止]ボタンを押すと、再生を一時中断し、[再生]ボタンを押すと中断した時点から、再生を再開する。
- [停止]ボタンを押すと再生を終了し、[再生]ボタンを押すとファイルの先頭から再生を開始する。
サンプルプログラムの外観は以下のようにします。
WM_INITDIALOGメッセージを受けたときに、ダイアログの初期処理を行います。
ダイアログの初期処理では、ASIOデバイスのオブジェクトを生成し、ASIOドライバのリストの作成します。
サンプルコードを以下に示します。
/****************************************************************************/
/*!
* @brief ダイアログの初期処理.
*
* @param [in] hDlg ダイアログのウインドウ・ハンドル.
*
* @retval なし.
*/
static void OnInitDialog( HWND hDlg )
{
//! ASIOドライバのオブジェクトを作成する.
if( !asioDrivers ){
asioDrivers = new AsioDrivers();
}
//! デバイス名を格納する配列を作成する.
char* dev_list[10];
for( DWORD i = 0; i < 10; i++ ){
dev_list[i] = DevName[i];
}
//! ASIOデバイス名リストを取得する.
DevCnt = asioDrivers->getDriverNames( dev_list, 10 );
//! ASIOデバイス名リストを作成する.
HWND hItem = GetDlgItem( hDlg, IDC_OUTPUT_DEVICE );
ComboBox_ResetContent( hItem );
for( DWORD i = 0; i < DevCnt; i++ ){
ComboBox_AddString( hItem, DevName[i] );
}
ComboBox_SetCurSel( hItem, 0 );
}
ASIO SDKでは、使用可能なドライバ名の列挙と、ドライバのロード/アンロードを行うためのクラス AsioDrivers が定義されていますので、
このクラスを利用してドライバのロード/アンロードを行います。
asioDriversは、SDKのasiodrivers.cppに実体が定義されていますので、外部参照をして利用します。
使用するオーディオドライバをユーザーが選択できるように、オーディオ出力可能なASIOドライバ名をasioDrivers::getDriverNames()を呼び出してリストアップします。
long asioDrivers::getDriverNames( char** names, long maxDrivers )
引数 | 説明 |
---|---|
names |
ASIOドライバ名を格納する32バイト文字列領域のポインタ配列へのポインタ。 |
maxDrivers |
namesに格納可能なドライバ名の個数。 |
戻り値は、リストに格納したドライバ名の個数が返されます。
使用可能なASIOドライバが存在しない場合、0が返ります。