mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-07 13:30:03 -05:00
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
This commit is contained in:
parent
447c4a5327
commit
b71dde0e35
1 changed files with 54 additions and 21 deletions
|
|
@ -68,6 +68,7 @@ struct device {
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
char *udi;
|
char *udi;
|
||||||
char *sink_name, *source_name;
|
char *sink_name, *source_name;
|
||||||
|
int acl_race_fix;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct userdata {
|
struct userdata {
|
||||||
|
|
@ -329,6 +330,7 @@ static struct device* hal_device_add(struct userdata *u, const char *udi) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
d = pa_xnew(struct device, 1);
|
d = pa_xnew(struct device, 1);
|
||||||
|
d->acl_race_fix = 0;
|
||||||
d->udi = pa_xstrdup(udi);
|
d->udi = pa_xstrdup(udi);
|
||||||
d->index = m->index;
|
d->index = m->index;
|
||||||
d->sink_name = sink_name;
|
d->sink_name = sink_name;
|
||||||
|
|
@ -559,23 +561,27 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
|
||||||
udi = dbus_message_get_path(message);
|
udi = dbus_message_get_path(message);
|
||||||
|
|
||||||
if ((d = pa_hashmap_get(u->devices, udi))) {
|
if ((d = pa_hashmap_get(u->devices, udi))) {
|
||||||
|
int send_acl_race_fix_message = 0;
|
||||||
|
|
||||||
|
d->acl_race_fix = 0;
|
||||||
|
|
||||||
if (d->sink_name) {
|
if (d->sink_name) {
|
||||||
pa_sink *sink;
|
pa_sink *sink;
|
||||||
|
|
||||||
if ((sink = pa_namereg_get(u->core, d->sink_name, PA_NAMEREG_SINK, 0))) {
|
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;
|
int prev_suspended = pa_sink_get_state(sink) == PA_SINK_SUSPENDED;
|
||||||
|
|
||||||
if (pa_sink_suspend(sink, suspend) >= 0) {
|
if (prev_suspended && !suspend) {
|
||||||
if (!suspend && 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);
|
pa_scache_play_item_by_name(u->core, "pulse-access", d->sink_name, PA_VOLUME_NORM, 0);
|
||||||
else if (suspend && !prev_suspended) {
|
else
|
||||||
DBusMessage *msg;
|
d->acl_race_fix = 1;
|
||||||
msg = dbus_message_new_signal(udi, "org.pulseaudio.Server", "DirtyGiveUpMessage");
|
|
||||||
dbus_connection_send(pa_dbus_connection_get(u->connection), msg, NULL);
|
} else if (!prev_suspended && suspend) {
|
||||||
dbus_message_unref(msg);
|
/* suspend */
|
||||||
}
|
if (pa_sink_suspend(sink, 1) >= 0)
|
||||||
|
send_acl_race_fix_message = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -583,8 +589,27 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
|
||||||
if (d->source_name) {
|
if (d->source_name) {
|
||||||
pa_source *source;
|
pa_source *source;
|
||||||
|
|
||||||
if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0)))
|
if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0))) {
|
||||||
pa_source_suspend(source, suspend);
|
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)
|
} else if (!suspend)
|
||||||
|
|
@ -600,11 +625,12 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
|
||||||
const char *udi;
|
const char *udi;
|
||||||
struct device *d;
|
struct device *d;
|
||||||
|
|
||||||
pa_log_debug("Got dirty give up message, trying resume ...");
|
|
||||||
|
|
||||||
udi = dbus_message_get_path(message);
|
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) {
|
if (d->sink_name) {
|
||||||
pa_sink *sink;
|
pa_sink *sink;
|
||||||
|
|
@ -613,17 +639,24 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo
|
||||||
|
|
||||||
int prev_suspended = pa_sink_get_state(sink) == PA_SINK_SUSPENDED;
|
int prev_suspended = pa_sink_get_state(sink) == PA_SINK_SUSPENDED;
|
||||||
|
|
||||||
if (pa_sink_suspend(sink, 0) >= 0)
|
if (prev_suspended) {
|
||||||
if (prev_suspended && !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);
|
pa_scache_play_item_by_name(u->core, "pulse-access", d->sink_name, PA_VOLUME_NORM, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->source_name) {
|
if (d->source_name) {
|
||||||
pa_source *source;
|
pa_source *source;
|
||||||
|
|
||||||
if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0)))
|
if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE, 0))) {
|
||||||
pa_source_suspend(source, 0);
|
|
||||||
|
int prev_suspended = pa_source_get_state(source) == PA_SOURCE_SUSPENDED;
|
||||||
|
|
||||||
|
if (prev_suspended)
|
||||||
|
pa_source_suspend(source, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else
|
} else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue