mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-03 09:01:50 -05:00
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:
parent
b232fbd8f8
commit
b9ff90fef8
4 changed files with 32 additions and 21 deletions
|
|
@ -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) {
|
if (s->update_rate(s, desired_rate) == TRUE) {
|
||||||
/* update monitor source as well */
|
/* update monitor source as well */
|
||||||
if (s->monitor_source)
|
if (s->monitor_source && !passthrough)
|
||||||
pa_source_update_rate(s->monitor_source, desired_rate);
|
pa_source_update_rate(s->monitor_source, desired_rate, FALSE);
|
||||||
pa_log_info("Changed sampling rate successfully");
|
pa_log_info("Changed sampling rate successfully");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -354,7 +354,11 @@ int pa_source_output_new(
|
||||||
module-suspend-on-idle can resume a source */
|
module-suspend-on-idle can resume a source */
|
||||||
|
|
||||||
pa_log_info("Trying to change sample rate");
|
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)
|
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 */
|
SOURCE_OUTPUT_MOVE_FINISH hook */
|
||||||
|
|
||||||
pa_log_info("Trying to change sample rate");
|
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",
|
pa_log_info("Rate changed to %u kHz",
|
||||||
dest->sample_spec.rate);
|
dest->sample_spec.rate);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -921,9 +921,8 @@ void pa_source_post_direct(pa_source*s, pa_source_output *o, const pa_memchunk *
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main thread */
|
/* 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) {
|
if (s->update_rate) {
|
||||||
uint32_t desired_rate = rate;
|
uint32_t desired_rate = rate;
|
||||||
uint32_t default_rate = s->default_sample_rate;
|
uint32_t default_rate = s->default_sample_rate;
|
||||||
|
|
@ -933,30 +932,38 @@ pa_bool_t pa_source_update_rate(pa_source *s, uint32_t rate)
|
||||||
if (PA_SOURCE_IS_RUNNING(s->state)) {
|
if (PA_SOURCE_IS_RUNNING(s->state)) {
|
||||||
pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u kHz",
|
pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u kHz",
|
||||||
s->sample_spec.rate);
|
s->sample_spec.rate);
|
||||||
return FALSE; /* cannot reconfigure a RUNNING source without glitches */
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PA_UNLIKELY (desired_rate < 8000 ||
|
if (PA_UNLIKELY (desired_rate < 8000 ||
|
||||||
desired_rate > PA_RATE_MAX))
|
desired_rate > PA_RATE_MAX))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
pa_assert(default_rate % 4000 || default_rate % 11025);
|
if (!passthrough) {
|
||||||
pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
|
pa_assert(default_rate % 4000 || default_rate % 11025);
|
||||||
|
pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
|
||||||
|
|
||||||
if (default_rate % 4000) {
|
if (default_rate % 4000) {
|
||||||
/* default is a 11025 multiple */
|
/* default is a 11025 multiple */
|
||||||
if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
|
if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
|
||||||
use_alternate=TRUE;
|
use_alternate=TRUE;
|
||||||
|
} else {
|
||||||
|
/* default is 4000 multiple */
|
||||||
|
if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
|
||||||
|
use_alternate=TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_alternate)
|
||||||
|
desired_rate = alternate_rate;
|
||||||
|
else
|
||||||
|
desired_rate = default_rate;
|
||||||
} else {
|
} else {
|
||||||
/* default is 4000 multiple */
|
desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
|
||||||
if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
|
|
||||||
use_alternate=TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_alternate)
|
if (passthrough || pa_source_used_by(s) == 0) {
|
||||||
desired_rate = alternate_rate;
|
pa_source_suspend(s, TRUE, PA_SUSPEND_IDLE); /* needed before rate update, will be resumed automatically */
|
||||||
else
|
}
|
||||||
desired_rate = default_rate;
|
|
||||||
|
|
||||||
if (s->update_rate(s, desired_rate) == TRUE) {
|
if (s->update_rate(s, desired_rate) == TRUE) {
|
||||||
pa_log_info("Changed sampling rate successfully ");
|
pa_log_info("Changed sampling rate successfully ");
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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);
|
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_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 */
|
unsigned pa_source_used_by(pa_source *s); /* Number of connected streams that are not corked */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue