mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-07 13:30:03 -05:00
sink, source: Rework reconfiguration logic to apply to more than rate
This rejigs the update_rate() logic to encompass changes to the sample spec as a whole, as well as passthrough status. As a result, sinks/sources provide a reconfigure() method which allows reconfiguration as required. The behaviour itself is currently unchanged -- alsa-sink/-source do not actually implement anything other than rate updates for now (nor are they ever requested to). This can be modified in the future, to allow, for example 24-bit output when incoming media supports it, as well as channel count changes for passthrough sinks. Another related change is that passthrough status is now part of sink/source reconfiguration, and we can stop doing a suspend/unsuspend when entering/leaving passthrough state. So that part is now divided in two -- pa_sink_reconfigure() sets the sink in passthrough mode if required, and pa_sink_enter_passthrough() sets up everything else (this currently means only volumes, but could disable other processing) for passthrough mode.
This commit is contained in:
parent
4f1041c271
commit
7a7072557a
8 changed files with 90 additions and 94 deletions
|
|
@ -1596,31 +1596,35 @@ static bool sink_set_formats(pa_sink *s, pa_idxset *formats) {
|
|||
return true;
|
||||
}
|
||||
|
||||
static int sink_update_rate_cb(pa_sink *s, uint32_t rate) {
|
||||
static int sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, bool passthrough) {
|
||||
struct userdata *u = s->userdata;
|
||||
int i;
|
||||
bool supported = false;
|
||||
|
||||
/* FIXME: we only update rate for now */
|
||||
|
||||
pa_assert(u);
|
||||
|
||||
for (i = 0; u->rates[i]; i++) {
|
||||
if (u->rates[i] == rate) {
|
||||
if (u->rates[i] == spec->rate) {
|
||||
supported = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!supported) {
|
||||
pa_log_info("Sink does not support sample rate of %d Hz", rate);
|
||||
pa_log_info("Sink does not support sample rate of %d Hz", spec->rate);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!PA_SINK_IS_OPENED(s->state)) {
|
||||
pa_log_info("Updating rate for device %s, new rate is %d",u->device_name, rate);
|
||||
u->sink->sample_spec.rate = rate;
|
||||
pa_log_info("Updating rate for device %s, new rate is %d", u->device_name, spec->rate);
|
||||
u->sink->sample_spec.rate = spec->rate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Passthrough status change is handled during unsuspend */
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -2357,7 +2361,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
|||
else
|
||||
u->sink->set_port = sink_set_port_cb;
|
||||
if (u->sink->alternate_sample_rate)
|
||||
u->sink->update_rate = sink_update_rate_cb;
|
||||
u->sink->reconfigure = sink_reconfigure_cb;
|
||||
u->sink->userdata = u;
|
||||
|
||||
pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
|
||||
|
|
|
|||
|
|
@ -1398,28 +1398,30 @@ static void source_update_requested_latency_cb(pa_source *s) {
|
|||
update_sw_params(u);
|
||||
}
|
||||
|
||||
static int source_update_rate_cb(pa_source *s, uint32_t rate) {
|
||||
static int source_reconfigure_cb(pa_source *s, pa_sample_spec *spec, bool passthrough) {
|
||||
struct userdata *u = s->userdata;
|
||||
int i;
|
||||
bool supported = false;
|
||||
|
||||
/* FIXME: we only update rate for now */
|
||||
|
||||
pa_assert(u);
|
||||
|
||||
for (i = 0; u->rates[i]; i++) {
|
||||
if (u->rates[i] == rate) {
|
||||
if (u->rates[i] == spec->rate) {
|
||||
supported = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!supported) {
|
||||
pa_log_info("Source does not support sample rate of %d Hz", rate);
|
||||
pa_log_info("Source does not support sample rate of %d Hz", spec->rate);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!PA_SOURCE_IS_OPENED(s->state)) {
|
||||
pa_log_info("Updating rate for device %s, new rate is %d", u->device_name, rate);
|
||||
u->source->sample_spec.rate = rate;
|
||||
pa_log_info("Updating rate for device %s, new rate is %d", u->device_name, spec->rate);
|
||||
u->source->sample_spec.rate = spec->rate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2041,7 +2043,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
|||
else
|
||||
u->source->set_port = source_set_port_cb;
|
||||
if (u->source->alternate_sample_rate)
|
||||
u->source->update_rate = source_update_rate_cb;
|
||||
u->source->reconfigure = source_reconfigure_cb;
|
||||
u->source->userdata = u;
|
||||
|
||||
pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue