如何在Vala中的回调参数之前指定提供用户数据?

时间:2015-08-18 00:36:22

标签: c callback delegates vala vapi

我有一个看起来像这样的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值都作为第一个参数而不是生成函数中的第三个参数提供呼叫。我似乎无法绕过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);
}

我如何使这项工作?

1 个答案:

答案 0 :(得分:4)

1.5应该有效:

[CCode(cname = "CPRCEN_engine_set_callback")]
public int set_channel_callback(ChannelHandle chan, [CCode (delegate_target_pos = 1.5)] ChannelCallback callback);

逻辑非常简单。 1.5在第一个参数(chan)和第二个参数(回调)之间。如果你想要它在第二个和第三个之间,你可以使用2.5,依此类推。

当你希望它在实例之前时,事情才真正开始变得有点复杂 - 在这种情况下,你会使用介于0和1之间的东西(例如,0.5)并使用instance_pos CCode属性将实例设置为小于1但大于0.5(例如0.9)。