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ドライバのオブジェクトを作成する

ASIO SDKでは、使用可能なドライバ名の列挙と、ドライバのロード/アンロードを行うためのクラス AsioDrivers が定義されていますので、 このクラスを利用してドライバのロード/アンロードを行います。
asioDriversは、SDKのasiodrivers.cppに実体が定義されていますので、外部参照をして利用します。

ASIOドライバ名をリストアップする

使用するオーディオドライバをユーザーが選択できるように、オーディオ出力可能なASIOドライバ名をasioDrivers::getDriverNames()を呼び出してリストアップします。


    long asioDrivers::getDriverNames( char** names, long maxDrivers )
	

引数説明
names

ASIOドライバ名を格納する32バイト文字列領域のポインタ配列へのポインタ。

maxDrivers

namesに格納可能なドライバ名の個数。

戻り値は、リストに格納したドライバ名の個数が返されます。
使用可能なASIOドライバが存在しない場合、0が返ります。



ASIOは Steinberg Media Technologies AG社の商標です。
Windowsは米国Microsoft Corporationの登録商標です。