From 4c2954b7a933a39f0b8ceefcaee03ebf1a386381 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 2 Mar 2020 16:27:18 +0100 Subject: [PATCH] stream: clear buffer when format is cleared Setting the format to NULL should clear the buffers. --- src/pipewire/filter.c | 83 +++++++++++++++++++++---------------------- src/pipewire/stream.c | 68 +++++++++++++++++++---------------- 2 files changed, 77 insertions(+), 74 deletions(-) diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index 255207b0e..784989c9a 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -518,49 +518,6 @@ static int update_params(struct filter *impl, struct port *port, uint32_t id, return res; } -static int port_set_param(struct filter *impl, struct port *port, - uint32_t id, uint32_t flags, const struct spa_pod *param) -{ - struct pw_filter *filter = &impl->this; - int res; - - pw_log_debug(NAME" %p: param changed: %p %d", impl, param, impl->disconnecting); - if (param && pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) - spa_debug_pod(2, NULL, param); - - if ((res = update_params(impl, port, id, ¶m, param ? 1 : 0)) < 0) - return res; - - pw_filter_emit_param_changed(filter, port->user_data, id, param); - - if (filter->state == PW_FILTER_STATE_ERROR) - return -EIO; - - if (port) - emit_port_info(impl, port, false); - else - emit_node_info(impl, false); - - return res; -} - -static int impl_port_set_param(void *object, - enum spa_direction direction, uint32_t port_id, - uint32_t id, uint32_t flags, - const struct spa_pod *param) -{ - struct filter *impl = object; - struct port *port; - - if (impl->disconnecting) - return param == NULL ? 0 : -EIO; - - if ((port = get_port(impl, direction, port_id)) == NULL) - return -EINVAL; - - return port_set_param(impl, port, id, flags, param); -} - static int map_data(struct filter *impl, struct spa_data *data, int prot) { void *ptr; @@ -626,6 +583,46 @@ static void clear_buffers(struct port *port) clear_queue(port, &port->queued); } +static int impl_port_set_param(void *object, + enum spa_direction direction, uint32_t port_id, + uint32_t id, uint32_t flags, + const struct spa_pod *param) +{ + struct filter *impl = object; + struct pw_filter *filter = &impl->this; + struct port *port; + int res; + + if (impl->disconnecting) + return param == NULL ? 0 : -EIO; + + pw_log_debug(NAME" %p: param changed: %p %d", impl, param, impl->disconnecting); + + if ((port = get_port(impl, direction, port_id)) == NULL) + return -EINVAL; + + if (param && pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) + spa_debug_pod(2, NULL, param); + + if ((res = update_params(impl, port, id, ¶m, param ? 1 : 0)) < 0) + return res; + + if (id == SPA_PARAM_Format && param == NULL) + clear_buffers(port); + + pw_filter_emit_param_changed(filter, port->user_data, id, param); + + if (filter->state == PW_FILTER_STATE_ERROR) + return -EIO; + + if (port) + emit_port_info(impl, port, false); + else + emit_node_info(impl, false); + + return res; +} + static int impl_port_use_buffers(void *object, enum spa_direction direction, uint32_t port_id, uint32_t flags, diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 84ba1a439..b79bb8158 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -343,7 +343,8 @@ static int impl_set_io(void *object, uint32_t id, void *data, size_t size) struct stream *impl = object; struct pw_stream *stream = &impl->this; - pw_log_debug(NAME" %p: io %d %p/%zd", impl, id, data, size); + pw_log_debug(NAME" %p: set io id %d (%s) %p %zd", impl, id, + spa_debug_type_find_name(spa_type_io, id), data, size); switch(id) { case SPA_IO_Position: @@ -455,7 +456,7 @@ static int impl_port_set_io(void *object, enum spa_direction direction, uint32_t { struct stream *impl = object; - pw_log_debug(NAME" %p: set io %s %p %zd", impl, + pw_log_debug(NAME" %p: set io id %d (%s) %p %zd", impl, id, spa_debug_type_find_name(spa_type_io, id), data, size); switch (id) { @@ -516,35 +517,6 @@ static int impl_port_enum_params(void *object, int seq, return 0; } -static int impl_port_set_param(void *object, - enum spa_direction direction, uint32_t port_id, - uint32_t id, uint32_t flags, - const struct spa_pod *param) -{ - struct stream *impl = object; - struct pw_stream *stream = &impl->this; - int res; - - if (impl->disconnecting) - return param == NULL ? 0 : -EIO; - - pw_log_debug(NAME" %p: param changed: %p %d", impl, param, impl->disconnecting); - if (param && pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) - spa_debug_pod(2, NULL, param); - - if ((res = update_params(impl, id, ¶m, param ? 1 : 0)) < 0) - return res; - - pw_stream_emit_param_changed(stream, id, param); - - if (stream->state == PW_STREAM_STATE_ERROR) - return -EIO; - - emit_port_info(impl, false); - - return 0; -} - static int map_data(struct stream *impl, struct spa_data *data, int prot) { void *ptr; @@ -611,6 +583,40 @@ static void clear_buffers(struct pw_stream *stream) clear_queue(impl, &impl->queued); } +static int impl_port_set_param(void *object, + enum spa_direction direction, uint32_t port_id, + uint32_t id, uint32_t flags, + const struct spa_pod *param) +{ + struct stream *impl = object; + struct pw_stream *stream = &impl->this; + int res; + + if (impl->disconnecting) + return param == NULL ? 0 : -EIO; + + pw_log_debug(NAME" %p: param id %d (%s) changed: %p", impl, id, + spa_debug_type_find_name(spa_type_param, id), param); + + if (param && pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) + spa_debug_pod(2, NULL, param); + + if ((res = update_params(impl, id, ¶m, param ? 1 : 0)) < 0) + return res; + + if (id == SPA_PARAM_Format && param == NULL) + clear_buffers(stream); + + pw_stream_emit_param_changed(stream, id, param); + + if (stream->state == PW_STREAM_STATE_ERROR) + return -EIO; + + emit_port_info(impl, false); + + return 0; +} + static int impl_port_use_buffers(void *object, enum spa_direction direction, uint32_t port_id, uint32_t flags,