如何从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,再枚举节点的端口:- 先在
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); } } - 然后用
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(¶ms[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
相关产品推荐
相关产品推荐

