summaryrefslogtreecommitdiffstats
path: root/audio/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/manager.c')
-rw-r--r--audio/manager.c90
1 files changed, 34 insertions, 56 deletions
diff --git a/audio/manager.c b/audio/manager.c
index 6c54d314..03a6fc47 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -58,7 +58,7 @@ static DBusConnection *connection = NULL;
static GIOChannel *hs_server = NULL;
static uint32_t hs_record_id;
-static struct headset *default_hs;
+static char *default_hs = NULL;
static GSList *headsets = NULL;
@@ -200,7 +200,7 @@ static gboolean manager_create_headset_server(uint8_t chan)
return FALSE;
if (!hs_record_id)
- hs_record_id = headset_add_ag_record(connection, chan);
+ hs_record_id = headset_add_ag_record(chan);
if (!hs_record_id) {
error("Unable to register service record");
@@ -215,35 +215,25 @@ static gboolean manager_create_headset_server(uint8_t chan)
return TRUE;
}
-struct headset *manager_find_headset_by_bda(bdaddr_t *bda)
+void manager_add_headset(char *path)
{
- GSList *elem;
-
- elem = g_slist_find_custom(headsets, bda, headset_bda_cmp);
-
- return elem ? elem->data : NULL;
-}
-
-void manager_add_headset(struct headset *hs)
-{
- assert(hs);
+ if (g_slist_find_custom(headsets, path, (GCompareFunc) strcmp))
+ return;
- headsets = g_slist_append(headsets, hs);
+ headsets = g_slist_append(headsets, path);
- manager_signal(connection, "HeadsetCreated", headset_get_path(hs));
+ manager_signal(connection, "HeadsetCreated", path);
if (!default_hs) {
- default_hs = hs;
- manager_signal(connection, "DefaultHeadsetChanged",
- headset_get_path(hs));
+ default_hs = path;
+ manager_signal(connection, "DefaultHeadsetChanged", path);
}
}
static DBusHandlerResult am_create_headset(DBusMessage *msg)
{
- const char *object_path;
+ char *hs_path;
const char *address;
- struct headset *hs;
bdaddr_t bda;
DBusMessage *reply;
DBusError derr;
@@ -266,18 +256,15 @@ static DBusHandlerResult am_create_headset(DBusMessage *msg)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
str2ba(address, &bda);
- hs = manager_find_headset_by_bda(&bda);
- if (!hs) {
- hs = headset_new(connection, &bda);
- if (!hs)
- return error_reply(connection, msg,
- "org.bluez.Error.Failed",
- "Unable to create new headset object");
- manager_add_headset(hs);
- }
-
- object_path = headset_get_path(hs);
- dbus_message_append_args(reply, DBUS_TYPE_STRING, &object_path,
+ /* This returns an existing path if the headset already exists */
+ hs_path = headset_add(&bda);
+ if (!hs_path)
+ return error_reply(connection, msg,
+ "org.bluez.Error.Failed",
+ "Unable to create new headset object");
+ manager_add_headset(hs_path);
+
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &hs_path,
DBUS_TYPE_INVALID);
return send_message_and_unref(connection, reply);
@@ -288,8 +275,7 @@ static DBusHandlerResult am_remove_headset(DBusMessage *msg)
DBusError derr;
DBusMessage *reply;
GSList *match;
- struct headset *hs;
- const char *path;
+ char *path;
dbus_error_init(&derr);
if (!dbus_message_get_args(msg, &derr,
@@ -304,7 +290,7 @@ static DBusHandlerResult am_remove_headset(DBusMessage *msg)
return DBUS_HANDLER_RESULT_HANDLED;
}
- match = g_slist_find_custom(headsets, path, headset_path_cmp);
+ match = g_slist_find_custom(headsets, path, (GCompareFunc) strcmp);
if (!match)
return error_reply(connection, msg, "org.bluez.Error.DoesNotExist",
"The headset does not exist");
@@ -313,23 +299,23 @@ static DBusHandlerResult am_remove_headset(DBusMessage *msg)
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- hs = match->data;
+ path = match->data;
- headsets = g_slist_remove(headsets, hs);
+ headsets = g_slist_remove(headsets, path);
- if (default_hs == hs) {
+ if (default_hs == path) {
if (!headsets)
default_hs = NULL;
else
default_hs = headsets->data;
manager_signal(connection, "DefaultHeadsetChanged",
- default_hs ? headset_get_path(default_hs) : "");
+ default_hs ? default_hs : "");
}
- manager_signal(connection, "HeadsetRemoved", headset_get_path(hs));
+ manager_signal(connection, "HeadsetRemoved", path);
- headset_unref(hs);
+ headset_remove(path);
return send_message_and_unref(connection, reply);
}
@@ -350,13 +336,9 @@ static DBusHandlerResult am_list_headsets(DBusMessage *msg)
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array_iter);
- for (l = headsets; l != NULL; l = l->next) {
- struct headset *hs = l->data;
- const char *path = headset_get_path(hs);
-
+ for (l = headsets; l != NULL; l = l->next)
dbus_message_iter_append_basic(&array_iter,
- DBUS_TYPE_STRING, &path);
- }
+ DBUS_TYPE_STRING, &l->data);
dbus_message_iter_close_container(&iter, &array_iter);
@@ -366,7 +348,6 @@ static DBusHandlerResult am_list_headsets(DBusMessage *msg)
static DBusHandlerResult am_get_default_headset(DBusMessage *msg)
{
DBusMessage *reply;
- const char *opath;
if (!default_hs)
return error_reply(connection, msg, "org.bluez.Error.DoesNotExist",
@@ -376,9 +357,7 @@ static DBusHandlerResult am_get_default_headset(DBusMessage *msg)
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- opath = headset_get_path(default_hs);
-
- dbus_message_append_args(reply, DBUS_TYPE_STRING, &opath,
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &default_hs,
DBUS_TYPE_INVALID);
return send_message_and_unref(connection, reply);
@@ -404,7 +383,7 @@ static DBusHandlerResult am_change_default_headset(DBusMessage *msg)
return DBUS_HANDLER_RESULT_HANDLED;
}
- match = g_slist_find_custom(headsets, path, headset_path_cmp);
+ match = g_slist_find_custom(headsets, path, (GCompareFunc) strcmp);
if (!match)
return error_reply(connection, msg, "org.bluez.Error.DoesNotExist",
"The headset does not exist");
@@ -415,8 +394,7 @@ static DBusHandlerResult am_change_default_headset(DBusMessage *msg)
default_hs = match->data;
- manager_signal(connection, "DefaultHeadsetChanged",
- headset_get_path(default_hs));
+ manager_signal(connection, "DefaultHeadsetChanged", default_hs);
return send_message_and_unref(connection, reply);
}
@@ -517,7 +495,7 @@ void audio_exit(void)
unix_sock = -1;
if (hs_record_id) {
- headset_remove_ag_record(connection, hs_record_id);
+ headset_remove_ag_record(hs_record_id);
hs_record_id = 0;
}
@@ -527,7 +505,7 @@ void audio_exit(void)
}
if (headsets) {
- g_slist_foreach(headsets, (GFunc) headset_unref, NULL);
+ g_slist_foreach(headsets, (GFunc) headset_remove, NULL);
g_slist_free(headsets);
headsets = NULL;
}