diff options
| -rw-r--r-- | audio/ipc.h | 3 | ||||
| -rw-r--r-- | audio/pcm_bluetooth.c | 20 | ||||
| -rw-r--r-- | audio/unix.c | 10 | 
3 files changed, 30 insertions, 3 deletions
| diff --git a/audio/ipc.h b/audio/ipc.h index 3768dcfb..4da7d2ae 100644 --- a/audio/ipc.h +++ b/audio/ipc.h @@ -117,10 +117,13 @@ typedef struct {  #define BT_CAPABILITIES_ACCESS_MODE_WRITE	2  #define BT_CAPABILITIES_ACCESS_MODE_READWRITE	3 +#define BT_FLAG_AUTOCONNECT	1 +  struct bt_getcapabilities_req {  	bt_audio_msg_header_t	h;  	char			device[18];	/* Address of the remote Device */  	uint8_t			transport;	/* Requested transport */ +	uint8_t			flags;		/* Requested flags */  } __attribute__ ((packed));  /* BT_GETCAPABILITIES_RSP */ diff --git a/audio/pcm_bluetooth.c b/audio/pcm_bluetooth.c index a04f18c0..e8a524c8 100644 --- a/audio/pcm_bluetooth.c +++ b/audio/pcm_bluetooth.c @@ -122,6 +122,7 @@ struct bluetooth_alsa_config {  	int has_block_length;  	uint8_t bitpool;		/* A2DP only */  	int has_bitpool; +	int autoconnect;  };  struct bluetooth_data { @@ -1268,11 +1269,14 @@ static int bluetooth_parse_config(snd_config_t *conf,  				struct bluetooth_alsa_config *bt_config)  {  	snd_config_iterator_t i, next; -	const char *addr, *pref; +	const char *addr, *pref, *autoconnect;  	const char *mode, *allocation, *rate, *subbands, *blocks, *bitpool;  	memset(bt_config, 0, sizeof(struct bluetooth_alsa_config)); +	/* Set defaults */ +	bt_config->autoconnect = 1; +  	snd_config_for_each(i, next, conf) {  		snd_config_t *n = snd_config_iterator_entry(i);  		const char *id; @@ -1283,6 +1287,17 @@ static int bluetooth_parse_config(snd_config_t *conf,  		if (strcmp(id, "comment") == 0 || strcmp(id, "type") == 0)  			continue; +		if (strcmp(id, "autoconnect") == 0) { +			if (snd_config_get_string(n, &autoconnect) < 0) { +				SNDERR("Invalid type for %s", id); +				return -EINVAL; +			} + +			if (strcmp(autoconnect, "no") == 0) +				bt_config->autoconnect = 0; +			continue; +		} +  		if (strcmp(id, "device") == 0 || strcmp(id, "bdaddr") == 0) {  			if (snd_config_get_string(n, &addr) < 0) {  				SNDERR("Invalid type for %s", id); @@ -1514,6 +1529,9 @@ static int bluetooth_init(struct bluetooth_data *data, snd_pcm_stream_t stream,  	memset(getcaps_req, 0, BT_AUDIO_IPC_PACKET_SIZE);  	getcaps_req->h.msg_type = BT_GETCAPABILITIES_REQ; +	getcaps_req->flags = 0; +	if (alsa_conf->autoconnect) +		getcaps_req->flags |= BT_FLAG_AUTOCONNECT;  	strncpy(getcaps_req->device, alsa_conf->device, 18);  	if (alsa_conf->has_transport)  		getcaps_req->transport = alsa_conf->transport; diff --git a/audio/unix.c b/audio/unix.c index d71c420a..f3c6e6aa 100644 --- a/audio/unix.c +++ b/audio/unix.c @@ -765,6 +765,8 @@ static void handle_getcapabilities_req(struct unix_client *client,  		client->interface = g_strdup(AUDIO_SINK_INTERFACE);  	if (!manager_find_device(&bdaddr, NULL, FALSE)) { +		if (!(req->flags & BT_FLAG_AUTOCONNECT)) +			goto failed;  		if (!bacmp(&bdaddr, BDADDR_ANY))  			goto failed;  		if (!manager_create_device(&bdaddr, create_cb, client)) @@ -773,8 +775,12 @@ static void handle_getcapabilities_req(struct unix_client *client,  	}  	dev = manager_find_device(&bdaddr, client->interface, TRUE); -	if (!dev) -		dev = manager_find_device(&bdaddr, client->interface, FALSE); +	if (!dev) { +		if (req->flags & BT_FLAG_AUTOCONNECT) +			dev = manager_find_device(&bdaddr, client->interface, FALSE); +		else +			goto failed; +	}  	if (!dev)  		goto failed; | 
