You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从pw_stream中获取端口ID?

如何从pw_stream中获取端口ID?

嘿,我来帮你搞定这个问题!要拿到pw_stream内部生成的端口ID,其实有几种实用的方法,下面一步步给你说清楚:

  • 直接监听端口添加事件(最推荐)
    pw_stream本身提供了PW_STREAM_EVENT_PORT_ADDED事件,当流的内部端口创建完成时,这个事件会被触发,直接给你端口ID!你只需要在创建流的时候注册这个事件的回调就行:

    static void stream_port_added(void *data, uint32_t port_id) {
        // 这里的port_id就是你要找的端口ID啦
        printf("当前流的端口ID:%u\n", port_id);
        // 拿到ID后就可以调用pw_core_create_link()来创建链接了
    }
    
    // 创建流时注册事件回调
    static const struct pw_stream_events stream_events = {
        PW_VERSION_STREAM_EVENTS,
        // 其他回调比如state_changed也可以按需添加
        .port_added = stream_port_added,
    };
    
    // 在pw_stream_new_simple的参数里传入这个events结构体
    

    这种方法最省心,PipeWire会主动把端口ID送到你面前,不用自己去查。

  • 通过节点ID查询端口
    如果因为某些原因没法用上面的方法,你可以先拿到流对应的节点ID,再枚举节点的端口:

    1. 先在PW_STREAM_EVENT_STATE_CHANGED回调里获取节点ID:
      static void stream_state_changed(void *data, enum pw_stream_state old, enum pw_stream_state state, const char *error) {
          struct pw_stream *stream = data;
          if (state == PW_STREAM_STATE_PAUSED || state == PW_STREAM_STATE_STREAMING) {
              uint32_t node_id = pw_stream_get_node_id(stream);
              // 拿到node_id后去查询端口
              query_stream_ports(pw_stream_get_core(stream), node_id);
          }
      }
      
    2. 然后用pw_core_enum_params()枚举节点的端口信息:
      static void port_info_received(void *data, uint32_t seq, uint32_t type, uint32_t id, struct pw_param_info *params, uint32_t n_params) {
          if (type == PW_TYPE_OBJECT_Port) {
              struct pw_port_info *info = NULL;
              for (uint32_t i = 0; i < n_params; i++) {
                  if (pw_param_info_parse(&params[i], &info) == 0) {
                      printf("找到端口ID:%u\n", info->id);
                      pw_port_info_free(info);
                  }
              }
          }
      }
      
      void query_stream_ports(struct pw_core *core, uint32_t node_id) {
          pw_core_enum_params(core, 0, PW_TYPE_OBJECT_Port, node_id,
                              PW_PORT_PARAM_INFO, 0, UINT32_MAX, port_info_received, NULL);
      }
      

总的来说,第一种方法最直接高效,优先用它就好。拿到端口ID之后,你就能用pw_core_create_link()来建立流和其他设备/流之间的链接了。

备注:内容来源于stack exchange,提问作者eyelash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:09:49