diff options
| -rw-r--r-- | audio/gateway.c | 4 | ||||
| -rw-r--r-- | audio/headset.c | 2 | ||||
| -rw-r--r-- | audio/headset.h | 10 | ||||
| -rw-r--r-- | audio/ipc.h | 17 | ||||
| -rw-r--r-- | audio/pcm_bluetooth.c | 16 | ||||
| -rw-r--r-- | audio/unix.c | 45 | ||||
| -rw-r--r-- | audio/unix.h | 1 | 
7 files changed, 61 insertions, 34 deletions
| diff --git a/audio/gateway.c b/audio/gateway.c index afdcbe01..3b84462d 100644 --- a/audio/gateway.c +++ b/audio/gateway.c @@ -314,7 +314,8 @@ static void auth_cb(DBusPendingCall *call, void *data)  			send_cancel_auth(device);  		}  		dbus_error_free(&err); -		headset_close_rfcomm(device); + +		headset_set_state(device, HEADSET_STATE_DISCONNECTED);  	} else {  		char hs_address[18]; @@ -407,6 +408,7 @@ static gboolean gateway_io_cb(GIOChannel *chan, GIOCondition cond, void *data)  	dbus_pending_call_set_notify(pending, auth_cb, device, NULL);  	dbus_pending_call_unref(pending);  	dbus_message_unref(auth); +	headset_set_state(device, HEADSET_STATE_CONNECT_IN_PROGRESS);  	return TRUE; diff --git a/audio/headset.c b/audio/headset.c index ca24e93b..edb323ee 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -206,7 +206,7 @@ static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond,  	err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf) - 1,  				&bytes_read);  	if (err != G_IO_ERROR_NONE) -		goto failed; +		error("Ignoring error %d", err);  	free_space = sizeof(hs->buf) - hs->data_start - hs->data_length - 1; diff --git a/audio/headset.h b/audio/headset.h index c858d206..d3fd86d9 100644 --- a/audio/headset.h +++ b/audio/headset.h @@ -40,11 +40,11 @@ typedef enum {  } headset_event_t;  typedef enum { -	HEADSET_STATE_DISCONNECTED = 0, -	HEADSET_STATE_CONNECT_IN_PROGRESS, -	HEADSET_STATE_CONNECTED, -	HEADSET_STATE_PLAY_IN_PROGRESS, -	HEADSET_STATE_PLAYING, +	HEADSET_STATE_DISCONNECTED = STATE_DISCONNECTED, +	HEADSET_STATE_CONNECT_IN_PROGRESS = STATE_CONNECTING, +	HEADSET_STATE_CONNECTED = STATE_CONNECTED, +	HEADSET_STATE_PLAY_IN_PROGRESS = STATE_STREAM_STARTING, +	HEADSET_STATE_PLAYING = STATE_STREAMING,  } headset_state_t;  typedef enum { diff --git a/audio/ipc.h b/audio/ipc.h index d340d15e..e56dca24 100644 --- a/audio/ipc.h +++ b/audio/ipc.h @@ -40,8 +40,8 @@  /* Packet types */  #define PKT_TYPE_CFG_REQ	0  #define PKT_TYPE_CFG_RSP	1 -#define PKT_TYPE_STATUS_REQ	2 -#define PKT_TYPE_STATUS_RSP	3 +#define PKT_TYPE_STATE_REQ	2 +#define PKT_TYPE_STATE_RSP	3  #define PKT_TYPE_CTL_REQ	4  #define PKT_TYPE_CTL_RSP	5  #define PKT_TYPE_CTL_NTFY	6 @@ -75,13 +75,14 @@ struct ipc_data_cfg {  } __attribute__ ((packed));  /* Device status */ -#define STATUS_DISCONNECTED	0 -#define STATUS_CONNECTING	1 -#define STATUS_CONNECTED	2 -#define STATUS_STREAMING	3 +#define STATE_DISCONNECTED	0 +#define STATE_CONNECTING	1 +#define STATE_CONNECTED		2 +#define STATE_STREAM_STARTING	3 +#define STATE_STREAMING		4 -struct ipc_data_status { -	uint8_t status;		/* Stream status */ +struct ipc_data_state { +	uint8_t state;		/* Stream state */  } __attribute__ ((packed));  #define CTL_MODE_PLAYBACK	0 diff --git a/audio/pcm_bluetooth.c b/audio/pcm_bluetooth.c index 71daab4f..92d0383c 100644 --- a/audio/pcm_bluetooth.c +++ b/audio/pcm_bluetooth.c @@ -86,25 +86,27 @@ static snd_pcm_sframes_t bluetooth_pointer(snd_pcm_ioplug_t *io)  static void bluetooth_exit(struct bluetooth_data *data)  { -	int ret, len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_status); +	int ret, len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_state);  	struct ipc_packet *pkt; -	struct ipc_data_status *status; +	struct ipc_data_state *state;  	DBG("Sending PKT_TYPE_STATUS_REQ..."); -	if ((pkt = malloc(len)) == 0) +	if ((pkt = malloc(len)) == NULL)  		goto done;  	memset(pkt, 0, len); -	pkt->type = PKT_TYPE_STATUS_REQ; +	pkt->type = PKT_TYPE_STATE_REQ;  	pkt->role = PKT_ROLE_NONE;  	pkt->error = PKT_ERROR_NONE; -	status = (struct ipc_data_status *) pkt->data; -	status->status = STATUS_DISCONNECTED; +	state = (struct ipc_data_state *) pkt->data; +	state->state = STATE_DISCONNECTED;  	if ((ret = send(data->sock, pkt, len, 0)) < 0) -		DBG("OK"); +		DBG("Error %s (%d)", strerror(errno), errno); + +	free(pkt);  done:  	if (data == NULL)  		return; diff --git a/audio/unix.c b/audio/unix.c index 0f6c53aa..fbda7ed9 100644 --- a/audio/unix.c +++ b/audio/unix.c @@ -97,18 +97,18 @@ static void ctl_event(int clisk, struct ipc_packet *pkt)  {  } -static void status_event(int clisk, struct ipc_packet *pkt) +static void state_event(int clisk, struct ipc_packet *pkt)  { -	struct ipc_data_status *status = (struct ipc_data_status *) pkt->data; +	struct ipc_data_state *state = (struct ipc_data_state *) pkt->data;  	struct device *device; -	if (status->status == STATUS_DISCONNECTED) { -		if (!(device = manager_default_device())) -			return; +	if (!(device = manager_default_device())) +		return; -		if (device->headset) -			headset_set_state(device, HEADSET_STATE_DISCONNECTED); -	} +	if (device->headset) +		headset_set_state(device, state->state); + +	unix_send_status(clisk, pkt);  	g_free(pkt);  } @@ -152,9 +152,9 @@ static gboolean unix_event(GIOChannel *chan, GIOCondition cond, gpointer data)  		info("Package PKT_TYPE_CFG_REQ:%u", pkt->role);  		cfg_event(clisk, pkt);  		break; -	case PKT_TYPE_STATUS_REQ: -		info("Package PKT_TYPE_STATUS_REQ"); -		status_event(clisk, pkt); +	case PKT_TYPE_STATE_REQ: +		info("Package PKT_TYPE_STATE_REQ"); +		state_event(clisk, pkt);  		break;  	case PKT_TYPE_CTL_REQ:  		info("Package PKT_TYPE_CTL_REQ"); @@ -239,6 +239,27 @@ int unix_send_cfg(int sock, struct ipc_packet *pkt)  	}  	g_free(pkt); -	close(sock); +	return 0; +} + +int unix_send_status(int sock, struct ipc_packet *pkt) +{ +	struct ipc_data_state *state = (struct ipc_data_state *) pkt->data; +	int len; + +	info("status=%u", state->state); + +	pkt->type = PKT_TYPE_CFG_RSP; +	pkt->length = sizeof(struct ipc_data_state); +	pkt->error = PKT_ERROR_NONE; + +	len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_state); +	len = send(sock, pkt, len, 0); +	if (len < 0) +		info("Error %s(%d)", strerror(errno), errno); + +	info("%d bytes sent", len); + +	g_free(pkt);  	return 0;  } diff --git a/audio/unix.h b/audio/unix.h index 15da23ab..32cf4af9 100644 --- a/audio/unix.h +++ b/audio/unix.h @@ -27,3 +27,4 @@ int unix_init(void);  void unix_exit(void);  int unix_send_cfg(int sock, struct ipc_packet *pkt); +int unix_send_status(int sock, struct ipc_packet *pkt); | 
