Diff between 5a112d14e42369e97d3c415a3a08ee62727da8db and 9948168cca15f8a4d68c963d2fb06506b0f6ba6d

Changed Files

File Additions Deletions Status
profiles/audio/asha.c +2 -3 modified
profiles/audio/asha.h +1 -2 modified
profiles/audio/transport.c +4 -12 modified
src/shared/asha.c +10 -9 modified
src/shared/asha.h +1 -3 modified

Full Patch

diff --git a/profiles/audio/asha.c b/profiles/audio/asha.c
index d478faf..9bd57d7 100644
--- a/profiles/audio/asha.c
+++ b/profiles/audio/asha.c
@@ -170,10 +170,9 @@ unsigned int bt_asha_device_start(struct bt_asha_device *asha_dev,
 		return (++asha_dev->resume_id);
 }
 
-unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev,
-					bt_asha_cb_t cb, void *user_data)
+unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev)
 {
-	bt_asha_stop(asha_dev->asha, cb, user_data);
+	bt_asha_stop(asha_dev->asha);
 
 	if (asha_dev->io) {
 		g_io_channel_shutdown(asha_dev->io, TRUE, NULL);
diff --git a/profiles/audio/asha.h b/profiles/audio/asha.h
index afd23e1..9ffd9d3 100644
--- a/profiles/audio/asha.h
+++ b/profiles/audio/asha.h
@@ -19,8 +19,7 @@ struct bt_asha_device;
 
 unsigned int bt_asha_device_start(struct bt_asha_device *asha_dev,
 					bt_asha_cb_t cb, void *user_data);
-unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev,
-					bt_asha_cb_t cb, void *user_data);
+unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev);
 
 void bt_asha_device_state_reset(struct bt_asha_device *asha_dev);
 unsigned int bt_asha_device_device_get_resume_id(
diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 3d1f55b..c5ae3a7 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -2247,9 +2247,6 @@ static void asha_transport_sync_state(struct media_transport *transport,
 	case ASHA_STARTED:
 		transport_set_state(transport, TRANSPORT_STATE_ACTIVE);
 		break;
-	case ASHA_STOPPING:
-		transport_set_state(transport, TRANSPORT_STATE_SUSPENDING);
-		break;
 	}
 }
 
@@ -2324,11 +2321,11 @@ static guint transport_asha_suspend(struct media_transport *transport,
 	guint ret = 0;
 
 	if (owner) {
-		ret = bt_asha_device_stop(asha_dev, asha_transport_state_cb,
-									owner);
+		ret = bt_asha_device_stop(asha_dev);
 		asha_transport_sync_state(transport, asha_dev);
+		asha_transport_state_cb(-1, owner);
 	} else {
-		ret = bt_asha_device_stop(asha_dev, NULL, NULL);
+		ret = bt_asha_device_stop(asha_dev);
 		/* We won't have a callback to set the final state */
 		transport_set_state(transport, TRANSPORT_STATE_IDLE);
 	}
@@ -2349,14 +2346,9 @@ static void transport_asha_cancel(struct media_transport *transport, guint id)
 
 	if (state == ASHA_STARTING || state == ASHA_STARTED) {
 		DBG("Cancel requested, stopping");
-		bt_asha_device_stop(asha_dev, NULL, NULL);
+		bt_asha_device_stop(asha_dev);
 		/* We won't have a callback to set the final state */
 		transport_set_state(transport, TRANSPORT_STATE_IDLE);
-	} else if (state == ASHA_STOPPING) {
-		DBG("Cancel requested, resetting transport state");
-		/* We already dispatched a stop, just reset our state */
-		bt_asha_device_state_reset(asha_dev);
-		transport_set_state(transport, TRANSPORT_STATE_IDLE);
 	}
 }
 
diff --git a/src/shared/asha.c b/src/shared/asha.c
index c9277e0..69906fc 100644
--- a/src/shared/asha.c
+++ b/src/shared/asha.c
@@ -272,8 +272,7 @@ unsigned int bt_asha_start(struct bt_asha *asha, bt_asha_cb_t cb,
 	return 0;
 }
 
-unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb,
-								void *user_data)
+unsigned int bt_asha_stop(struct bt_asha *asha)
 {
 	uint8_t acp_stop_cmd[] = {
 		0x02, /* STOP */
@@ -283,12 +282,16 @@ unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb,
 	if (asha->state != ASHA_STARTED)
 		return 0;
 
-	asha->state = ASHA_STOPPING;
+	asha->state = ASHA_STOPPED;
 
-	ret = asha_send_acp(asha, acp_stop_cmd, sizeof(acp_stop_cmd),
-			cb, user_data);
+	ret = asha_send_acp(asha, acp_stop_cmd, sizeof(acp_stop_cmd), NULL,
+			NULL);
 	asha_set_send_status(asha, false);
 
+	/* We reset our state without waiting for a response */
+	bt_asha_state_reset(asha);
+	DBG("ASHA stop done");
+
 	return ret;
 }
 
@@ -441,6 +444,8 @@ static void audio_status_notify(uint16_t value_handle, const uint8_t *value,
 	bt_asha_cb_t state_cb = asha->state_cb;
 	bt_asha_cb_t state_cb_data = asha->state_cb_data;
 
+	DBG("ASHA status %u", status);
+
 	if (asha->state == ASHA_STARTING) {
 		if (status == 0) {
 			asha->state = ASHA_STARTED;
@@ -451,10 +456,6 @@ static void audio_status_notify(uint16_t value_handle, const uint8_t *value,
 			bt_asha_state_reset(asha);
 			DBG("ASHA start failed");
 		}
-	} else if (asha->state == ASHA_STOPPING) {
-		/* We reset our state, regardless */
-		bt_asha_state_reset(asha);
-		DBG("ASHA stop %s", status == 0 ? "complete" : "failed");
 	}
 
 	if (state_cb) {
diff --git a/src/shared/asha.h b/src/shared/asha.h
index 680a270..9e62fcd 100644
--- a/src/shared/asha.h
+++ b/src/shared/asha.h
@@ -19,7 +19,6 @@ enum bt_asha_state_t {
 	ASHA_STOPPED = 0,
 	ASHA_STARTING,
 	ASHA_STARTED,
-	ASHA_STOPPING,
 };
 
 typedef void (*bt_asha_cb_t)(int status, void *data);
@@ -64,8 +63,7 @@ void bt_asha_free(struct bt_asha *asha);
 
 unsigned int bt_asha_start(struct bt_asha *asha, bt_asha_cb_t cb,
 							void *user_data);
-unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb,
-							void *user_data);
+unsigned int bt_asha_stop(struct bt_asha *asha);
 
 bool bt_asha_set_volume(struct bt_asha *asha, int8_t volume);