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/avdtp.c | |
| parent | 2ecef94bcdd0324da979752352a286be85520059 (diff) | |
Make audio plugin to use BtIO API.
Diffstat (limited to 'audio/avdtp.c')
| -rw-r--r-- | audio/avdtp.c | 136 | 
1 files changed, 74 insertions, 62 deletions
diff --git a/audio/avdtp.c b/audio/avdtp.c index a7960f25..da1a4df7 100644 --- a/audio/avdtp.c +++ b/audio/avdtp.c @@ -50,6 +50,7 @@  #include "control.h"  #include "avdtp.h"  #include "glib-helper.h" +#include "btio.h"  #include "sink.h"  #include <bluetooth/l2cap.h> @@ -1764,22 +1765,20 @@ failed:  	return FALSE;  } -static void l2cap_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src, -			const bdaddr_t *dst, gpointer user_data) +static void l2cap_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)  {  	struct avdtp *session = user_data; -	struct l2cap_options l2o; -	socklen_t len;  	int sk;  	char address[18]; +	GError *gerr = NULL;  	if (!g_slist_find(sessions, session)) {  		debug("l2cap_connect_cb: session got removed");  		return;  	} -	if (err < 0) { -		error("connect(): %s (%d)", strerror(-err), -err); +	if (err) { +		error("%s", err->message);  		goto failed;  	} @@ -1790,27 +1789,24 @@ static void l2cap_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src,  		session->state = AVDTP_SESSION_STATE_CONNECTING;  	} +	bt_io_get(chan, BT_IO_L2CAP, &gerr, +			BT_IO_OPT_OMTU, &session->omtu, +			BT_IO_OPT_IMTU, &session->imtu, +			BT_IO_OPT_INVALID); +	if (gerr) { +		error("%s", gerr->message); +		g_clear_error(&gerr); +		goto failed; +	} +  	ba2str(&session->dst, address);  	debug("AVDTP: connected %s channel to %s",  			session->pending_open ? "transport" : "signaling",  			address); -	memset(&l2o, 0, sizeof(l2o)); -	len = sizeof(l2o); -	if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, -				&len) < 0) { -		err = errno; -		error("getsockopt(L2CAP_OPTIONS): %s (%d)", strerror(err), -				err); -		goto failed; -	} -  	if (session->state == AVDTP_SESSION_STATE_CONNECTING) {  		struct audio_device *dev; -		session->imtu = l2o.imtu; -		session->omtu = l2o.omtu; -  		debug("AVDTP imtu=%u, omtu=%u", session->imtu, session->omtu);  		session->buf = g_malloc0(session->imtu); @@ -1824,13 +1820,10 @@ static void l2cap_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src,  						AUDIO_CONTROL_INTERFACE, FALSE);  		if (dev)  			avrcp_connect(dev); -	} -	else if (session->pending_open) -		handle_transport_connect(session, sk, l2o.imtu, l2o.omtu); -	else { -		err = -EIO; +	} else if (session->pending_open) +		handle_transport_connect(session, sk, session->imtu, session->omtu); +	else  		goto failed; -	}  	process_queue(session); @@ -1846,22 +1839,30 @@ failed:  			avdtp_sep_set_state(session, stream->lsep,  						AVDTP_STATE_IDLE);  	} else -		connection_lost(session, -err); +		connection_lost(session, EIO);  	return;  }  static int l2cap_connect(struct avdtp *session)  { -	int err; +	GError *err = NULL; +	GIOChannel *io; -	err = bt_l2cap_connect(&session->server->src, &session->dst, AVDTP_PSM, -				0, l2cap_connect_cb, session); -	if (err < 0) { -		error("Connect failed. %s(%d)", strerror(-err), -err); -		return err; +	io = bt_io_connect(BT_IO_L2CAP, l2cap_connect_cb, session, +				NULL, &err, +				BT_IO_OPT_SOURCE_BDADDR, &session->server->src, +				BT_IO_OPT_DEST_BDADDR, &session->dst, +				BT_IO_OPT_PSM, AVDTP_PSM, +				BT_IO_OPT_INVALID); +	if (!io) { +		error("%s", err->message); +		g_error_free(err); +		return -EIO;  	} +	g_io_channel_unref(io); +  	return 0;  } @@ -2997,38 +2998,43 @@ static void auth_cb(DBusError *derr, void *user_data)  	g_io_channel_unref(io);  } -static void avdtp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src, -		const bdaddr_t *dst, gpointer data) +static void avdtp_server_cb(GIOChannel *chan, GError *err, gpointer data)  {  	int sk; -	socklen_t size; -	struct l2cap_options l2o;  	struct avdtp *session;  	struct audio_device *dev;  	char address[18]; +	bdaddr_t src, dst; +	uint16_t imtu, omtu; +	int perr; +	GError *gerr = NULL; -	if (err < 0) { -		error("accept: %s (%d)", strerror(-err), -err); +	if (err) { +		error("%s", err->message);  		return;  	} -	sk = g_io_channel_unix_get_fd(chan); +	bt_io_get(chan, BT_IO_L2CAP, &gerr, +			BT_IO_OPT_SOURCE_BDADDR, &src, +			BT_IO_OPT_DEST_BDADDR, &dst, +			BT_IO_OPT_DEST, address, +			BT_IO_OPT_OMTU, &omtu, +			BT_IO_OPT_IMTU, &imtu, +			BT_IO_OPT_INVALID); +	if (gerr) { +		error("%s", gerr->message); +		g_error_free(gerr); +		goto drop; +	} -	ba2str(dst, address);  	debug("AVDTP: incoming connect from %s", address); -	memset(&l2o, 0, sizeof(l2o)); -	size = sizeof(l2o); -	if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &size) < 0) { -		error("getsockopt(L2CAP_OPTIONS): %s (%d)", strerror(errno), -			errno); -		goto drop; -	} +	session = avdtp_get_internal(&src, &dst); -	session = avdtp_get_internal(src, dst); +	sk = g_io_channel_unix_get_fd(chan);  	if (session->pending_open && session->pending_open->open_acp) { -		handle_transport_connect(session, sk, l2o.imtu, l2o.omtu); +		handle_transport_connect(session, sk, imtu, omtu);  		return;  	} @@ -3037,47 +3043,53 @@ static void avdtp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,  		goto drop;  	} -	dev = manager_get_device(src, dst); +	dev = manager_get_device(&src, &dst);  	if (!dev) {  		error("Unable to get audio device object for %s", address);  		goto drop;  	} -	session->imtu = l2o.imtu; -	session->omtu = l2o.omtu; +	session->imtu = imtu; +	session->omtu = omtu;  	session->sock = sk;  	debug("AVDTP imtu=%u, omtu=%u", session->imtu, session->omtu);  	session->io = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL,  					(GIOFunc) session_cb, session); -	err = btd_request_authorization(src, dst, ADVANCED_AUDIO_UUID, +	perr = btd_request_authorization(&src, &dst, ADVANCED_AUDIO_UUID,  							auth_cb, session); -	if (err < 0) { +	if (perr < 0) {  		avdtp_unref(session);  		goto drop;  	} -	g_io_channel_unref(chan); -  	session->state = AVDTP_SESSION_STATE_CONNECTING;  	return;  drop:  	g_io_channel_close(chan); -	g_io_channel_unref(chan);  }  static GIOChannel *avdtp_server_socket(const bdaddr_t *src, gboolean master)  { -	int lm = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT; +	GError *err = NULL; +	GIOChannel *io; -	if (master) -		lm |= L2CAP_LM_MASTER; +	io = bt_io_listen(BT_IO_L2CAP, avdtp_server_cb, NULL, NULL, +				NULL, &err, +				BT_IO_OPT_SOURCE_BDADDR, src, +				BT_IO_OPT_PSM, AVDTP_PSM, +				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 bt_l2cap_listen(src, AVDTP_PSM, 0, lm, avdtp_server_cb, -			NULL); +	return io;  }  const char *avdtp_strerror(struct avdtp_error *err)  | 
