summaryrefslogtreecommitdiffstats
path: root/src/modules/module-volume-restore.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2006-08-13 16:21:20 +0000
committerLennart Poettering <lennart@poettering.net>2006-08-13 16:21:20 +0000
commitb37ad1ffd37b2e590191c3dced2b92bb72071dd2 (patch)
treec78f3e4cbe451a001de1255eb72eb0c7787c6881 /src/modules/module-volume-restore.c
parenta621d9028548723d13df64df06a4f4538504e7a3 (diff)
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
Diffstat (limited to 'src/modules/module-volume-restore.c')
-rw-r--r--src/modules/module-volume-restore.c35
1 files changed, 28 insertions, 7 deletions
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)