alsa: Reconfigure sink sample rate for passthrough inputs

When a passthrough sink-input is added, we need to reconfigure the
sink's sample rate since no resampling occurs. We revert to the original
rate when the passthrough sink-input is removed.
This commit is contained in:
Arun Raghavan 2011-03-08 14:22:24 +05:30
parent f94bcae6bd
commit 49b10ba694

View file

@ -108,6 +108,8 @@ struct userdata {
pa_cvolume hardware_volume;
uint32_t old_rate;
size_t
frame_size,
fragment_size,
@ -1051,6 +1053,56 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
switch (code) {
case PA_SINK_MESSAGE_FINISH_MOVE:
case PA_SINK_MESSAGE_ADD_INPUT: {
pa_sink_input *i = PA_SINK_INPUT(data);
int r = 0;
if (PA_LIKELY(pa_format_info_is_pcm(i->format)))
break;
u->old_rate = u->sink->sample_spec.rate;
/* Passthrough format, see if we need to reset sink sample rate */
if (u->sink->sample_spec.rate == i->thread_info.sample_spec.rate)
break;
/* .. we do */
if ((r = suspend(u)) < 0)
return r;
u->sink->sample_spec.rate = i->thread_info.sample_spec.rate;
if ((r = unsuspend(u)) < 0)
return r;
break;
}
case PA_SINK_MESSAGE_START_MOVE:
case PA_SINK_MESSAGE_REMOVE_INPUT: {
pa_sink_input *i = PA_SINK_INPUT(data);
int r = 0;
if (PA_LIKELY(pa_format_info_is_pcm(i->format)))
break;
/* Passthrough format, see if we need to reset sink sample rate */
if (u->sink->sample_spec.rate == u->old_rate)
break;
/* .. we do */
if ((r = suspend(u)) < 0)
return r;
u->sink->sample_spec.rate = u->old_rate;
if ((r = unsuspend(u)) < 0)
return r;
break;
}
case PA_SINK_MESSAGE_GET_LATENCY: {
pa_usec_t r = 0;