ASIO4ALL on x64
Windows 7 (x64) にASIO4ALL (x64)をインストールしたのですが、IASIO::setSampleRate()が必ず失敗します。
IASIO::setSampleRate()しなければ動くようで、どうもdouble引数の受け渡しがうまくいっていない模様。
Winampのout_asio(x64).dllも動かないので自分のコードの間違いではなさそうです。
また、32ビットなら動きます。
typedef long ASIOError; typedef double ASIOSampleRate; struct IASIO : public IUnknown { // ... virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0; // ... };
COMなのに__stdcall使ってないのでx86ではVC++以外のコンパイラで困りましたが、
x64では呼び出し規約が一つ*1なので問題ありません。
x64呼び出し規約では、thisポインタがRCX、sampleRateがxmm1で渡されるはずです。
ところがデバッガで追っていくとxmm1は一切参照せず、代わりにxmm0を見ているようでした。
試しにバイナリエディタでxmm0→xmm1に書き換えて試したところ動いてしまいました。(Winampでも!)
一応パッチ内容を貼っておきます。
asio4all64.dll (MD5: 3e27e83063cd64a25f914e7ef556112c) 0x000056CD: C0 -> C1 0x000057CF: C0 -> C1
うーむ、こんな対応でいいんでしょうか、、、。