如何使用 PipeWire 从 C 回调函数调用 C++ 成员方法

问题描述 投票:0回答:2

我正在尝试改编这个 PipeWire 示例以与 C++ 一起使用,因为我需要在 C++ 方法中执行各种处理。但我不确定如何从静态回调函数调用 C++ 成员方法,即来自:

static void on_process(void *userdata, struct spa_io_position *position)

有什么建议吗?

c++ callback static-functions pipewire
2个回答
3
投票

您可以执行以下操作:

  1. 使用全局函数或类的静态方法作为回调。每种都有优点和缺点:
    • 静态方法的优点是将所有内容打包在一起。
    • 全局函数的优点是不会使类混乱,但需要将回调方法公开或将该函数设为友元。
  2. 当您注册回调时,将类实例的地址(如果您在方法内部则为
    this
    指针)作为
    userdata
    传递。
  3. 在静态/全局回调中将
    userdata
    转换回指向类实例的指针。
  4. 使用强制转换的指针来调用类的方法 (
    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
成为朋友)。


2
投票

这就是用户数据的用途。用于用户数据。

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));
}
© www.soinside.com 2019 - 2024. All rights reserved.