ASIO SDKとグローバル変数

ASIOと言っても、今回はAudio Streaming I/Oの方です。
S.F. Programmingさんの話だと、ASIOのサポートはaudioライブラリとしては必要なもののようです。
これまで名前ぐらいしか知りませんでしたが、調べてみました。

自分のサウンドカードは(多分)ASIOに対応していないので、まずはWDM経由のASIOドライバをインストール。
Universal ASIO Driver For WDM Audio

ASIO対応ソフトが手元になかったので、ここからWinamp用のプラグインをダウンロードして、試聴してみました。問題ないようです。

続いて、SteinbergのサイトからASIO SDKをダウンロード。
ぱっと見たところ、ASIOドライバとの通信はCOM経由で、付属のライブラリはそのラッパーのようです。このライブラリはグローバル変数が多用されているので、マルチスレッドを考慮すると使い勝手がよくありません。ヘッダだけ利用して、COMで直接操作することにします。

グローバル変数の「いつ変更されるか分かりにくい」性質は、マルチスレッド環境では「いつ変更されるか知りえない」になります。
利用者側がミューテックスなどで排他的な利用を保証できれば問題ないように思えるかもしれませんが、このような排他は協調ロックであって、協調しないスレッドが存在しえます。
アプリケーション内で完結できる場合はともかく、ライブラリ内のグローバル変数は、同時に使用している別のライブラリが使用している可能性もあり、そのライブラリがどのような協調手段を用いているかはソースやドキュメントを見なければ分かりません。

ASIOの場合、これが問題になるケースはほとんどないと思いますが、マルチスレッド環境が当たり前の今、グローバル変数の利用は可能な限り控えるべきだと思います。