次のような C API があります。
typedef void (*cprcen_channel_callback) (CPRC_abuf *abuf, void *user_data);
int CPRCEN_engine_set_callback(CPRCEN_engine *eng, CPRCEN_channel_handle chan,
void *userdata, cprcen_channel_callback callback);
ご覧のとおり、CPRCEN_engine_set_callback
関数はコールバックの前にユーザー データを受け取りますが、デフォルトでは、Vala はそれが後で来ることを期待しています。CCode
属性のdelegate_target_pos
パラメーターについては知っていますが、指定した位置に関係userdata
なく、生成された関数呼び出しの 3 番目の引数ではなく、最初の引数として値が提供されます。Vala のパラメーター配置ロジックに頭を悩ませているようには見えません。
バインディングを最終的にどのように見せたいかを次に示します。
[CCode(cname = "cprcen_channel_callback", has_target = true)]
public delegate void ChannelCallback(AudioBuffer abuf);
[Compact]
[CCode(cname = "CPRCEN_engine")]
public class Engine {
[CCode(cname = "CPRCEN_engine_set_callback")]
public int set_channel_callback(ChannelHandle chan, ChannelCallback callback);
}
どうすればこれを機能させることができますか?