diff --git a/spa/plugins/audioconvert/channelmix.c b/spa/plugins/audioconvert/channelmix.c index f17ab25f9..e8adbff4f 100644 --- a/spa/plugins/audioconvert/channelmix.c +++ b/spa/plugins/audioconvert/channelmix.c @@ -744,18 +744,23 @@ static int port_enum_formats(void *object, SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), SPA_FORMAT_AUDIO_format, SPA_POD_Id(SPA_AUDIO_FORMAT_F32P), 0); + if (other->have_format) { spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_rate, SPA_POD_Int(other->format.info.raw.rate), + SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int( + other->format.info.raw.channels, 1, INT32_MAX), 0); } else { + uint32_t rate = this->io_position ? + this->io_position->clock.rate.denom : DEFAULT_RATE; + spa_pod_builder_add(builder, - SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int(DEFAULT_RATE, 1, INT32_MAX), + SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int(rate, 0, INT32_MAX), + SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int( + DEFAULT_CHANNELS, 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; diff --git a/spa/plugins/audioconvert/fmtconvert.c b/spa/plugins/audioconvert/fmtconvert.c index f88df36d1..34f23d49d 100644 --- a/spa/plugins/audioconvert/fmtconvert.c +++ b/spa/plugins/audioconvert/fmtconvert.c @@ -429,6 +429,7 @@ static int port_enum_formats(void *object, } else { uint32_t rate = this->io_position ? this->io_position->clock.rate.denom : DEFAULT_RATE; + spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int( rate, 1, INT32_MAX), diff --git a/spa/plugins/audioconvert/merger.c b/spa/plugins/audioconvert/merger.c index 8c505313f..286978983 100644 --- a/spa/plugins/audioconvert/merger.c +++ b/spa/plugins/audioconvert/merger.c @@ -688,6 +688,9 @@ static int port_enum_formats(void *object, SPA_PARAM_EnumFormat, &port->format.info.raw); } else { + uint32_t rate = this->io_position ? + this->io_position->clock.rate.denom : DEFAULT_RATE; + *param = spa_pod_builder_add_object(builder, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), @@ -710,7 +713,7 @@ static int port_enum_formats(void *object, SPA_AUDIO_FORMAT_U8, SPA_AUDIO_FORMAT_U8P), SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int( - DEFAULT_RATE, 1, INT32_MAX), + rate, 1, INT32_MAX), SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int( DEFAULT_CHANNELS, 1, MAX_PORTS)); } diff --git a/spa/plugins/audioconvert/resample.c b/spa/plugins/audioconvert/resample.c index ef49d6f47..e300cef60 100644 --- a/spa/plugins/audioconvert/resample.c +++ b/spa/plugins/audioconvert/resample.c @@ -404,12 +404,15 @@ static int port_enum_formats(void *object, other->format.info.raw.channels, other->format.info.raw.position); *param = spa_pod_builder_pop(builder, &f); } else { + uint32_t rate = this->io_position ? + this->io_position->clock.rate.denom : DEFAULT_RATE; + *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_CHOICE_RANGE_Int(DEFAULT_RATE, 1, INT32_MAX), + SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int(rate, 1, INT32_MAX), SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int(DEFAULT_CHANNELS, 1, INT32_MAX)); } break;