ASIOデバイスドライバの初期化

ASIOSDKがいい感じにスパゲッティです。$(SDKDir)/commonディレクトリのソースまで絡んでちょっとアルデンテです。(sourceとsauceかけてみたテヘ)

グローバル変数のIASIO型(これはIUnknown型を継承している)のtheASIODriver変数が$(SDKDir)/common/asio.h(36)に有って、そのした37行目でAsioDrivers *型のasioDriversのextern変数が有ってasioDriversの定義は$(SDKDir)/host/asiodrivers.hに有って、そのasiodrivers.hではAsioDriverを列挙してロードするAsioDriversクラスが定義されててAsioDrivers::loadDriverを呼ぶと継承元のAsioDriverListのasioOpenDriverがtheAsioDriverをCOMでロードしてくれるから僕はてっきりそのあとでasio.hのASIOInitを呼ぶもんだと思ってたからそのままはASIOInitを呼んで正常パスで実行されてるもんだと勘違いしたままASIOCanSampleRateとかを呼びつつニヤニヤしていていざASIOExit関数を呼んだらASIOExit関数内ではasioDriver変数のremoveCurrentDriverを呼んでドライバを解放しようとしてるみたいだけどこの時点では誰もasioDriver変数に値を設定してないからアクセス違反で落ちるわけでasioDriverに値を入れるのはどこかそんな関数があるのかと思ったらasiodrivers.h(8)のloadAsioDriver関数らしくてAsioDriversクラスがあればこれは使わなそうだけど$(SDKDir)/host/pc/hostsample.cppのmainではloadAsioDriver関数を使ってドライバをロードしてて、どうやらASIOInitとASIOExitはこのloadAsioDriver関数を使ってドライバをロードしたときのみ呼ぶべきでAsioDrivers::loadDriverからロードしたときは呼ばなくていいどころかASIOExitで落ちてしまうので呼んではいけないけどそんなことはドキュメントのどこにも書いてないどころかドキュメントにはASIOドライバの操作はLOAD=>INITIALIZED=>PREPARED=>RUNNINGの4段階で書いてあるのにAsioDriversでロードしたらAsioInitもAsioExitも要らないからINITIALIZEDの処理はしなくていいってどっかに書いておけよ!ヽ(`Д´)ノウワァァァン!!。

と思ったらASIOInitはちゃんと呼ばないとデバイスが正しく初期化出来ないみたい。
(内部でtheAsioDriver->init()を呼んでる)
でもASIOExitを呼ぶと落ちる。

解決策
1 ASIOExitを呼ばない
2 AsioDriver::initを自前で呼ぶ
3 AsioDrivers::loadDriverでロードしたらasioDriver変数もセットする

さて。。。