From 2046afe683ef7ace0badec2b964ef01ee52d8d54 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Wed, 12 Jan 2022 23:12:21 -0500 Subject: [PATCH] sink, source: Merge sink sample spec setter functions into one It seems better to update the whole sample spec (and channel map) at a shot rather than piecemeal. --- src/modules/alsa/alsa-sink.c | 38 +++--------- src/modules/alsa/alsa-source.c | 36 +++-------- src/modules/module-null-sink.c | 10 +-- src/pulsecore/sink.c | 110 +++++++-------------------------- src/pulsecore/sink.h | 6 +- src/pulsecore/source.c | 110 +++++++-------------------------- src/pulsecore/source.h | 6 +- 7 files changed, 67 insertions(+), 249 deletions(-) diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index 6f9a71888..46483a7e6 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -1824,22 +1824,15 @@ static int sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, pa_channel_map bool format_supported = false; bool rate_supported = false; bool channels_supported = false; -#ifdef USE_SMOOTHER_2 pa_sample_spec effective_spec; -#endif pa_assert(u); -#ifdef USE_SMOOTHER_2 - effective_spec.channels = s->sample_spec.channels; -#endif + effective_spec = s->sample_spec; for (i = 0; u->supported_formats[i] != PA_SAMPLE_MAX; i++) { if (u->supported_formats[i] == spec->format) { - pa_sink_set_sample_format(u->sink, spec->format); -#ifdef USE_SMOOTHER_2 effective_spec.format = spec->format; -#endif format_supported = true; break; } @@ -1848,18 +1841,12 @@ static int sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, pa_channel_map if (!format_supported) { pa_log_info("Sink does not support sample format of %s, set it to a verified value", pa_sample_format_to_string(spec->format)); - pa_sink_set_sample_format(u->sink, u->verified_sample_spec.format); -#ifdef USE_SMOOTHER_2 effective_spec.format = u->verified_sample_spec.format; -#endif } for (i = 0; u->supported_rates[i]; i++) { if (u->supported_rates[i] == spec->rate) { - pa_sink_set_sample_rate(u->sink, spec->rate); -#ifdef USE_SMOOTHER_2 effective_spec.rate = spec->rate; -#endif rate_supported = true; break; } @@ -1867,19 +1854,12 @@ static int sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, pa_channel_map if (!rate_supported) { pa_log_info("Sink does not support sample rate of %u, set it to a verified value", spec->rate); - pa_sink_set_sample_rate(u->sink, u->verified_sample_spec.rate); -#ifdef USE_SMOOTHER_2 effective_spec.rate = u->verified_sample_spec.rate; -#endif } -#ifdef USE_SMOOTHER_2 - pa_smoother_2_set_sample_spec(u->smoother, pa_rtclock_now(), &effective_spec); -#endif - for (i = 0; u->supported_channels[i]; i++) { if (u->supported_channels[i] == spec->channels) { - pa_sink_set_channels(u->sink, spec->channels); + effective_spec.channels = spec->channels; channels_supported = true; break; } @@ -1887,16 +1867,14 @@ static int sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, pa_channel_map if (!channels_supported) { pa_log_info("Sink does not support %u channels, set it to a verified value", spec->channels); - pa_sink_set_channels(u->sink, u->verified_sample_spec.channels); + effective_spec.channels = u->verified_sample_spec.channels; } - if (map) { - pa_sink_set_channel_map(s, map); - } else { - pa_channel_map def_map; - pa_channel_map_init_auto(&def_map, spec->channels, PA_CHANNEL_MAP_DEFAULT); - pa_sink_set_channel_map(s, &def_map); - } + pa_sink_set_sample_spec(u->sink, &effective_spec, map); + +#ifdef USE_SMOOTHER_2 + pa_smoother_2_set_sample_spec(u->smoother, pa_rtclock_now(), &effective_spec); +#endif /* Passthrough status change is handled during unsuspend */ diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index 9be79d37d..feedf4e01 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -1645,16 +1645,11 @@ static int source_reconfigure_cb(pa_source *s, pa_sample_spec *spec, pa_channel_ pa_assert(u); -#ifdef USE_SMOOTHER_2 - effective_spec.channels = s->sample_spec.channels; -#endif + effective_spec = s->sample_spec; for (i = 0; u->supported_formats[i] != PA_SAMPLE_MAX; i++) { if (u->supported_formats[i] == spec->format) { - pa_source_set_sample_format(u->source, spec->format); -#ifdef USE_SMOOTHER_2 effective_spec.format = spec->format; -#endif format_supported = true; break; } @@ -1663,18 +1658,12 @@ static int source_reconfigure_cb(pa_source *s, pa_sample_spec *spec, pa_channel_ if (!format_supported) { pa_log_info("Source does not support sample format of %s, set it to a verified value", pa_sample_format_to_string(spec->format)); - pa_source_set_sample_format(u->source, u->verified_sample_spec.format); -#ifdef USE_SMOOTHER_2 effective_spec.format = u->verified_sample_spec.format; -#endif } for (i = 0; u->supported_rates[i]; i++) { if (u->supported_rates[i] == spec->rate) { - pa_source_set_sample_rate(u->source, spec->rate); -#ifdef USE_SMOOTHER_2 effective_spec.rate = spec->rate; -#endif rate_supported = true; break; } @@ -1682,19 +1671,12 @@ static int source_reconfigure_cb(pa_source *s, pa_sample_spec *spec, pa_channel_ if (!rate_supported) { pa_log_info("Source does not support sample rate of %u, set it to a verfied value", spec->rate); - pa_source_set_sample_rate(u->source, u->verified_sample_spec.rate); -#ifdef USE_SMOOTHER_2 effective_spec.rate = u->verified_sample_spec.rate; -#endif } -#ifdef USE_SMOOTHER_2 - pa_smoother_2_set_sample_spec(u->smoother, pa_rtclock_now(), &effective_spec); -#endif - for (i = 0; u->supported_channels[i]; i++) { if (u->supported_channels[i] == spec->channels) { - pa_source_set_channels(u->source, spec->channels); + effective_spec.channels = spec->channels; channels_supported = true; break; } @@ -1702,16 +1684,14 @@ static int source_reconfigure_cb(pa_source *s, pa_sample_spec *spec, pa_channel_ if (!channels_supported) { pa_log_info("Sink does not support %u channels, set it to a verified value", spec->channels); - pa_source_set_channels(u->source, u->verified_sample_spec.channels); + effective_spec.channels = u->verified_sample_spec.channels; } - if (map) { - pa_source_set_channel_map(s, map); - } else { - pa_channel_map def_map; - pa_channel_map_init_auto(&def_map, spec->channels, PA_CHANNEL_MAP_DEFAULT); - pa_source_set_channel_map(s, &def_map); - } + pa_source_set_sample_spec(u->source, &effective_spec, map); + +#if USE_SMOOTHER_2 + pa_smoother_2_set_sample_spec(u->smoother, pa_rtclock_now(), &effective_spec); +#endif return 0; } diff --git a/src/modules/module-null-sink.c b/src/modules/module-null-sink.c index 34b9be639..36477bf58 100644 --- a/src/modules/module-null-sink.c +++ b/src/modules/module-null-sink.c @@ -180,15 +180,7 @@ static void sink_update_requested_latency_cb(pa_sink *s) { static int sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, pa_channel_map *map, bool passthrough) { pa_sink_assert_ref(s); - pa_sink_set_sample_spec(s, spec); - - if (map) - pa_sink_set_channel_map(s, map); - else { - pa_channel_map def_map; - pa_channel_map_init_auto(&def_map, spec->channels, PA_CHANNEL_MAP_DEFAULT); - pa_sink_set_channel_map(s, &def_map); - } + pa_sink_set_sample_spec(s, spec, map); return 0; } diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index a615922bc..1e7f82906 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -4050,103 +4050,41 @@ done: } /* Called from the main thread */ -void pa_sink_set_sample_spec(pa_sink *s, pa_sample_spec *spec) { +void pa_sink_set_sample_spec(pa_sink *s, pa_sample_spec *spec, pa_channel_map *map) { pa_sample_spec old_spec; + pa_channel_map old_map; char spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX], old_spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX]; + char old_map_str[PA_CHANNEL_MAP_SNPRINT_MAX], new_map_str[PA_CHANNEL_MAP_SNPRINT_MAX]; + bool changed = false; pa_assert(s); pa_assert(pa_sample_spec_valid(spec)); - - old_spec = s->sample_spec; - if (pa_sample_spec_equal(&old_spec, spec)) - return; - - pa_sample_spec_snprint(spec_str, sizeof(spec_str), spec); - pa_sample_spec_snprint(old_spec_str, sizeof(old_spec_str), &old_spec); - - pa_log_info("%s: spec: %s -> %s", s->name, old_spec_str, spec_str); - - s->sample_spec = *spec; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_sink_set_sample_format(pa_sink *s, pa_sample_format_t format) { - pa_sample_format_t old_format; - - pa_assert(s); - pa_assert(pa_sample_format_valid(format)); - - old_format = s->sample_spec.format; - if (old_format == format) - return; - - pa_log_info("%s: format: %s -> %s", - s->name, pa_sample_format_to_string(old_format), pa_sample_format_to_string(format)); - - s->sample_spec.format = format; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_sink_set_sample_rate(pa_sink *s, uint32_t rate) { - uint32_t old_rate; - - pa_assert(s); - pa_assert(pa_sample_rate_valid(rate)); - - old_rate = s->sample_spec.rate; - if (old_rate == rate) - return; - - pa_log_info("%s: rate: %u -> %u", s->name, old_rate, rate); - - s->sample_spec.rate = rate; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_sink_set_channels(pa_sink *s, uint8_t channels) { - uint8_t old_channels; - - pa_assert(s); - pa_assert(pa_channels_valid(channels)); - - old_channels = s->sample_spec.channels; - if (old_channels == channels) - return; - - pa_log_info("%s: channels: %u -> %u", s->name, old_channels, channels); - - s->sample_spec.channels = channels; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_sink_set_channel_map(pa_sink *s, pa_channel_map *map) { - pa_channel_map old_map; - char old_map_str[PA_CHANNEL_MAP_SNPRINT_MAX]; - char new_map_str[PA_CHANNEL_MAP_SNPRINT_MAX]; - - pa_assert(s); pa_assert(map); pa_assert(pa_channel_map_valid(map)); + old_spec = s->sample_spec; + if (!pa_sample_spec_equal(&old_spec, spec)) { + pa_sample_spec_snprint(spec_str, sizeof(spec_str), spec); + pa_sample_spec_snprint(old_spec_str, sizeof(old_spec_str), &old_spec); + + pa_log_info("%s: spec: %s -> %s", s->name, old_spec_str, spec_str); + + s->sample_spec = *spec; + changed = true; + } + old_map = s->channel_map; - if (pa_channel_map_equal(&old_map, map)) - return; + if (!pa_channel_map_equal(&old_map, map)) { + pa_log_info("%s: channel map: %s -> %s", s->name, + pa_channel_map_snprint(old_map_str, sizeof(old_map_str), &old_map), + pa_channel_map_snprint(new_map_str, sizeof(new_map_str), map)); - pa_log_info("%s: channel map: %s -> %s", s->name, - pa_channel_map_snprint(old_map_str, sizeof(old_map_str), &old_map), - pa_channel_map_snprint(new_map_str, sizeof(new_map_str), map)); + s->channel_map = *map; + changed = true; + } - s->channel_map = *map; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); + if (changed) + pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); } /* Called from the main thread. */ diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 0bd6203fc..04d882aff 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -527,11 +527,7 @@ bool pa_sink_set_formats(pa_sink *s, pa_idxset *formats); bool pa_sink_check_format(pa_sink *s, pa_format_info *f); pa_idxset* pa_sink_check_formats(pa_sink *s, pa_idxset *in_formats); -void pa_sink_set_sample_spec(pa_sink *s, pa_sample_spec *spec); -void pa_sink_set_sample_format(pa_sink *s, pa_sample_format_t format); -void pa_sink_set_sample_rate(pa_sink *s, uint32_t rate); -void pa_sink_set_channels(pa_sink *s, uint8_t channels); -void pa_sink_set_channel_map(pa_sink *s, pa_channel_map *map); +void pa_sink_set_sample_spec(pa_sink *s, pa_sample_spec *spec, pa_channel_map *map); /*** To be called exclusively by the sink driver, from IO context */ diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index e5c39196e..cf6e3456f 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -3045,103 +3045,41 @@ done: } /* Called from the main thread */ -void pa_source_set_sample_spec(pa_source *s, pa_sample_spec *spec) { +void pa_source_set_sample_spec(pa_source *s, pa_sample_spec *spec, pa_channel_map *map) { pa_sample_spec old_spec; + pa_channel_map old_map; char spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX], old_spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX]; + char old_map_str[PA_CHANNEL_MAP_SNPRINT_MAX], new_map_str[PA_CHANNEL_MAP_SNPRINT_MAX]; + bool changed = false; pa_assert(s); pa_assert(pa_sample_spec_valid(spec)); - - old_spec = s->sample_spec; - if (pa_sample_spec_equal(&old_spec, spec)) - return; - - pa_sample_spec_snprint(spec_str, sizeof(spec_str), spec); - pa_sample_spec_snprint(old_spec_str, sizeof(old_spec_str), &old_spec); - - pa_log_info("%s: spec: %s -> %s", s->name, old_spec_str, spec_str); - - s->sample_spec = *spec; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_source_set_sample_format(pa_source *s, pa_sample_format_t format) { - pa_sample_format_t old_format; - - pa_assert(s); - pa_assert(pa_sample_format_valid(format)); - - old_format = s->sample_spec.format; - if (old_format == format) - return; - - pa_log_info("%s: format: %s -> %s", - s->name, pa_sample_format_to_string(old_format), pa_sample_format_to_string(format)); - - s->sample_spec.format = format; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_source_set_sample_rate(pa_source *s, uint32_t rate) { - uint32_t old_rate; - - pa_assert(s); - pa_assert(pa_sample_rate_valid(rate)); - - old_rate = s->sample_spec.rate; - if (old_rate == rate) - return; - - pa_log_info("%s: rate: %u -> %u", s->name, old_rate, rate); - - s->sample_spec.rate = rate; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_source_set_channels(pa_source *s, uint8_t channels) { - uint8_t old_channels; - - pa_assert(s); - pa_assert(pa_channels_valid(channels)); - - old_channels = s->sample_spec.channels; - if (old_channels == channels) - return; - - pa_log_info("%s: channels: %u -> %u", s->name, old_channels, channels); - - s->sample_spec.channels = channels; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); -} - -/* Called from the main thread */ -void pa_source_set_channel_map(pa_source *s, pa_channel_map *map) { - pa_channel_map old_map; - char old_map_str[PA_CHANNEL_MAP_SNPRINT_MAX]; - char new_map_str[PA_CHANNEL_MAP_SNPRINT_MAX]; - - pa_assert(s); pa_assert(map); pa_assert(pa_channel_map_valid(map)); + old_spec = s->sample_spec; + if (!pa_sample_spec_equal(&old_spec, spec)) { + pa_sample_spec_snprint(spec_str, sizeof(spec_str), spec); + pa_sample_spec_snprint(old_spec_str, sizeof(old_spec_str), &old_spec); + + pa_log_info("%s: spec: %s -> %s", s->name, old_spec_str, spec_str); + + s->sample_spec = *spec; + changed = true; + } + old_map = s->channel_map; - if (pa_channel_map_equal(&old_map, map)) - return; + if (!pa_channel_map_equal(&old_map, map)) { + pa_log_info("%s: channel map: %s -> %s", s->name, + pa_channel_map_snprint(old_map_str, sizeof(old_map_str), &old_map), + pa_channel_map_snprint(new_map_str, sizeof(new_map_str), map)); - pa_log_info("%s: channel map: %s -> %s", s->name, - pa_channel_map_snprint(old_map_str, sizeof(old_map_str), &old_map), - pa_channel_map_snprint(new_map_str, sizeof(new_map_str), map)); + s->channel_map = *map; + changed = true; + } - s->channel_map = *map; - - pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); + if (changed) + pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index); } /* Called from the main thread. */ diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index 6decf96d2..3ef4e3804 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -448,11 +448,7 @@ pa_idxset* pa_source_get_formats(pa_source *s); bool pa_source_check_format(pa_source *s, pa_format_info *f); pa_idxset* pa_source_check_formats(pa_source *s, pa_idxset *in_formats); -void pa_source_set_sample_spec(pa_source *s, pa_sample_spec *spec); -void pa_source_set_sample_format(pa_source *s, pa_sample_format_t format); -void pa_source_set_sample_rate(pa_source *s, uint32_t rate); -void pa_source_set_channels(pa_source *s, uint8_t channels); -void pa_source_set_channel_map(pa_source *s, pa_channel_map *map); +void pa_source_set_sample_spec(pa_source *s, pa_sample_spec *spec, pa_channel_map *map); /*** To be called exclusively by the source driver, from IO context */