diff options
| -rw-r--r-- | audio/avdtp.c | 11 | ||||
| -rw-r--r-- | audio/control.c | 14 | ||||
| -rw-r--r-- | audio/manager.c | 18 | ||||
| -rw-r--r-- | audio/manager.h | 5 | 
4 files changed, 34 insertions, 14 deletions
| diff --git a/audio/avdtp.c b/audio/avdtp.c index 26e38b5d..63b9bdc4 100644 --- a/audio/avdtp.c +++ b/audio/avdtp.c @@ -48,6 +48,7 @@  #include "control.h"  #include "avdtp.h"  #include "glib-helper.h" +#include "sink.h"  #include <bluetooth/l2cap.h> @@ -2748,6 +2749,7 @@ static void avdtp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,  	socklen_t size;  	struct l2cap_options l2o;  	struct avdtp *session; +	struct audio_device *dev;  	char address[18];  	if (err < 0) { @@ -2780,6 +2782,15 @@ static void avdtp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,  		goto drop;  	} +	dev = manager_get_device(src, dst, NULL); +	if (!dev) { +		error("Unable to get audio device object for %s", address); +		goto drop; +	} + +	if (!dev->sink) +		dev->sink = sink_init(dev); +  	session->mtu = l2o.imtu;  	session->sock = sk; diff --git a/audio/control.c b/audio/control.c index 1dcab3c2..8b3b2d8a 100644 --- a/audio/control.c +++ b/audio/control.c @@ -666,6 +666,7 @@ static void avctp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,  	struct l2cap_options l2o;  	struct avctp *session;  	GIOCondition flags = G_IO_ERR | G_IO_HUP | G_IO_NVAL; +	struct audio_device *dev;  	char address[18];  	if (err < 0) { @@ -685,6 +686,15 @@ static void avctp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,  		goto drop;  	} +	dev = manager_get_device(src, dst, NULL); +	if (!dev) { +		error("Unable to get audio device object for %s", address); +		goto drop; +	} + +	if (!dev->control) +		dev->control = control_init(dev); +  	session->state = AVCTP_STATE_CONNECTING;  	session->sock = g_io_channel_unix_get_fd(chan); @@ -694,7 +704,6 @@ static void avctp_server_cb(GIOChannel *chan, int err, const bdaddr_t *src,  		err = errno;  		error("getsockopt(L2CAP_OPTIONS): %s (%d)", strerror(err),  				err); -		avctp_unref(session);  		goto drop;  	} @@ -721,7 +730,8 @@ proceed:  	return;  drop: -	close(session->sock); +	g_io_channel_close(chan); +	avctp_unref(session);  }  static GIOChannel *avctp_server_socket(const bdaddr_t *src, gboolean master) diff --git a/audio/manager.c b/audio/manager.c index 5a043f5e..ee44835c 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -491,10 +491,13 @@ static void ag_io_cb(GIOChannel *chan, int err, const bdaddr_t *src,  		uuid = HFP_AG_UUID;  	} -	device = manager_find_device(dst, NULL, FALSE); +	device = manager_get_device(src, dst, NULL);  	if (!device)  		goto drop; +	if (!device->headset) +		device->headset = headset_init(device, NULL, 0); +  	if (headset_get_state(device) > HEADSET_STATE_DISCONNECTED) {  		debug("Refusing new connection since one already exists");  		goto drop; @@ -685,7 +688,7 @@ static int audio_probe(struct btd_device *device, GSList *records)  	adapter_get_address(adapter, &src);  	device_get_address(device, &dst); -	dev = manager_get_device(&src, &dst, path, NULL); +	dev = manager_get_device(&src, &dst, path);  	if (!dev) {  		debug("audio_probe: unable to get a device object");  		return -1; @@ -1057,14 +1060,12 @@ struct audio_device *manager_find_device(const bdaddr_t *bda, const char *interf  	return NULL;  } -struct audio_device *manager_get_device(bdaddr_t *src, bdaddr_t *dst, -					const char *path, gboolean *created) +struct audio_device *manager_get_device(const bdaddr_t *src, +					const bdaddr_t *dst, +					const char *path)  {  	struct audio_device *dev; -	if (created) -		*created = FALSE; -  	dev = manager_find_device(dst, NULL, FALSE);  	if (dev)  		return dev; @@ -1100,8 +1101,5 @@ struct audio_device *manager_get_device(bdaddr_t *src, bdaddr_t *dst,  	devices = g_slist_append(devices, dev); -	if (created) -		*created = TRUE; -  	return dev;  } diff --git a/audio/manager.h b/audio/manager.h index 7feaf83c..3d712f41 100644 --- a/audio/manager.h +++ b/audio/manager.h @@ -38,5 +38,6 @@ gboolean server_is_enabled(bdaddr_t *src, uint16_t svc);  struct audio_device *manager_find_device(const bdaddr_t *bda, const char *interface,  					gboolean connected); -struct audio_device *manager_get_device(bdaddr_t *sba, bdaddr_t *dba, -					const char *path, gboolean *created); +struct audio_device *manager_get_device(const bdaddr_t *src, +					const bdaddr_t *dst, +					const char *path); | 
