From b743518f78ac9a763a31864cefcd832d518bc21b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 18 Feb 2019 13:22:46 +0100 Subject: [PATCH] node: add props to add_port --- spa/include/spa/node/node.h | 5 +- spa/plugins/alsa/alsa-sink.c | 3 +- spa/plugins/alsa/alsa-source.c | 3 +- spa/plugins/audioconvert/audioconvert.c | 5 +- spa/plugins/audioconvert/channelmix.c | 3 +- spa/plugins/audioconvert/fmtconvert.c | 3 +- spa/plugins/audioconvert/merger.c | 3 +- spa/plugins/audioconvert/resample.c | 3 +- spa/plugins/audioconvert/splitter.c | 3 +- spa/plugins/audiomixer/audiomixer.c | 3 +- spa/plugins/audiotestsrc/audiotestsrc.c | 3 +- spa/plugins/bluez5/a2dp-sink.c | 3 +- spa/plugins/ffmpeg/ffmpeg-dec.c | 3 +- spa/plugins/ffmpeg/ffmpeg-enc.c | 3 +- spa/plugins/test/fakesink.c | 3 +- spa/plugins/test/fakesrc.c | 3 +- spa/plugins/v4l2/v4l2-source.c | 2 +- spa/plugins/videotestsrc/videotestsrc.c | 3 +- spa/plugins/volume/volume.c | 3 +- src/extensions/client-node.h | 4 +- src/modules/module-audio-dsp/floatmix.c | 3 +- src/modules/module-client-node/client-node.c | 8 +- .../module-client-node/client-stream.c | 5 +- .../module-client-node/protocol-native.c | 85 ++++++++++++++----- src/modules/module-client-node/remote-node.c | 3 +- src/pipewire/port.c | 2 +- 26 files changed, 118 insertions(+), 52 deletions(-) diff --git a/spa/include/spa/node/node.h b/spa/include/spa/node/node.h index cfa6d4ce1..aa7f884e4 100644 --- a/spa/include/spa/node/node.h +++ b/spa/include/spa/node/node.h @@ -292,10 +292,13 @@ struct spa_node { * \param node a spa_node * \param direction a #enum spa_direction * \param port_id an unused port id + * \param props extra properties * \return 0 on success * -EINVAL when node is NULL */ - int (*add_port) (struct spa_node *node, enum spa_direction direction, uint32_t port_id); + int (*add_port) (struct spa_node *node, + enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props); int (*remove_port) (struct spa_node *node, enum spa_direction direction, uint32_t port_id); diff --git a/spa/plugins/alsa/alsa-sink.c b/spa/plugins/alsa/alsa-sink.c index b188ba716..343884c5b 100644 --- a/spa/plugins/alsa/alsa-sink.c +++ b/spa/plugins/alsa/alsa-sink.c @@ -298,7 +298,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/alsa/alsa-source.c b/spa/plugins/alsa/alsa-source.c index 6e3f6707f..2615d32fe 100644 --- a/spa/plugins/alsa/alsa-source.c +++ b/spa/plugins/alsa/alsa-source.c @@ -285,7 +285,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/audioconvert/audioconvert.c b/spa/plugins/audioconvert/audioconvert.c index 1ed425ebd..eeeb89297 100644 --- a/spa/plugins/audioconvert/audioconvert.c +++ b/spa/plugins/audioconvert/audioconvert.c @@ -606,7 +606,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct impl *this; @@ -614,7 +615,7 @@ static int impl_node_add_port(struct spa_node *node, enum spa_direction directio this = SPA_CONTAINER_OF(node, struct impl, node); - return spa_node_add_port(this->fmt[direction], direction, port_id); + return spa_node_add_port(this->fmt[direction], direction, port_id, props); } static int diff --git a/spa/plugins/audioconvert/channelmix.c b/spa/plugins/audioconvert/channelmix.c index 40069a73f..b26e3d01c 100644 --- a/spa/plugins/audioconvert/channelmix.c +++ b/spa/plugins/audioconvert/channelmix.c @@ -611,7 +611,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/audioconvert/fmtconvert.c b/spa/plugins/audioconvert/fmtconvert.c index b67837188..b0d58c36f 100644 --- a/spa/plugins/audioconvert/fmtconvert.c +++ b/spa/plugins/audioconvert/fmtconvert.c @@ -257,7 +257,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/audioconvert/merger.c b/spa/plugins/audioconvert/merger.c index fa8316c65..895b578eb 100644 --- a/spa/plugins/audioconvert/merger.c +++ b/spa/plugins/audioconvert/merger.c @@ -329,7 +329,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { spa_return_val_if_fail(node != NULL, -EINVAL); return -ENOTSUP; diff --git a/spa/plugins/audioconvert/resample.c b/spa/plugins/audioconvert/resample.c index 1b70fa6ca..d8f83ab6a 100644 --- a/spa/plugins/audioconvert/resample.c +++ b/spa/plugins/audioconvert/resample.c @@ -260,7 +260,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/audioconvert/splitter.c b/spa/plugins/audioconvert/splitter.c index 254a03209..92005a455 100644 --- a/spa/plugins/audioconvert/splitter.c +++ b/spa/plugins/audioconvert/splitter.c @@ -316,7 +316,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { spa_return_val_if_fail(node != NULL, -EINVAL); return -ENOTSUP; diff --git a/spa/plugins/audiomixer/audiomixer.c b/spa/plugins/audiomixer/audiomixer.c index e94ed657f..4c69fdc30 100644 --- a/spa/plugins/audiomixer/audiomixer.c +++ b/spa/plugins/audiomixer/audiomixer.c @@ -200,7 +200,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct impl *this; struct port *port; diff --git a/spa/plugins/audiotestsrc/audiotestsrc.c b/spa/plugins/audiotestsrc/audiotestsrc.c index 5d94dc8a0..b9e0263db 100644 --- a/spa/plugins/audiotestsrc/audiotestsrc.c +++ b/spa/plugins/audiotestsrc/audiotestsrc.c @@ -490,7 +490,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/bluez5/a2dp-sink.c b/spa/plugins/bluez5/a2dp-sink.c index 9ba8f2e37..6b38ef1fe 100644 --- a/spa/plugins/bluez5/a2dp-sink.c +++ b/spa/plugins/bluez5/a2dp-sink.c @@ -888,7 +888,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/ffmpeg/ffmpeg-dec.c b/spa/plugins/ffmpeg/ffmpeg-dec.c index 5a88a9488..58385ea3c 100644 --- a/spa/plugins/ffmpeg/ffmpeg-dec.c +++ b/spa/plugins/ffmpeg/ffmpeg-dec.c @@ -147,7 +147,8 @@ impl_node_set_callbacks(struct spa_node *node, } static int -impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/ffmpeg/ffmpeg-enc.c b/spa/plugins/ffmpeg/ffmpeg-enc.c index edc6136b5..072a3a454 100644 --- a/spa/plugins/ffmpeg/ffmpeg-enc.c +++ b/spa/plugins/ffmpeg/ffmpeg-enc.c @@ -149,7 +149,8 @@ impl_node_set_callbacks(struct spa_node *node, } static int -impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/test/fakesink.c b/spa/plugins/test/fakesink.c index ec1098638..aa0f9153b 100644 --- a/spa/plugins/test/fakesink.c +++ b/spa/plugins/test/fakesink.c @@ -354,7 +354,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, + uint32_t port_id, const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/test/fakesrc.c b/spa/plugins/test/fakesrc.c index 719603e16..9f73e1600 100644 --- a/spa/plugins/test/fakesrc.c +++ b/spa/plugins/test/fakesrc.c @@ -370,7 +370,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/v4l2/v4l2-source.c b/spa/plugins/v4l2/v4l2-source.c index 626dbd9fe..016092a11 100644 --- a/spa/plugins/v4l2/v4l2-source.c +++ b/spa/plugins/v4l2/v4l2-source.c @@ -373,7 +373,7 @@ static int impl_node_set_callbacks(struct spa_node *node, static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, - uint32_t port_id) + uint32_t port_id, const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c index 851fd6c81..de930b8bf 100644 --- a/spa/plugins/videotestsrc/videotestsrc.c +++ b/spa/plugins/videotestsrc/videotestsrc.c @@ -434,7 +434,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/spa/plugins/volume/volume.c b/spa/plugins/volume/volume.c index cb5ca6d24..af1b1804a 100644 --- a/spa/plugins/volume/volume.c +++ b/spa/plugins/volume/volume.c @@ -269,7 +269,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { return -ENOTSUP; } diff --git a/src/extensions/client-node.h b/src/extensions/client-node.h index ab82ad6b8..99eccfd53 100644 --- a/src/extensions/client-node.h +++ b/src/extensions/client-node.h @@ -256,10 +256,12 @@ struct pw_client_node_proxy_events { * * \param direction the direction of the port * \param port_id the new port id + * \param props extra properties */ int (*add_port) (void *object, enum spa_direction direction, - uint32_t port_id); + uint32_t port_id, + const struct spa_dict *props); /** * A port was removed from the node * diff --git a/src/modules/module-audio-dsp/floatmix.c b/src/modules/module-audio-dsp/floatmix.c index 87ba1839f..750ae81c8 100644 --- a/src/modules/module-audio-dsp/floatmix.c +++ b/src/modules/module-audio-dsp/floatmix.c @@ -194,7 +194,8 @@ impl_node_set_callbacks(struct spa_node *node, return 0; } -static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct impl *this; struct port *port; diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index b96d1d321..58a6ed7d2 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -579,7 +579,8 @@ clear_port(struct node *this, struct port *port) } static int -impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct node *this; @@ -588,7 +589,7 @@ impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t spa_return_val_if_fail(CHECK_FREE_PORT(this, direction, port_id), -EINVAL); - return pw_client_node_resource_add_port(this->resource, direction, port_id); + return pw_client_node_resource_add_port(this->resource, direction, port_id, props); } static int @@ -1339,7 +1340,8 @@ impl_mix_port_set_param(struct spa_node *node, } static int -impl_mix_add_port(struct spa_node *node, enum spa_direction direction, uint32_t mix_id) +impl_mix_add_port(struct spa_node *node, enum spa_direction direction, uint32_t mix_id, + const struct spa_dict *props) { struct port *port = SPA_CONTAINER_OF(node, struct port, mix_node); pw_log_debug("client-node %p: add port %d:%d.%d", node, direction, port->id, mix_id); diff --git a/src/modules/module-client-node/client-stream.c b/src/modules/module-client-node/client-stream.c index b1a9a5d47..87b6e3de2 100644 --- a/src/modules/module-client-node/client-stream.c +++ b/src/modules/module-client-node/client-stream.c @@ -341,7 +341,8 @@ impl_node_sync(struct spa_node *node, uint32_t seq) } static int -impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id) +impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct node *this; struct impl *impl; @@ -355,7 +356,7 @@ impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t if (direction != impl->direction) return -EINVAL; - if ((res = spa_node_add_port(impl->adapter_mix, direction, port_id)) < 0) + if ((res = spa_node_add_port(impl->adapter_mix, direction, port_id, props)) < 0) return res; if ((res = spa_node_port_set_io(impl->adapter_mix, diff --git a/src/modules/module-client-node/protocol-native.c b/src/modules/module-client-node/protocol-native.c index 240aac989..cb31ce81d 100644 --- a/src/modules/module-client-node/protocol-native.c +++ b/src/modules/module-client-node/protocol-native.c @@ -31,6 +31,22 @@ #include #include +static void push_dict(struct spa_pod_builder *b, const struct spa_dict *dict) +{ + uint32_t i, n_items; + struct spa_pod_frame f; + + n_items = dict ? dict->n_items : 0; + + spa_pod_builder_push_struct(b, &f); + spa_pod_builder_int(b, n_items); + for (i = 0; i < n_items; i++) { + spa_pod_builder_string(b, dict->items[i].key); + spa_pod_builder_string(b, dict->items[i].value); + } + spa_pod_builder_pop(b, &f); +} + static int client_node_marshal_update(void *object, uint32_t change_mask, @@ -43,28 +59,21 @@ client_node_marshal_update(void *object, struct pw_proxy *proxy = object; struct spa_pod_builder *b; struct spa_pod_frame f; - uint32_t i, n_items; + uint32_t i; b = pw_protocol_native_begin_proxy(proxy, PW_CLIENT_NODE_PROXY_METHOD_UPDATE); spa_pod_builder_push_struct(b, &f); spa_pod_builder_add(b, - SPA_POD_Int(change_mask), - SPA_POD_Int(max_input_ports), - SPA_POD_Int(max_output_ports), - SPA_POD_Int(n_params), NULL); + SPA_POD_Int(change_mask), + SPA_POD_Int(max_input_ports), + SPA_POD_Int(max_output_ports), + SPA_POD_Int(n_params), NULL); for (i = 0; i < n_params; i++) spa_pod_builder_add(b, SPA_POD_Pod(params[i]), NULL); - n_items = props ? props->n_items : 0; - spa_pod_builder_add(b, - SPA_POD_Int(n_items), NULL); - for (i = 0; i < n_items; i++) { - spa_pod_builder_add(b, - SPA_POD_String(props->items[i].key), - SPA_POD_String(props->items[i].value), NULL); - } + push_dict(b, props); spa_pod_builder_pop(b, &f); return pw_protocol_native_end_proxy(proxy, b); @@ -247,15 +256,37 @@ static int client_node_demarshal_add_port(void *object, void *data, size_t size) { struct pw_proxy *proxy = object; struct spa_pod_parser prs; + struct spa_pod_frame f[2]; int32_t direction, port_id; + struct spa_dict props; + uint32_t i; spa_pod_parser_init(&prs, data, size); - if (spa_pod_parser_get_struct(&prs, + if (spa_pod_parser_push_struct(&prs, &f[0]) < 0) + return -EINVAL; + + if (spa_pod_parser_get(&prs, SPA_POD_Int(&direction), SPA_POD_Int(&port_id)) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_port, 0, direction, port_id); + if (spa_pod_parser_push_struct(&prs, &f[1]) < 0) + return -EINVAL; + if (spa_pod_parser_get(&prs, + SPA_POD_Int(&props.n_items), NULL) < 0) + return -EINVAL; + + props.items = alloca(props.n_items * sizeof(struct spa_dict_item)); + for (i = 0; i < props.n_items; i++) { + if (spa_pod_parser_get(&prs, + SPA_POD_String(&props.items[i].key), + SPA_POD_String(&props.items[i].value), + NULL) < 0) + return -EINVAL; + } + + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_port, 0, direction, port_id, + props.n_items ? &props : NULL); return 0; } @@ -513,16 +544,21 @@ client_node_marshal_command(void *object, const struct spa_command *command) static int client_node_marshal_add_port(void *object, - enum spa_direction direction, uint32_t port_id) + enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct pw_resource *resource = object; struct spa_pod_builder *b; + struct spa_pod_frame f; b = pw_protocol_native_begin_resource(resource, PW_CLIENT_NODE_PROXY_EVENT_ADD_PORT); - spa_pod_builder_add_struct(b, - SPA_POD_Int(direction), - SPA_POD_Int(port_id)); + spa_pod_builder_push_struct(b, &f); + spa_pod_builder_add(b, + SPA_POD_Int(direction), + SPA_POD_Int(port_id)); + push_dict(b, props); + spa_pod_builder_pop(b, &f); return pw_protocol_native_end_resource(resource, b); } @@ -692,14 +728,14 @@ static int client_node_demarshal_update(void *object, void *data, size_t size) { struct pw_resource *resource = object; struct spa_pod_parser prs; - struct spa_pod_frame f; + struct spa_pod_frame f[2]; uint32_t change_mask, max_input_ports, max_output_ports, n_params; const struct spa_pod **params; struct spa_dict props; uint32_t i; spa_pod_parser_init(&prs, data, size); - if (spa_pod_parser_push_struct(&prs, &f) < 0 || + if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 || spa_pod_parser_get(&prs, SPA_POD_Int(&change_mask), SPA_POD_Int(&max_input_ports), @@ -713,15 +749,18 @@ static int client_node_demarshal_update(void *object, void *data, size_t size) SPA_POD_PodObject(¶ms[i]), NULL) < 0) return -EINVAL; + if (spa_pod_parser_push_struct(&prs, &f[1]) < 0) + return -EINVAL; if (spa_pod_parser_get(&prs, - SPA_POD_Int(&props.n_items), NULL) < 0) + SPA_POD_Int(&props.n_items), NULL) < 0) return -EINVAL; props.items = alloca(props.n_items * sizeof(struct spa_dict_item)); for (i = 0; i < props.n_items; i++) { if (spa_pod_parser_get(&prs, SPA_POD_String(&props.items[i].key), - SPA_POD_String(&props.items[i].value), NULL) < 0) + SPA_POD_String(&props.items[i].value), + NULL) < 0) return -EINVAL; } diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c index 50ad44093..92625b45c 100644 --- a/src/modules/module-client-node/remote-node.c +++ b/src/modules/module-client-node/remote-node.c @@ -576,7 +576,8 @@ static int client_node_command(void *object, const struct spa_command *command) } static int -client_node_add_port(void *object, enum spa_direction direction, uint32_t port_id) +client_node_add_port(void *object, enum spa_direction direction, uint32_t port_id, + const struct spa_dict *props) { struct pw_proxy *proxy = object; pw_log_warn("add port not supported"); diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 59485bbf6..8252ca039 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -206,7 +206,7 @@ int pw_port_init_mix(struct pw_port *port, struct pw_port_mix *mix) adjust_mix_state(port, mix->state, 1); if (port->mix->add_port) - port->mix->add_port(port->mix, port->direction, port_id); + port->mix->add_port(port->mix, port->direction, port_id, NULL); if (pi && pi->init_mix) res = pi->init_mix(port->implementation_data, mix);