38
38
#include "module-suspend-on-idle-symdef.h"
40
PA_MODULE_AUTHOR("Lennart Poettering")
41
PA_MODULE_DESCRIPTION("When a sink/source is idle for too long, suspend it")
42
PA_MODULE_VERSION(PACKAGE_VERSION)
40
PA_MODULE_AUTHOR("Lennart Poettering");
41
PA_MODULE_DESCRIPTION("When a sink/source is idle for too long, suspend it");
42
PA_MODULE_VERSION(PACKAGE_VERSION);
43
PA_MODULE_LOAD_ONCE(TRUE);
44
45
static const char* const valid_modargs[] = {
65
66
*source_output_unlink_slot,
66
67
*sink_input_move_slot,
67
68
*source_output_move_slot,
68
*sink_input_move_post_slot,
69
*source_output_move_post_slot,
70
69
*sink_input_state_changed_slot,
71
70
*source_output_state_changed_slot;
133
static pa_hook_result_t sink_input_new_hook_cb(pa_core *c, pa_sink_input *s, struct userdata *u) {
132
static pa_hook_result_t sink_input_fixate_hook_cb(pa_core *c, pa_sink_input_new_data *data, struct userdata *u) {
134
133
struct device_info *d;
137
pa_sink_input_assert_ref(s);
140
if ((d = pa_hashmap_get(u->device_infos, s->sink)))
139
if ((d = pa_hashmap_get(u->device_infos, data->sink)))
143
142
return PA_HOOK_OK;
146
static pa_hook_result_t source_output_new_hook_cb(pa_core *c, pa_source_output *s, struct userdata *u) {
145
static pa_hook_result_t source_output_fixate_hook_cb(pa_core *c, pa_source_output_new_data *data, struct userdata *u) {
147
146
struct device_info *d;
150
pa_source_output_assert_ref(s);
153
if ((d = pa_hashmap_get(u->device_infos, s->source)))
152
if ((d = pa_hashmap_get(u->device_infos, data->source)))
156
155
return PA_HOOK_OK;
184
183
return PA_HOOK_OK;
187
static pa_hook_result_t sink_input_move_hook_cb(pa_core *c, pa_sink_input *s, struct userdata *u) {
189
pa_sink_input_assert_ref(s);
192
if (pa_sink_used_by(s->sink) <= 1) {
193
struct device_info *d;
194
if ((d = pa_hashmap_get(u->device_infos, s->sink)))
201
static pa_hook_result_t sink_input_move_post_hook_cb(pa_core *c, pa_sink_input *s, struct userdata *u) {
202
struct device_info *d;
204
pa_sink_input_assert_ref(s);
207
if ((d = pa_hashmap_get(u->device_infos, s->sink)))
213
static pa_hook_result_t source_output_move_hook_cb(pa_core *c, pa_source_output *s, struct userdata *u) {
215
pa_source_output_assert_ref(s);
218
if (pa_source_used_by(s->source) <= 1) {
219
struct device_info *d;
221
if ((d = pa_hashmap_get(u->device_infos, s->source)))
228
static pa_hook_result_t source_output_move_post_hook_cb(pa_core *c, pa_source_output *s, struct userdata *u) {
229
struct device_info *d;
231
pa_source_output_assert_ref(s);
234
if ((d = pa_hashmap_get(u->device_infos, s->source)))
186
static pa_hook_result_t sink_input_move_hook_cb(pa_core *c, pa_sink_input_move_hook_data *data, struct userdata *u) {
187
struct device_info *d;
193
if ((d = pa_hashmap_get(u->device_infos, data->destination)))
196
if (pa_sink_used_by(data->sink_input->sink) <= 1)
197
if ((d = pa_hashmap_get(u->device_infos, data->sink_input->sink)))
203
static pa_hook_result_t source_output_move_hook_cb(pa_core *c, pa_source_output_move_hook_data *data, struct userdata *u) {
204
struct device_info *d;
210
if ((d = pa_hashmap_get(u->device_infos, data->destination)))
213
if (pa_source_used_by(data->source_output->source) <= 1)
214
if ((d = pa_hashmap_get(u->device_infos, data->source_output->source)))
237
217
return PA_HOOK_OK;
394
374
u->sink_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], (pa_hook_cb_t) device_state_changed_hook_cb, u);
395
375
u->source_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], (pa_hook_cb_t) device_state_changed_hook_cb, u);
397
u->sink_input_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], (pa_hook_cb_t) sink_input_new_hook_cb, u);
398
u->source_output_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], (pa_hook_cb_t) source_output_new_hook_cb, u);
377
u->sink_input_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_FIXATE], (pa_hook_cb_t) sink_input_fixate_hook_cb, u);
378
u->source_output_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_FIXATE], (pa_hook_cb_t) source_output_fixate_hook_cb, u);
399
379
u->sink_input_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST], (pa_hook_cb_t) sink_input_unlink_hook_cb, u);
400
380
u->source_output_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK_POST], (pa_hook_cb_t) source_output_unlink_hook_cb, u);
401
381
u->sink_input_move_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE], (pa_hook_cb_t) sink_input_move_hook_cb, u);
402
382
u->source_output_move_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE], (pa_hook_cb_t) source_output_move_hook_cb, u);
403
u->sink_input_move_post_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_POST], (pa_hook_cb_t) sink_input_move_post_hook_cb, u);
404
u->source_output_move_post_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_POST], (pa_hook_cb_t) source_output_move_post_hook_cb, u);
405
383
u->sink_input_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], (pa_hook_cb_t) sink_input_state_changed_hook_cb, u);
406
384
u->source_output_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_STATE_CHANGED], (pa_hook_cb_t) source_output_state_changed_hook_cb, u);
409
386
pa_modargs_free(ma);
448
425
pa_hook_slot_free(u->sink_input_unlink_slot);
449
426
if (u->sink_input_move_slot)
450
427
pa_hook_slot_free(u->sink_input_move_slot);
451
if (u->sink_input_move_post_slot)
452
pa_hook_slot_free(u->sink_input_move_post_slot);
453
428
if (u->sink_input_state_changed_slot)
454
429
pa_hook_slot_free(u->sink_input_state_changed_slot);
459
434
pa_hook_slot_free(u->source_output_unlink_slot);
460
435
if (u->source_output_move_slot)
461
436
pa_hook_slot_free(u->source_output_move_slot);
462
if (u->source_output_move_post_slot)
463
pa_hook_slot_free(u->source_output_move_post_slot);
464
437
if (u->source_output_state_changed_slot)
465
438
pa_hook_slot_free(u->source_output_state_changed_slot);