diff options
| author | Lennart Poettering <lennart@poettering.net> | 2007-08-11 16:51:21 +0000 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2007-08-11 16:51:21 +0000 | 
| commit | b71dde0e358cd53505a7ec85f942d7724acef5c1 (patch) | |
| tree | fe2279e5e175acda9e80147d4b7088f663e01997 /src | |
| parent | 447c4a53276516f1ac71a4684ca5a6277a442c79 (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
Diffstat (limited to 'src')
| -rw-r--r-- | src/modules/module-hal-detect.c | 75 | 
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  | 
