mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-01 22:58:47 -04:00
pass pa_suspend_cause_t to set_state() callbacks
The suspend cause isn't yet used by any of the callbacks. The alsa sink and source will use it to sync the mixer when the SESSION suspend cause is removed. Currently the syncing is done in pa_sink/source_suspend(), and I want to change that, because pa_sink/source_suspend() shouldn't have any alsa specific code.
This commit is contained in:
parent
3da0de5418
commit
6ed37aeef2
17 changed files with 58 additions and 27 deletions
|
|
@ -1232,7 +1232,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t new_state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t new_state, pa_suspend_cause_t new_suspend_cause) {
|
||||||
pa_sink_state_t old_state;
|
pa_sink_state_t old_state;
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1087,7 +1087,7 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int source_set_state_cb(pa_source *s, pa_source_state_t new_state) {
|
static int source_set_state_cb(pa_source *s, pa_source_state_t new_state, pa_suspend_cause_t new_suspend_cause) {
|
||||||
pa_source_state_t old_state;
|
pa_source_state_t old_state;
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -477,7 +477,7 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int source_set_state_cb(pa_source *s, pa_source_state_t state) {
|
static int source_set_state_cb(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
|
|
@ -502,7 +502,7 @@ static int source_set_state_cb(pa_source *s, pa_source_state_t state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -353,7 +353,7 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
|
||||||
return pa_source_process_msg(o, code, data, offset, chunk);;
|
return pa_source_process_msg(o, code, data, offset, chunk);;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ca_sink_set_state(pa_sink *s, pa_sink_state_t state) {
|
static int ca_sink_set_state(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
coreaudio_sink *sink = s->userdata;
|
coreaudio_sink *sink = s->userdata;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
|
@ -511,7 +511,7 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ca_source_set_state(pa_source *s, pa_source_state_t state) {
|
static int ca_source_set_state(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
coreaudio_source *source = s->userdata;
|
coreaudio_source *source = s->userdata;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
|
|
||||||
|
|
@ -680,12 +680,17 @@ static void unsuspend(struct userdata *u) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state(pa_sink *sink, pa_sink_state_t state) {
|
static int sink_set_state(pa_sink *sink, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(sink);
|
pa_sink_assert_ref(sink);
|
||||||
pa_assert_se(u = sink->userdata);
|
pa_assert_se(u = sink->userdata);
|
||||||
|
|
||||||
|
/* It may be that only the suspend cause is changing, in which
|
||||||
|
* case there's nothing to do. */
|
||||||
|
if (state == u->sink->state)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Please note that in contrast to the ALSA modules we call
|
/* Please note that in contrast to the ALSA modules we call
|
||||||
* suspend/unsuspend from main context here! */
|
* suspend/unsuspend from main context here! */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -285,7 +285,7 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -392,7 +392,7 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int source_set_state_cb(pa_source *s, pa_source_state_t state) {
|
static int source_set_state_cb(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -568,11 +568,16 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
u = s->userdata;
|
u = s->userdata;
|
||||||
|
|
||||||
|
/* It may be that only the suspend cause is changing, in which
|
||||||
|
* case there's nothing to do. */
|
||||||
|
if (state == s->state)
|
||||||
|
return 0;
|
||||||
|
|
||||||
switch ((pa_sink_state_t) state) {
|
switch ((pa_sink_state_t) state) {
|
||||||
|
|
||||||
case PA_SINK_SUSPENDED:
|
case PA_SINK_SUSPENDED:
|
||||||
|
|
@ -665,11 +670,16 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int source_set_state(pa_source *s, pa_source_state_t state) {
|
static int source_set_state(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
u = s->userdata;
|
u = s->userdata;
|
||||||
|
|
||||||
|
/* It may be that only the suspend cause is changing, in which
|
||||||
|
* case there's nothing to do. */
|
||||||
|
if (state == s->state)
|
||||||
|
return 0;
|
||||||
|
|
||||||
switch ((pa_source_state_t) state) {
|
switch ((pa_source_state_t) state) {
|
||||||
|
|
||||||
case PA_SOURCE_SUSPENDED:
|
case PA_SOURCE_SUSPENDED:
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,7 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
@ -194,7 +194,7 @@ static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int source_set_state_cb(pa_source *s, pa_source_state_t state) {
|
static int source_set_state_cb(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_source_assert_ref(s);
|
pa_source_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from main context */
|
/* Called from main context */
|
||||||
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
|
static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) {
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
|
||||||
|
|
@ -427,8 +427,8 @@ static int sink_set_state(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t
|
||||||
* cause, or it might just add unnecessary complexity, given that the
|
* cause, or it might just add unnecessary complexity, given that the
|
||||||
* current approach of not setting any suspend cause works well enough. */
|
* current approach of not setting any suspend cause works well enough. */
|
||||||
|
|
||||||
if (s->set_state && state_changed) {
|
if (s->set_state) {
|
||||||
ret = s->set_state(s, state);
|
ret = s->set_state(s, state, suspend_cause);
|
||||||
/* set_state() is allowed to fail only when resuming. */
|
/* set_state() is allowed to fail only when resuming. */
|
||||||
pa_assert(ret >= 0 || resuming);
|
pa_assert(ret >= 0 || resuming);
|
||||||
}
|
}
|
||||||
|
|
@ -439,7 +439,7 @@ static int sink_set_state(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t
|
||||||
pa_assert(resuming);
|
pa_assert(resuming);
|
||||||
|
|
||||||
if (s->set_state)
|
if (s->set_state)
|
||||||
s->set_state(s, PA_SINK_SUSPENDED);
|
s->set_state(s, PA_SINK_SUSPENDED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (suspend_cause_changed) {
|
if (suspend_cause_changed) {
|
||||||
|
|
|
||||||
|
|
@ -126,8 +126,16 @@ struct pa_sink {
|
||||||
|
|
||||||
/* Called when the main loop requests a state change. Called from
|
/* Called when the main loop requests a state change. Called from
|
||||||
* main loop context. If returns -1 the state change will be
|
* main loop context. If returns -1 the state change will be
|
||||||
* inhibited */
|
* inhibited. This will also be called even if only the suspend cause
|
||||||
int (*set_state)(pa_sink *s, pa_sink_state_t state); /* may be NULL */
|
* changes.
|
||||||
|
*
|
||||||
|
* s->state and s->suspend_cause haven't been updated yet when this is
|
||||||
|
* called, so the callback can get the old state through those variables.
|
||||||
|
*
|
||||||
|
* If set_state() is successful, the IO thread will be notified with the
|
||||||
|
* SET_STATE message. The message handler is allowed to fail, in which
|
||||||
|
* case the old state is restored, and set_state() is called again. */
|
||||||
|
int (*set_state)(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause); /* may be NULL */
|
||||||
|
|
||||||
/* Sink drivers that support hardware volume may set this
|
/* Sink drivers that support hardware volume may set this
|
||||||
* callback. This is called when the current volume needs to be
|
* callback. This is called when the current volume needs to be
|
||||||
|
|
|
||||||
|
|
@ -381,8 +381,8 @@ static int source_set_state(pa_source *s, pa_source_state_t state, pa_suspend_ca
|
||||||
* cause, or it might just add unnecessary complexity, given that the
|
* cause, or it might just add unnecessary complexity, given that the
|
||||||
* current approach of not setting any suspend cause works well enough. */
|
* current approach of not setting any suspend cause works well enough. */
|
||||||
|
|
||||||
if (s->set_state && state_changed) {
|
if (s->set_state) {
|
||||||
ret = s->set_state(s, state);
|
ret = s->set_state(s, state, suspend_cause);
|
||||||
/* set_state() is allowed to fail only when resuming. */
|
/* set_state() is allowed to fail only when resuming. */
|
||||||
pa_assert(ret >= 0 || resuming);
|
pa_assert(ret >= 0 || resuming);
|
||||||
}
|
}
|
||||||
|
|
@ -393,7 +393,7 @@ static int source_set_state(pa_source *s, pa_source_state_t state, pa_suspend_ca
|
||||||
pa_assert(resuming);
|
pa_assert(resuming);
|
||||||
|
|
||||||
if (s->set_state)
|
if (s->set_state)
|
||||||
s->set_state(s, PA_SOURCE_SUSPENDED);
|
s->set_state(s, PA_SOURCE_SUSPENDED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (suspend_cause_changed) {
|
if (suspend_cause_changed) {
|
||||||
|
|
|
||||||
|
|
@ -127,8 +127,16 @@ struct pa_source {
|
||||||
|
|
||||||
/* Called when the main loop requests a state change. Called from
|
/* Called when the main loop requests a state change. Called from
|
||||||
* main loop context. If returns -1 the state change will be
|
* main loop context. If returns -1 the state change will be
|
||||||
* inhibited */
|
* inhibited. This will also be called even if only the suspend cause
|
||||||
int (*set_state)(pa_source*source, pa_source_state_t state); /* may be NULL */
|
* changes.
|
||||||
|
*
|
||||||
|
* s->state and s->suspend_cause haven't been updated yet when this is
|
||||||
|
* called, so the callback can get the old state through those variables.
|
||||||
|
*
|
||||||
|
* If set_state() is successful, the IO thread will be notified with the
|
||||||
|
* SET_STATE message. The message handler is allowed to fail, in which
|
||||||
|
* case the old state is restored, and set_state() is called again. */
|
||||||
|
int (*set_state)(pa_source *source, pa_source_state_t state, pa_suspend_cause_t suspend_cause); /* may be NULL */
|
||||||
|
|
||||||
/* Called when the volume is queried. Called from main loop
|
/* Called when the volume is queried. Called from main loop
|
||||||
* context. If this is NULL a PA_SOURCE_MESSAGE_GET_VOLUME message
|
* context. If this is NULL a PA_SOURCE_MESSAGE_GET_VOLUME message
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue