diff options
| author | Daniel Mack <daniel@caiaq.de> | 2009-09-14 16:25:35 +0800 | 
|---|---|---|
| committer | Daniel Mack <daniel@caiaq.de> | 2009-09-14 16:25:35 +0800 | 
| commit | bebaa491650c48697b861ec5e76816e9af1a8803 (patch) | |
| tree | b57d38476473f8fc6e282f8c39f730c936fa10d4 /src/modules/bluetooth/bluetooth-util.c | |
| parent | c6d330ef91ce401660f907536b1bfd0591c14c2a (diff) | |
| parent | 180ef1eebdfbdf0220af1fb5e4bf43e348207cde (diff) | |
Merge branch 'master' of git://0pointer.de/pulseaudio
Diffstat (limited to 'src/modules/bluetooth/bluetooth-util.c')
| -rw-r--r-- | src/modules/bluetooth/bluetooth-util.c | 61 | 
1 files changed, 46 insertions, 15 deletions
| diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c index 66e1c31e..f8c5b778 100644 --- a/src/modules/bluetooth/bluetooth-util.c +++ b/src/modules/bluetooth/bluetooth-util.c @@ -1,7 +1,7 @@  /***    This file is part of PulseAudio. -  Copyright 2008 Joao Paulo Rechi Vita +  Copyright 2008-2009 Joao Paulo Rechi Vita    PulseAudio is free software; you can redistribute it and/or modify    it under the terms of the GNU Lesser General Public License as @@ -95,6 +95,7 @@ static pa_bluetooth_device* device_new(const char *path) {      d->audio_state = PA_BT_AUDIO_STATE_INVALID;      d->audio_sink_state = PA_BT_AUDIO_STATE_INVALID; +    d->audio_source_state = PA_BT_AUDIO_STATE_INVALID;      d->headset_state = PA_BT_AUDIO_STATE_INVALID;      return d; @@ -122,9 +123,10 @@ static pa_bool_t device_is_audio(pa_bluetooth_device *d) {      return          d->device_info_valid && -        (d->audio_state != PA_BT_AUDIO_STATE_INVALID || -         d->audio_sink_state != PA_BT_AUDIO_STATE_INVALID || -         d->headset_state != PA_BT_AUDIO_STATE_INVALID); +        (d->audio_state != PA_BT_AUDIO_STATE_INVALID && +         (d->audio_sink_state != PA_BT_AUDIO_STATE_INVALID || +          d->audio_source_state != PA_BT_AUDIO_STATE_INVALID || +          d->headset_state != PA_BT_AUDIO_STATE_INVALID));  }  static int parse_device_property(pa_bluetooth_discovery *y, pa_bluetooth_device *d, DBusMessageIter *i) { @@ -226,10 +228,6 @@ static int parse_device_property(pa_bluetooth_discovery *y, pa_bluetooth_device                      node = uuid_new(value);                      PA_LLIST_PREPEND(pa_bluetooth_uuid, d->uuids, node); -                    /* this might eventually be racy if .Audio is not there yet, but the State change will come anyway later, so this call is for cold-detection mostly */ -                    pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.Audio", "GetProperties")); -                    send_and_add_to_pending(y, d, m, get_properties_reply); -                      /* Vudentz said the interfaces are here when the UUIDs are announced */                      if (strcasecmp(HSP_HS_UUID, value) == 0 || strcasecmp(HFP_HS_UUID, value) == 0) {                          pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.Headset", "GetProperties")); @@ -237,8 +235,15 @@ static int parse_device_property(pa_bluetooth_discovery *y, pa_bluetooth_device                      } else if (strcasecmp(A2DP_SINK_UUID, value) == 0) {                          pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.AudioSink", "GetProperties"));                          send_and_add_to_pending(y, d, m, get_properties_reply); +                    } else if (strcasecmp(A2DP_SOURCE_UUID, value) == 0) { +                        pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.AudioSource", "GetProperties")); +                        send_and_add_to_pending(y, d, m, get_properties_reply);                      } +                    /* this might eventually be racy if .Audio is not there yet, but the State change will come anyway later, so this call is for cold-detection mostly */ +                    pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.Audio", "GetProperties")); +                    send_and_add_to_pending(y, d, m, get_properties_reply); +                      if (!dbus_message_iter_next(&ai))                          break;                  } @@ -278,7 +283,7 @@ static int parse_audio_property(pa_bluetooth_discovery *u, int *state, DBusMessa      dbus_message_iter_recurse(i, &variant_i); -/*     pa_log_debug("Parsing property org.bluez.{Audio|AudioSink|Headset}.%s", key); */ +/*     pa_log_debug("Parsing property org.bluez.{Audio|AudioSink|AudioSource|Headset}.%s", key); */      switch (dbus_message_iter_get_arg_type(&variant_i)) { @@ -390,6 +395,9 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) {              }  else if (dbus_message_has_interface(p->message, "org.bluez.AudioSink")) {                  if (parse_audio_property(y, &d->audio_sink_state, &dict_i) < 0)                      goto finish; +            }  else if (dbus_message_has_interface(p->message, "org.bluez.AudioSource")) { +                if (parse_audio_property(y, &d->audio_source_state, &dict_i) < 0) +                    goto finish;              }          } @@ -440,8 +448,8 @@ static void found_device(pa_bluetooth_discovery *y, const char* path) {      pa_assert_se(m = dbus_message_new_method_call("org.bluez", path, "org.bluez.Device", "GetProperties"));      send_and_add_to_pending(y, d, m, get_properties_reply); -    /* Before we read the other properties (Audio, AudioSink, Headset) we wait -     * that the UUID is read */ +    /* Before we read the other properties (Audio, AudioSink, AudioSource, +     * Headset) we wait that the UUID is read */  }  static void list_devices_reply(DBusPendingCall *pending, void *userdata) { @@ -616,6 +624,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us      } else if (dbus_message_is_signal(m, "org.bluez.Audio", "PropertyChanged") ||                 dbus_message_is_signal(m, "org.bluez.Headset", "PropertyChanged") ||                 dbus_message_is_signal(m, "org.bluez.AudioSink", "PropertyChanged") || +               dbus_message_is_signal(m, "org.bluez.AudioSource", "PropertyChanged") ||                 dbus_message_is_signal(m, "org.bluez.Device", "PropertyChanged")) {          pa_bluetooth_device *d; @@ -643,6 +652,9 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us              }  else if (dbus_message_has_interface(m, "org.bluez.AudioSink")) {                  if (parse_audio_property(y, &d->audio_sink_state, &arg_i) < 0)                      goto fail; +            }  else if (dbus_message_has_interface(m, "org.bluez.AudioSource")) { +                if (parse_audio_property(y, &d->audio_source_state, &arg_i) < 0) +                    goto fail;              }              run_callback(y, d, FALSE); @@ -650,6 +662,21 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us          return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +    } else if (dbus_message_is_signal(m, "org.bluez.Device", "DisconnectRequested")) { +        pa_bluetooth_device *d; + +        if ((d = pa_hashmap_get(y->devices, dbus_message_get_path(m)))) { +            /* Device will disconnect in 2 sec */ +            d->audio_state = PA_BT_AUDIO_STATE_DISCONNECTED; +            d->audio_sink_state = PA_BT_AUDIO_STATE_DISCONNECTED; +            d->audio_source_state = PA_BT_AUDIO_STATE_DISCONNECTED; +            d->headset_state = PA_BT_AUDIO_STATE_DISCONNECTED; + +            run_callback(y, d, FALSE); +        } + +        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +      } else if (dbus_message_is_signal(m, "org.freedesktop.DBus", "NameOwnerChanged")) {          const char *name, *old_owner, *new_owner; @@ -758,14 +785,16 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {      if (pa_dbus_add_matches(                  pa_dbus_connection_get(y->connection), &err, -                "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'", +                "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='org.bluez'",                  "type='signal',sender='org.bluez',interface='org.bluez.Manager',member='AdapterAdded'",                  "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceRemoved'",                  "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceCreated'",                  "type='signal',sender='org.bluez',interface='org.bluez.Device',member='PropertyChanged'", +                "type='signal',sender='org.bluez',interface='org.bluez.Device',member='DisconnectRequested'",                  "type='signal',sender='org.bluez',interface='org.bluez.Audio',member='PropertyChanged'",                  "type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged'", -                "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'", NULL) < 0) { +                "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'", +                "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", NULL) < 0) {          pa_log("Failed to add D-Bus matches: %s", err.message);          goto fail;      } @@ -809,15 +838,17 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {      if (y->connection) {          pa_dbus_remove_matches(pa_dbus_connection_get(y->connection), -                               "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'", +                               "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='org.bluez'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Manager',member='AdapterAdded'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Manager',member='AdapterRemoved'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceRemoved'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceCreated'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Device',member='PropertyChanged'", +                               "type='signal',sender='org.bluez',interface='org.bluez.Device',member='DisconnectRequested'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Audio',member='PropertyChanged'",                                 "type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged'", -                               "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'", NULL); +                               "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'", +                               "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", NULL);          dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y); | 
