The sample spec fixup when FIX* flags are set was not being propagated to the pa_format_info, causing the two to be out of sync when FIX* was used. (I'd like to push this to master and next since it's fairly trivial) --- src/pulsecore/sink-input.c | 13 +++++++++++-- src/pulsecore/source-output.c | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c index 6131bd3..30d4269 100644 --- a/src/pulsecore/sink-input.c +++ b/src/pulsecore/sink-input.c @@ -381,17 +381,26 @@ int pa_sink_input_new( if (!data->muted_is_set) data->muted = FALSE; - if (data->flags & PA_SINK_INPUT_FIX_FORMAT) + if (data->flags & PA_SINK_INPUT_FIX_FORMAT) { + pa_return_val_if_fail(pa_format_info_is_pcm(data->format), -PA_ERR_INVALID); data->sample_spec.format = data->sink->sample_spec.format; + pa_format_info_set_sample_format(data->format, data->sample_spec.format); + } - if (data->flags & PA_SINK_INPUT_FIX_RATE) + if (data->flags & PA_SINK_INPUT_FIX_RATE) { + pa_return_val_if_fail(pa_format_info_is_pcm(data->format), -PA_ERR_INVALID); data->sample_spec.rate = data->sink->sample_spec.rate; + pa_format_info_set_rate(data->format, data->sample_spec.rate); + } original_cm = data->channel_map; if (data->flags & PA_SINK_INPUT_FIX_CHANNELS) { + pa_return_val_if_fail(pa_format_info_is_pcm(data->format), -PA_ERR_INVALID); data->sample_spec.channels = data->sink->sample_spec.channels; data->channel_map = data->sink->channel_map; + pa_format_info_set_channels(data->format, data->sample_spec.channels); + pa_format_info_set_channel_map(data->format, &data->channel_map); } pa_assert(pa_sample_spec_valid(&data->sample_spec)); diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c index d942419..77fcc56 100644 --- a/src/pulsecore/source-output.c +++ b/src/pulsecore/source-output.c @@ -324,17 +324,26 @@ int pa_source_output_new( if (!data->muted_is_set) data->muted = FALSE; - if (data->flags & PA_SOURCE_OUTPUT_FIX_FORMAT) + if (data->flags & PA_SOURCE_OUTPUT_FIX_FORMAT) { + pa_return_val_if_fail(pa_format_info_is_pcm(data->format), -PA_ERR_INVALID); data->sample_spec.format = data->source->sample_spec.format; + pa_format_info_set_sample_format(data->format, data->sample_spec.format); + } - if (data->flags & PA_SOURCE_OUTPUT_FIX_RATE) + if (data->flags & PA_SOURCE_OUTPUT_FIX_RATE) { + pa_return_val_if_fail(pa_format_info_is_pcm(data->format), -PA_ERR_INVALID); + pa_format_info_set_rate(data->format, data->sample_spec.rate); data->sample_spec.rate = data->source->sample_spec.rate; + } original_cm = data->channel_map; if (data->flags & PA_SOURCE_OUTPUT_FIX_CHANNELS) { + pa_return_val_if_fail(pa_format_info_is_pcm(data->format), -PA_ERR_INVALID); data->sample_spec.channels = data->source->sample_spec.channels; data->channel_map = data->source->channel_map; + pa_format_info_set_channels(data->format, data->sample_spec.channels); + pa_format_info_set_channel_map(data->format, &data->channel_map); } pa_assert(pa_sample_spec_valid(&data->sample_spec)); -- 1.8.2.1