source: Bring rate update code in sync with sink code

Basically adds code to handle passthrough sources. This isn't a tested
path at the moment, but in the future, when we do wish to support these,
it'll save us the trouble of having to sync all the code again.
This commit is contained in:
Arun Raghavan 2011-10-11 00:47:56 +05:30
parent b232fbd8f8
commit b9ff90fef8
4 changed files with 32 additions and 21 deletions

View file

@ -1380,8 +1380,8 @@ pa_bool_t pa_sink_update_rate(pa_sink *s, uint32_t rate, pa_bool_t passthrough)
if (s->update_rate(s, desired_rate) == TRUE) {
/* update monitor source as well */
if (s->monitor_source)
pa_source_update_rate(s->monitor_source, desired_rate);
if (s->monitor_source && !passthrough)
pa_source_update_rate(s->monitor_source, desired_rate, FALSE);
pa_log_info("Changed sampling rate successfully");
return TRUE;
}

View file

@ -354,7 +354,11 @@ int pa_source_output_new(
module-suspend-on-idle can resume a source */
pa_log_info("Trying to change sample rate");
pa_source_update_rate(data->source, data->sample_spec.rate);
if (pa_source_update_rate(data->source, data->sample_spec.rate, pa_source_output_new_data_is_passthrough(data)) == TRUE)
pa_log_info("Rate changed to %u kHz",
data->source->sample_spec.rate);
else
pa_log_info("Resampling enabled to %u kHz", data->source->sample_spec.rate);
}
if (data->resample_method == PA_RESAMPLER_INVALID)
@ -1401,7 +1405,7 @@ int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, pa_bool_t
SOURCE_OUTPUT_MOVE_FINISH hook */
pa_log_info("Trying to change sample rate");
if (pa_source_update_rate(dest, o->sample_spec.rate) == TRUE)
if (pa_source_update_rate(dest, o->sample_spec.rate, pa_source_output_is_passthrough(o)) == TRUE)
pa_log_info("Rate changed to %u kHz",
dest->sample_spec.rate);
else

View file

@ -921,9 +921,8 @@ void pa_source_post_direct(pa_source*s, pa_source_output *o, const pa_memchunk *
}
/* Called from main thread */
pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate)
pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrough)
{
if (s->update_rate) {
uint32_t desired_rate = rate;
uint32_t default_rate = s->default_sample_rate;
@ -933,13 +932,14 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate)
if (PA_SOURCE_IS_RUNNING(s->state)) {
pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u kHz",
s->sample_spec.rate);
return FALSE; /* cannot reconfigure a RUNNING source without glitches */
return FALSE;
}
if (PA_UNLIKELY (desired_rate < 8000 ||
desired_rate > PA_RATE_MAX))
return FALSE;
if (!passthrough) {
pa_assert(default_rate % 4000 || default_rate % 11025);
pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
@ -957,6 +957,13 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate)
desired_rate = alternate_rate;
else
desired_rate = default_rate;
} else {
desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
}
if (passthrough || pa_source_used_by(s) == 0) {
pa_source_suspend(s, TRUE, PA_SUSPEND_IDLE); /* needed before rate update, will be resumed automatically */
}
if (s->update_rate(s, desired_rate) == TRUE) {
pa_log_info("Changed sampling rate successfully ");

View file

@ -367,7 +367,7 @@ pa_bool_t pa_source_get_mute(pa_source *source, pa_bool_t force_refresh);
pa_bool_t pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist *p);
int pa_source_set_port(pa_source *s, const char *name, pa_bool_t save);
pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate);
pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate, pa_bool_t passthrough);
unsigned pa_source_linked_by(pa_source *s); /* Number of connected streams */
unsigned pa_source_used_by(pa_source *s); /* Number of connected streams that are not corked */