PortAudioでリアルタイム入出力制御 (1)

PortAudioを用いてリアルタイム入出力制御を行う

 

~環境構築編~

 

■必要なもの*1

Windows7 32bit 

Visual Studio 2008 Express (Visual C++ 2008)*2

DirectX SDK(June 2010)

ASIO SDK v2.3

PortAudio SDK v19

 

 

Visual Studio 2008 Express (Visual C++ 2008) インストール時の注意

VS2010, VS2008, VS2005のランタイムライブラリが入っているとインストールに失敗することがある

→アンインストールしてからVS2008をインストール

VS2010など後継ソフトが入っていると(略

→アンインストールしてからVS2008をインストール

エラー1935(VS2005Runtimeを入れていると出ることがある)

→1) Windowsの[スタート]で[プログラムとファイルの検索]にfeatures」とタイプ入力

 2) (1)の検索結果から[Windowsの機能の有効化または無効化]を選択

 3)[Windowsの機能]ダイアログボックスで、

  「Microsoft .NET Framework 3.5.1」の項目内にある、

  「Windows Communication Foundation HTTP Activation」をチェック

 

DirectX SDK(June 2010)のインストール

http://www.microsoft.com/en-us/download/details.aspx?id=6812

特に問題はないはず*3

 

■ASIO SDK v2.3

http://blog.livedoor.jp/sce_info3-craft/archives/7590862.html

いろいろ登録とかしないとダウンロードできない

でも無料なのでそのくらいの手間は惜しむべきではない

 

■PortAudio v19 から DLLをビルドする方法

基本的にここの情報に従う

http://portaudio.com/docs/v19-doxydocs/compile_windows.html

以下コメント

 1)  Windows用PortAudio は DirectX SDK(June 2010) の「dsound.h」「dsconf.h」「Dsound.lib」あたりが必要らしい

  

VC++2008を開いて、ツール→オプション→プロジェクトおよびソリューション

VC++ディレクトリ

ディレクトリを表示するプロジェクトでインクルードファイルを選択

DirectX SDKのIncludeフォルダとPortAudioのIncludeフォルダを追加

例:「C:\Program Files\Microsoft DirectX SDK (June 2010)\Include」

例:「C:\Users\(*ユーザー名*)\Documents\Visual Studio 2008\Projects\pa_stable_v19_20111121\portaudio\include」

 

ディレクトリを表示するプロジェクトでライブラリファイルを選択

DirectX SDKのLibフォルダを追加

例:「C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x64」※なぜかx64で動いた(未検討)

2)  ASIOSDK2.3からASIOSDKにリネーム src\hostapi\asio にコピー

3)  VS6, 7, 2001, 2003, VC.NET では無いので省略

4)  Visual C + + 2008 Express で build\msvc\portaudio.sln を開く

  コードが変換される

  多少警告が出るようだが変換が出来ればOK

5)  ソリューション(Portaudio)のプロパティを開き、構成プロパティを選択

6)  構成(C):[すべての構成]に、プラットフォーム(P):[Win32]にしておく(すべてのプラットフォームがあるならそれ)

7)  オプションを設定

  C/C++ -> 最適化 -> フレームポインタなし=はい(/Oy)

  C/C++ -> コード生成 -> ランタイムライブラリ=マルチスレッド (/MT)

  C/C++ -> コード生成 -> 浮動小数点モデル=Fast (/fp:fast)

  C/C++ -> コード生成 -> 構造体メンバのアライメント -> 既定値(※MATLABの資料には 4 バイト (/Zp4)にしろと書いてあるがそうしたら動かなくなった)

8)  構成(C):[Release]に変更

  C/C++ -> プリプロセッサ

  PA_ENABLE_DEBUG_OUTPUT を削除(コンソールがデバッグメッセージを出力しなくなる)

9)  構成(C):[Release]

  C/C++ -> プリプロセッサ

  以下のようにASIOとWASAPIのみ使用するように変更

  PA_USE_ASIO=1

  PA_USE_DS=0

  PA_USE_WMME=0

  PA_USE_WASAPI=1

  PA_USE_WDMKS=0

10) Release, Win32 で ビルド

  portaudio_x86.dll/lib が build\msvc\Win32\Release に作成される

 

例:「C:\Users\(*ユーザー名*)\Documents\Visual Studio 2008\Projects\pa_stable_v19_20111121\portaudio\build\msvc\Win32\Release」

 

■portaudio_x86.dllを使用してサンプルを動かす

プロジェクトの新規作成

Win32コンソールアプリケーション

名前は適当に「PATEST」

空のプロジェクトでいい

 

プロジェクトのフォルダの中に以下を用意

portaudio.h

portaudio_x86.dll

サンプルプログラム(paex_saw.c, paex_read_write_wire.c, など)

 

ヘッダーファイルにportaudio.hを追加

ソースファイルにサンプルプログラムを追加

(※サンプルプログラムは1つだけ入れること.複数入れるとmain()が複数になるのでビルドできない)

 

ビルドしてデバッグ

音が出ればOK

 

paex_read_write_wire.c を実行すると遅延(レイテンシ)が表示される

0.100~0.050secとかだとなにかおかしい

ASIOになっていないかも…

 

ちなみに

Quad-Capture ver.1.5.2
ASIOバッファサイズ 32samples(44100Hz)
レイテンシーモード

だと0.000725624secでした(32/44100=0.000725623)

 

上記設定はQuad-Capture ver.1.5.2で設定できる最小バッファサイズなので

これがこのオーディオインターフェイスのレイテンシの限界

ということになるはず

 

 以上

*1:必要なものというよりはこの条件では成功しましたよという意味合いが強い

*2:※なぜVS2010ではなくVS2008なのか

なぜかソリューションの変換に失敗する→手動で構築しないと→でもそもそもソリューション開けなかったらどのように構築するのかわからない!→断念

またライブラリのインクルードなどが2008と違ってちょっと面倒だったりするのも欠点

*3:DirectX SDK(June 2010)のインストール

ちなみにXP SP3だと失敗した.もうちょっと古いSDKを探せばいけたかもしれない(未解決)