diff --git a/src/modules/module-null-sink.c b/src/modules/module-null-sink.c index 4afbd26df..34b9be639 100644 --- a/src/modules/module-null-sink.c +++ b/src/modules/module-null-sink.c @@ -178,8 +178,9 @@ 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) { - /* We don't need to do anything */ - s->sample_spec = *spec; + pa_sink_assert_ref(s); + + pa_sink_set_sample_spec(s, spec); if (map) pa_sink_set_channel_map(s, map); diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index f6d15b9e3..479e0915c 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -4046,6 +4046,28 @@ done: return out_formats; } +/* Called from the main thread */ +void pa_sink_set_sample_spec(pa_sink *s, pa_sample_spec *spec) { + pa_sample_spec old_spec; + char spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX], old_spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX]; + + 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; diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 9ff68c877..eab41b7c3 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -527,6 +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); diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index 58e4e458a..a5542428d 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -3040,6 +3040,28 @@ done: return out_formats; } +/* Called from the main thread */ +void pa_source_set_sample_spec(pa_source *s, pa_sample_spec *spec) { + pa_sample_spec old_spec; + char spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX], old_spec_str[PA_SAMPLE_SPEC_SNPRINT_MAX]; + + 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; diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h index 8c67b2d4b..2a24264a7 100644 --- a/src/pulsecore/source.h +++ b/src/pulsecore/source.h @@ -448,6 +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);