diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2009-02-18 19:17:54 -0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-02-19 14:27:38 +0200 |
commit | d048052453e0a8ea53061e68424f671df8c405a0 (patch) | |
tree | e66b94261ad103d0398e79eb914b4ca4a3e115b7 /audio/manager.c | |
parent | 2ecef94bcdd0324da979752352a286be85520059 (diff) |
Make audio plugin to use BtIO API.
Diffstat (limited to 'audio/manager.c')
-rw-r--r-- | audio/manager.c | 96 |
1 files changed, 62 insertions, 34 deletions
diff --git a/audio/manager.c b/audio/manager.c index 1c7c46b5..8ef04824 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -50,6 +50,7 @@ #include <gdbus.h> #include "glib-helper.h" +#include "btio.h" #include "../src/manager.h" #include "../src/adapter.h" #include "../src/device.h" @@ -423,21 +424,34 @@ static void auth_cb(DBusError *derr, void *user_data) } } -static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src, - const bdaddr_t *dst, gpointer data) +static void ag_io_cb(GIOChannel *chan, GError *err, gpointer data) { - struct audio_adapter *adapter = data; const char *server_uuid, *remote_uuid; uint16_t svclass; struct audio_device *device; gboolean hfp_active; + bdaddr_t src, dst; + int perr; + GError *gerr = NULL; + uint8_t ch; - if (err < 0) { - error("accept: %s (%d)", strerror(-err), -err); + if (err) { + error("%s", err->message); return; } - if (chan == adapter->hsp_ag_server) { + bt_io_get(chan, BT_IO_RFCOMM, &gerr, + BT_IO_OPT_SOURCE_BDADDR, &src, + BT_IO_OPT_DEST_BDADDR, &dst, + BT_IO_OPT_CHANNEL &ch, + BT_IO_OPT_INVALID); + if (gerr) { + error("%s", gerr->message); + g_clear_error(&gerr); + goto drop; + } + + if (ch == DEFAULT_HS_AG_CHANNEL) { hfp_active = FALSE; server_uuid = HSP_AG_UUID; remote_uuid = HSP_HS_UUID; @@ -449,7 +463,7 @@ static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src, svclass = HANDSFREE_SVCLASS_ID; } - device = manager_get_device(src, dst); + device = manager_get_device(&src, &dst); if (!device) goto drop; @@ -478,10 +492,10 @@ static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src, headset_set_state(device, HEADSET_STATE_CONNECT_IN_PROGRESS); - err = btd_request_authorization(&device->src, &device->dst, + perr = btd_request_authorization(&device->src, &device->dst, server_uuid, auth_cb, device); - if (err < 0) { - debug("Authorization denied: %s", strerror(-err)); + if (perr < 0) { + debug("Authorization denied: %s", strerror(-perr)); headset_set_state(device, HEADSET_STATE_DISCONNECTED); return; } @@ -490,11 +504,9 @@ static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src, drop: g_io_channel_close(chan); - g_io_channel_unref(chan); } -static void hs_io_cb(GIOChannel *chan, int err, const bdaddr_t *src, - const bdaddr_t *dst, void *data) +static void hs_io_cb(GIOChannel *chan, GError *err, void *data) { /*Stub*/ return; @@ -506,7 +518,8 @@ static int headset_server_init(struct audio_adapter *adapter) sdp_record_t *record; gboolean master = TRUE; GError *err = NULL; - uint32_t features, flags; + uint32_t features; + GIOChannel *io; if (config) { gboolean tmp; @@ -520,16 +533,17 @@ static int headset_server_init(struct audio_adapter *adapter) master = tmp; } - flags = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT; - - if (master) - flags |= RFCOMM_LM_MASTER; - - adapter->hsp_ag_server = bt_rfcomm_listen(&adapter->src, chan, flags, - ag_io_cb, adapter); - if (!adapter->hsp_ag_server) + io = bt_io_listen(BT_IO_RFCOMM, ag_io_cb, NULL, adapter, NULL, &err, + BT_IO_OPT_SOURCE_BDADDR, &adapter->src, + BT_IO_OPT_CHANNEL, chan, + BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM, + BT_IO_OPT_MASTER, master, + BT_IO_OPT_INVALID); + if (!io) goto failed; + adapter->hsp_ag_server = io; + record = hsp_ag_record(chan); if (!record) { error("Unable to allocate new service record"); @@ -550,11 +564,17 @@ static int headset_server_init(struct audio_adapter *adapter) chan = DEFAULT_HF_AG_CHANNEL; - adapter->hfp_ag_server = bt_rfcomm_listen(&adapter->src, chan, flags, - ag_io_cb, adapter); - if (!adapter->hfp_ag_server) + io = bt_io_listen(BT_IO_RFCOMM, ag_io_cb, NULL, adapter, NULL, &err, + BT_IO_OPT_SOURCE_BDADDR, &adapter->src, + BT_IO_OPT_CHANNEL, chan, + BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM, + BT_IO_OPT_MASTER, master, + BT_IO_OPT_INVALID); + if (!io) goto failed; + adapter->hfp_ag_server = io; + record = hfp_ag_record(chan, features); if (!record) { error("Unable to allocate new service record"); @@ -571,12 +591,16 @@ static int headset_server_init(struct audio_adapter *adapter) return 0; failed: + error("%s", err->message); + g_clear_error(&err); if (adapter->hsp_ag_server) { + g_io_channel_close(adapter->hsp_ag_server); g_io_channel_unref(adapter->hsp_ag_server); adapter->hsp_ag_server = NULL; } if (adapter->hfp_ag_server) { + g_io_channel_close(adapter->hfp_ag_server); g_io_channel_unref(adapter->hfp_ag_server); adapter->hfp_ag_server = NULL; } @@ -590,7 +614,7 @@ static int gateway_server_init(struct audio_adapter *adapter) sdp_record_t *record; gboolean master = TRUE; GError *err = NULL; - uint32_t flags; + GIOChannel *io; if (config) { gboolean tmp; @@ -604,15 +628,19 @@ static int gateway_server_init(struct audio_adapter *adapter) master = tmp; } - flags = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT; - - if (master) - flags |= RFCOMM_LM_MASTER; - - adapter->hsp_hs_server = bt_rfcomm_listen(&adapter->src, chan, flags, - hs_io_cb, adapter); - if (!adapter->hsp_hs_server) + io = bt_io_listen(BT_IO_RFCOMM, hs_io_cb, NULL, adapter, NULL, &err, + BT_IO_OPT_SOURCE_BDADDR, &adapter->src, + BT_IO_OPT_CHANNEL, chan, + BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM, + BT_IO_OPT_MASTER, master, + BT_IO_OPT_INVALID); + if (!io) { + error("%s", err->message); + g_error_free(err); return -1; + } + + adapter->hsp_hs_server = io; record = hsp_hs_record(chan); if (!record) { |