続cdecl_thunk

昨日のcdecl_thunkを使うと、ASIOのコールバック関数は次のようになります。

struct asio_callbacks
{
    cdecl_thunk<2> buffer_switch;
    cdecl_thunk<2> sample_rate_changed;
    cdecl_thunk<4> asio_message;
    cdecl_thunk<3> buffer_switch_time_info;
};

sample_rate_changedは引数1個なんですが、型がdoubleなので引数2個の扱いです。
サンクのメモリはVirtualProtect()で実行可能にしておく必要があります。VirtualProtect()するには、そのメモリをVirtualAlloc()で確保しておかなければいけません。
VirtualAlloc()はページ単位でメモリを確保するため、サンク毎にメモリを割り当てるとメモリを無駄に使います。ここでは、4つのサンクをまとめて1回のVirtualAlloc()でまかなうことにします。(それでも無駄が多いですが)

ただの途中経過の報告になってしまいますが、現状こんな感じになっています。

続きを読む