From 498cb91750511be6024d30b6a6b3acdfced28e1c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 13 May 2020 15:38:56 +0200 Subject: [PATCH] channelmix: fix enum_params 0 should be returned when enum is done or else we loop forever. --- spa/plugins/audioconvert/channelmix.c | 47 +++++++++++++++------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/spa/plugins/audioconvert/channelmix.c b/spa/plugins/audioconvert/channelmix.c index 64e9b9605..399f4029f 100644 --- a/spa/plugins/audioconvert/channelmix.c +++ b/spa/plugins/audioconvert/channelmix.c @@ -497,36 +497,40 @@ static int port_enum_formats(void *object, struct spa_pod_builder *builder) { struct impl *this = object; - struct port *other; - - if (IS_CONTROL_PORT(this, direction, port_id)) { - *param = spa_pod_builder_add_object(builder, - SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, - SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_application), - SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_control)); - return 1; - } - - other = GET_PORT(this, SPA_DIRECTION_REVERSE(direction), 0); switch (index) { case 0: - if (other->have_format) { + if (IS_CONTROL_PORT(this, direction, port_id)) { *param = spa_pod_builder_add_object(builder, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, - SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), - SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), - SPA_FORMAT_AUDIO_format, SPA_POD_Id(SPA_AUDIO_FORMAT_F32P), - SPA_FORMAT_AUDIO_rate, SPA_POD_Int(other->format.info.raw.rate), - SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int(DEFAULT_CHANNELS, 1, INT32_MAX)); + SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_application), + SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_control)); } else { - *param = spa_pod_builder_add_object(builder, - SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, + struct spa_pod_frame f; + struct port *other; + + other = GET_PORT(this, SPA_DIRECTION_REVERSE(direction), 0); + + spa_pod_builder_push_object(builder, &f, + SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat); + spa_pod_builder_add(builder, SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), SPA_FORMAT_AUDIO_format, SPA_POD_Id(SPA_AUDIO_FORMAT_F32P), - SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int(DEFAULT_RATE, 1, INT32_MAX), - SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int(DEFAULT_CHANNELS, 1, INT32_MAX)); + 0); + if (other->have_format) { + spa_pod_builder_add(builder, + SPA_FORMAT_AUDIO_rate, SPA_POD_Int(other->format.info.raw.rate), + 0); + } else { + spa_pod_builder_add(builder, + SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int(DEFAULT_RATE, 1, INT32_MAX), + 0); + } + spa_pod_builder_add(builder, + SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int(DEFAULT_CHANNELS, 1, INT32_MAX), + 0); + *param = spa_pod_builder_pop(builder, &f); } break; default: @@ -954,6 +958,7 @@ static int channelmix_process_control(struct impl *this, struct port *ctrlport, spa_log_trace_fp(this->log, NAME " %p: remain %d", this, avail_samples); if (avail_samples > 0) channelmix_process(&this->mix, n_dst, dst, n_src, src, avail_samples); + return 1; }