From b37ad1ffd37b2e590191c3dced2b92bb72071dd2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 13 Aug 2006 16:21:20 +0000 Subject: modify module-volume-restore to change the initial volume of a sink input from a hook instead of an asyncronous subscription event. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1238 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/modules/module-volume-restore.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'src/modules/module-volume-restore.c') diff --git a/src/modules/module-volume-restore.c b/src/modules/module-volume-restore.c index d0956509..d49cceb0 100644 --- a/src/modules/module-volume-restore.c +++ b/src/modules/module-volume-restore.c @@ -68,6 +68,7 @@ struct rule { struct userdata { pa_hashmap *hashmap; pa_subscription *subscription; + pa_hook_slot *hook_slot; int modified; char *table_file; }; @@ -255,7 +256,7 @@ static char* client_name(pa_client *c) { return t; } -static void callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { +static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { struct userdata *u = userdata; pa_sink_input *si; struct rule *r; @@ -277,15 +278,11 @@ static void callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, v if ((r = pa_hashmap_get(u->hashmap, name))) { pa_xfree(name); - if (((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) && si->sample_spec.channels == r->volume.channels) { - pa_log_info(__FILE__": Restoring volume for <%s>", r->name); - pa_sink_input_set_volume(si, &r->volume); - } else if (!pa_cvolume_equal(pa_sink_input_get_volume(si), &r->volume)) { + if (!pa_cvolume_equal(pa_sink_input_get_volume(si), &r->volume)) { pa_log_info(__FILE__": Saving volume for <%s>", r->name); r->volume = *pa_sink_input_get_volume(si); u->modified = 1; } - } else { pa_log_info(__FILE__": Creating new entry for <%s>", name); @@ -298,6 +295,26 @@ static void callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, v } } +static pa_hook_result_t hook_callback(pa_core *c, pa_sink_input_new_data *data, struct userdata *u) { + struct rule *r; + char *name; + + assert(data); + + if (!data->client || !(name = client_name(data->client))) + return PA_HOOK_OK; + + if ((r = pa_hashmap_get(u->hashmap, name))) { + + if (data->sample_spec_is_set && data->sample_spec.channels == r->volume.channels) { + pa_log_info(__FILE__": Restoring volume for <%s>", r->name); + pa_sink_input_new_data_set_volume(data, &r->volume); + } + } + + return PA_HOOK_OK; +} + int pa__init(pa_core *c, pa_module*m) { pa_modargs *ma = NULL; struct userdata *u; @@ -321,7 +338,8 @@ int pa__init(pa_core *c, pa_module*m) { if (load_rules(u) < 0) goto fail; - u->subscription = pa_subscription_new(c, PA_SUBSCRIPTION_MASK_SINK_INPUT, callback, u); + u->subscription = pa_subscription_new(c, PA_SUBSCRIPTION_MASK_SINK_INPUT, subscribe_callback, u); + u->hook_slot = pa_hook_connect(&c->hook_sink_input_new, (pa_hook_cb_t) hook_callback, u); pa_modargs_free(ma); return 0; @@ -355,6 +373,9 @@ void pa__done(pa_core *c, pa_module*m) { if (u->subscription) pa_subscription_free(u->subscription); + if (u->hook_slot) + pa_hook_slot_free(u->hook_slot); + if (u->hashmap) { if (u->modified) -- cgit