summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-08-11 16:51:21 +0000
committerLennart Poettering <lennart@poettering.net>2007-08-11 16:51:21 +0000
commitb71dde0e358cd53505a7ec85f942d7724acef5c1 (patch)
treefe2279e5e175acda9e80147d4b7088f663e01997
parent447c4a53276516f1ac71a4684ca5a6277a442c79 (diff)
make sure that the device access event sound is only generated once
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1638 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r--src/modules/module-hal-detect.c75
1 files changed, 54 insertions, 21 deletions
diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c
index f00a60db..441ebfed 100644
--- a/src/modules/module-hal-detect.c
+++ b/src/modules/module-hal-detect.c
@@ -68,6 +68,7 @@ struct device {
uint32_t index;
char *udi;
char *sink_name, *source_name;
+ int acl_race_fix;
};
struct userdata {
@@ -329,6 +330,7 @@ static struct device* hal_device_add(struct userdata *u, const char *udi) {
return NULL;
d = pa_xnew(struct device, 1);
+ d->acl_race_fix = 0;
d->udi = pa_xstrdup(udi);
d->index = m->index;
d->sink_name = sink_name;
@@ -559,23 +561,27 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
udi = dbus_message_get_path(message);
if ((d = pa_hashmap_get(u->devices, udi))) {
-
+ int send_acl_race_fix_message = 0;
+
+ d->acl_race_fix = 0;
+
if (d->sink_name) {
pa_sink *sink;
if ((sink = pa_namereg_get(u->core, d->sink_name, PA_NAMEREG_SINK, 0))) {
-
int prev_suspended = pa_sink_get_state(sink) == PA_SINK_SUSPENDED;
- if (pa_sink_suspend(sink, suspend) >= 0) {
- if (!suspend && prev_suspended)
+ if (prev_suspended && !suspend) {
+ /* resume */
+ if (pa_sink_suspend(sink, 0) >= 0)
pa_scache_play_item_by_name(u->core, "pulse-access", d->sink_name, PA_VOLUME_NORM, 0);
- else if (suspend && !prev_suspended) {
- DBusMessage *msg;
- msg = dbus_message_new_signal(udi, "org.pulseaudio.Server", "DirtyGiveUpMessage");
- dbus_connection_send(pa_dbus_connection_get(u->connection), msg, NULL);
- dbus_message_unref(msg);
- }
+ else
+ d->acl_race_fix = 1;
+
+ } else if (!prev_suspended && suspend) {
+ /* suspend */
+ if (pa_sink_suspend(sink, 1) >= 0)
+ send_acl_race_fix_message = 1;
}
}
}
@@ -583,10 +589,29 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
if (d->source_name) {
pa_source *source;
- if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0)))
- pa_source_suspend(source, suspend);
+ if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0))) {
+ int prev_suspended = pa_source_get_state(source) == PA_SOURCE_SUSPENDED;
+
+ if (prev_suspended && !suspend) {
+ /* resume */
+ if (pa_source_suspend(source, 0) < 0)
+ d->acl_race_fix = 1;
+
+ } else if (!prev_suspended && suspend) {
+ /* suspend */
+ if (pa_source_suspend(source, 0) >= 0)
+ send_acl_race_fix_message = 1;
+ }
+ }
}
-
+
+ if (send_acl_race_fix_message) {
+ DBusMessage *msg;
+ msg = dbus_message_new_signal(udi, "org.pulseaudio.Server", "DirtyGiveUpMessage");
+ dbus_connection_send(pa_dbus_connection_get(u->connection), msg, NULL);
+ dbus_message_unref(msg);
+ }
+
} else if (!suspend)
device_added_cb(u->context, udi);
}
@@ -600,30 +625,38 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
const char *udi;
struct device *d;
- pa_log_debug("Got dirty give up message, trying resume ...");
-
udi = dbus_message_get_path(message);
- if ((d = pa_hashmap_get(u->devices, udi))) {
+ if ((d = pa_hashmap_get(u->devices, udi)) && d->acl_race_fix) {
+ pa_log_debug("Got dirty give up message for '%s', trying resume ...", udi);
+ d->acl_race_fix = 0;
+
if (d->sink_name) {
pa_sink *sink;
if ((sink = pa_namereg_get(u->core, d->sink_name, PA_NAMEREG_SINK, 0))) {
int prev_suspended = pa_sink_get_state(sink) == PA_SINK_SUSPENDED;
-
- if (pa_sink_suspend(sink, 0) >= 0)
- if (prev_suspended && !prev_suspended)
+
+ if (prev_suspended) {
+ /* resume */
+ if (pa_sink_suspend(sink, 0) >= 0)
pa_scache_play_item_by_name(u->core, "pulse-access", d->sink_name, PA_VOLUME_NORM, 0);
+ }
}
}
if (d->source_name) {
pa_source *source;
- if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0)))
- pa_source_suspend(source, 0);
+ if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0))) {
+
+ int prev_suspended = pa_source_get_state(source) == PA_SOURCE_SUSPENDED;
+
+ if (prev_suspended)
+ pa_source_suspend(source, 0);
+ }
}
} else