Как мне указать, что пользовательские данные предоставляются до параметра обратного вызова в Vala?
У меня есть 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 ответ
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) и вторым (callback). Если вы хотите, чтобы между вторым и третьим вы могли использовать 2.5, и так далее.
Вещи только начинают немного усложняться, когда вы хотите, чтобы они предшествовали экземпляру - в этом случае вы должны использовать что-то между 0 и 1 (например, 0,5) и использовать атрибут CCode instance_pos, чтобы установить для экземпляра значение меньше 1, но больше чем 0,5 (например, 0,9).