audioconvert: don't negottiate rate when resample is disabled

This will leave the negotiated rate 0 when parsed and instructs the
stream to follow the graph rate.
This commit is contained in:
Wim Taymans 2023-06-23 10:35:47 +02:00
parent 4cc22d60d2
commit 0156d63109
2 changed files with 18 additions and 6 deletions

View file

@ -1893,11 +1893,13 @@ static int port_enum_formats(void *object,
SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_application), SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_application),
SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_control)); SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_control));
} else { } else {
struct spa_pod_frame f[1];
uint32_t rate = this->io_position ? uint32_t rate = this->io_position ?
this->io_position->clock.target_rate.denom : DEFAULT_RATE; this->io_position->clock.target_rate.denom : DEFAULT_RATE;
*param = spa_pod_builder_add_object(builder, spa_pod_builder_push_object(builder, &f[0],
SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat);
spa_pod_builder_add(builder,
SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio),
SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw),
SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(25, SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(25,
@ -1926,10 +1928,18 @@ static int port_enum_formats(void *object,
SPA_AUDIO_FORMAT_U8, SPA_AUDIO_FORMAT_U8,
SPA_AUDIO_FORMAT_ULAW, SPA_AUDIO_FORMAT_ULAW,
SPA_AUDIO_FORMAT_ALAW), SPA_AUDIO_FORMAT_ALAW),
SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int( 0);
rate, 1, INT32_MAX), if (!this->props.resample_disabled) {
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_rate, SPA_POD_CHOICE_RANGE_Int(
rate, 1, INT32_MAX),
0);
}
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int( SPA_FORMAT_AUDIO_channels, SPA_POD_CHOICE_RANGE_Int(
DEFAULT_CHANNELS, 1, SPA_AUDIO_MAX_CHANNELS)); DEFAULT_CHANNELS, 1, SPA_AUDIO_MAX_CHANNELS),
0);
*param = spa_pod_builder_pop(builder, &f[0]);
} }
break; break;
default: default:
@ -2205,7 +2215,7 @@ static int port_set_format(void *object,
return res; return res;
} }
if (info.info.raw.format == 0 || if (info.info.raw.format == 0 ||
info.info.raw.rate == 0 || (!this->props.resample_disabled && info.info.raw.rate == 0) ||
info.info.raw.channels == 0 || info.info.raw.channels == 0 ||
info.info.raw.channels > SPA_AUDIO_MAX_CHANNELS) { info.info.raw.channels > SPA_AUDIO_MAX_CHANNELS) {
spa_log_error(this->log, "invalid format:%d rate:%d channels:%d", spa_log_error(this->log, "invalid format:%d rate:%d channels:%d",

View file

@ -519,6 +519,8 @@ int format_parse_param(const struct spa_pod *param, bool collect,
if (ss != NULL) if (ss != NULL)
*ss = *def_ss; *ss = *def_ss;
} else { } else {
if (info.info.raw.rate == 0)
info.info.raw.rate = 48000;
if (info.info.raw.format == 0 || if (info.info.raw.format == 0 ||
info.info.raw.rate == 0 || info.info.raw.rate == 0 ||
info.info.raw.channels == 0 || info.info.raw.channels == 0 ||