我正在尝试改编这个 PipeWire 示例以与 C++ 一起使用,因为我需要在 C++ 方法中执行各种处理。但我不确定如何从静态回调函数调用 C++ 成员方法,即来自:
static void on_process(void *userdata, struct spa_io_position *position)
有什么建议吗?
您可以执行以下操作:
this
指针)作为userdata
传递。userdata
转换回指向类实例的指针。casted_pointer->...
)。伪代码(静态方法变体):
class A
{
void register_me_for_on_process()
{
void * user_data = this;
register_on_process(on_process_static, user_data, ...);
}
// Static callback for registering with the API:
static void on_process_static(void *userdata, ...)
{
A * pThis = reinterpret_cast<A*>(userdata);
pThis->on_process(...);
}
// Callback:
void on_process(...)
{
}
};
全局函数变体非常相似 - 只需将
on_process_static
方法从类中取出,并将 on_process
方法公开(或使 on_process_static
成为朋友)。
这就是用户数据的用途。用于用户数据。
struct UserData {
void on_process(struct spa_io_position *position) { /* blabla */ }
};
static void on_process(void *userdata, struct spa_io_position *position)
{
UserData *ud = static_cast<UserData*>(userdata);
ud->on_process(position);
}
static const struct pw_filter_events filter_events = {
PW_VERSION_FILTER_EVENTS,
.process = on_process,
};
int main(int argc, char *argv[])
{
struct UserData ud;
pw_filter_new_simple(blabla, static_cast<void*>(&ud));
}