diff mbox series

[v2,2/3] transport: Update transport release flow for bcast src

Message ID 20231002153352.3163-3-iulia.tanasescu@nxp.com (mailing list archive)
State New, archived
Headers show
Series Update transport acquire/release flow BAP bcast source | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/CheckPatch success CheckPatch PASS
tedd_an/GitLint success Gitlint PASS
tedd_an/IncrementalBuild success Incremental Build PASS

Commit Message

Iulia Tanasescu Oct. 2, 2023, 3:33 p.m. UTC
From: Silviu Florian Barbulescu <silviu.barbulescu@nxp.com>

Update transport release flow for broadcast source

---
 profiles/audio/transport.c | 63 ++++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 27 deletions(-)

Comments

Pauli Virtanen Oct. 2, 2023, 3:44 p.m. UTC | #1
Hi,

ma, 2023-10-02 kello 18:33 +0300, Iulia Tanasescu kirjoitti:
> From: Silviu Florian Barbulescu <silviu.barbulescu@nxp.com>
> 
> Update transport release flow for broadcast source
> 
> ---
>  profiles/audio/transport.c | 63 ++++++++++++++++++++++----------------
>  1 file changed, 36 insertions(+), 27 deletions(-)
> 
> diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
> index 1e03b7b51..646061358 100644
> --- a/profiles/audio/transport.c
> +++ b/profiles/audio/transport.c
> @@ -606,11 +606,38 @@ static DBusMessage *try_acquire(DBusConnection *conn, DBusMessage *msg,
>  	return NULL;
>  }
>  
> +static void bap_stop_complete(struct bt_bap_stream *stream,
> +					uint8_t code, uint8_t reason,
> +					void *user_data)
> +{
> +	struct media_owner *owner = user_data;
> +	struct media_request *req = owner->pending;
> +	struct media_transport *transport = owner->transport;
> +
> +	/* Release always succeeds */
> +	if (req) {
> +		req->id = 0;
> +		media_request_reply(req, 0);
> +		media_owner_remove(owner);
> +	}
> +
> +	transport_set_state(transport, TRANSPORT_STATE_IDLE);
> +	media_transport_remove_owner(transport);
> +}
> +
> +static void bap_disable_complete(struct bt_bap_stream *stream,
> +					uint8_t code, uint8_t reason,
> +					void *user_data)
> +{
> +	bap_stop_complete(stream, code, reason, user_data);
> +}
> +
>  static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
>  					void *data)
>  {
>  	struct media_transport *transport = data;
>  	struct media_owner *owner = transport->owner;
> +	struct bap_transport *bap = transport->data;
>  	const char *sender;
>  	struct media_request *req;
>  	guint id;
> @@ -642,6 +669,11 @@ static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
>  	req = media_request_create(msg, id);
>  	media_owner_add(owner, req);
>  
> +	if (bt_bap_stream_get_type(bap->stream) ==
> +			BT_BAP_STREAM_TYPE_BCAST) {
> +		bap_disable_complete(bap->stream, 0x00, 0x00, owner);
> +	}
> +
>  	return NULL;
>  }
>  
> @@ -1370,32 +1402,6 @@ static guint resume_bap(struct media_transport *transport,
>  	return id;
>  }
>  
> -static void bap_stop_complete(struct bt_bap_stream *stream,
> -					uint8_t code, uint8_t reason,
> -					void *user_data)
> -{
> -	struct media_owner *owner = user_data;
> -	struct media_request *req = owner->pending;
> -	struct media_transport *transport = owner->transport;
> -
> -	/* Release always succeeds */
> -	if (req) {
> -		req->id = 0;
> -		media_request_reply(req, 0);
> -		media_owner_remove(owner);
> -	}
> -
> -	transport_set_state(transport, TRANSPORT_STATE_IDLE);
> -	media_transport_remove_owner(transport);
> -}
> -
> -static void bap_disable_complete(struct bt_bap_stream *stream,
> -					uint8_t code, uint8_t reason,
> -					void *user_data)
> -{
> -	bap_stop_complete(stream, code, reason, user_data);
> -}
> -
>  static guint suspend_bap(struct media_transport *transport,
>  				struct media_owner *owner)
>  {
> @@ -1499,9 +1505,12 @@ static void bap_state_changed(struct bt_bap_stream *stream, uint8_t old_state,
>  			return;
>  		break;
>  	case BT_BAP_STREAM_STATE_STREAMING:
> -		if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE)

This change is maybe not intended, seems to run update_bcast_qos also
for ucast?

>  			bap_update_bcast_qos(transport);
>  		break;
> +	case BT_BAP_STREAM_STATE_RELEASING:
> +		if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK)
> +			return;
> +		break;
>  	}
>  
>  	io = bt_bap_stream_get_io(stream);
diff mbox series

Patch

diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 1e03b7b51..646061358 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -606,11 +606,38 @@  static DBusMessage *try_acquire(DBusConnection *conn, DBusMessage *msg,
 	return NULL;
 }
 
+static void bap_stop_complete(struct bt_bap_stream *stream,
+					uint8_t code, uint8_t reason,
+					void *user_data)
+{
+	struct media_owner *owner = user_data;
+	struct media_request *req = owner->pending;
+	struct media_transport *transport = owner->transport;
+
+	/* Release always succeeds */
+	if (req) {
+		req->id = 0;
+		media_request_reply(req, 0);
+		media_owner_remove(owner);
+	}
+
+	transport_set_state(transport, TRANSPORT_STATE_IDLE);
+	media_transport_remove_owner(transport);
+}
+
+static void bap_disable_complete(struct bt_bap_stream *stream,
+					uint8_t code, uint8_t reason,
+					void *user_data)
+{
+	bap_stop_complete(stream, code, reason, user_data);
+}
+
 static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
 					void *data)
 {
 	struct media_transport *transport = data;
 	struct media_owner *owner = transport->owner;
+	struct bap_transport *bap = transport->data;
 	const char *sender;
 	struct media_request *req;
 	guint id;
@@ -642,6 +669,11 @@  static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
 	req = media_request_create(msg, id);
 	media_owner_add(owner, req);
 
+	if (bt_bap_stream_get_type(bap->stream) ==
+			BT_BAP_STREAM_TYPE_BCAST) {
+		bap_disable_complete(bap->stream, 0x00, 0x00, owner);
+	}
+
 	return NULL;
 }
 
@@ -1370,32 +1402,6 @@  static guint resume_bap(struct media_transport *transport,
 	return id;
 }
 
-static void bap_stop_complete(struct bt_bap_stream *stream,
-					uint8_t code, uint8_t reason,
-					void *user_data)
-{
-	struct media_owner *owner = user_data;
-	struct media_request *req = owner->pending;
-	struct media_transport *transport = owner->transport;
-
-	/* Release always succeeds */
-	if (req) {
-		req->id = 0;
-		media_request_reply(req, 0);
-		media_owner_remove(owner);
-	}
-
-	transport_set_state(transport, TRANSPORT_STATE_IDLE);
-	media_transport_remove_owner(transport);
-}
-
-static void bap_disable_complete(struct bt_bap_stream *stream,
-					uint8_t code, uint8_t reason,
-					void *user_data)
-{
-	bap_stop_complete(stream, code, reason, user_data);
-}
-
 static guint suspend_bap(struct media_transport *transport,
 				struct media_owner *owner)
 {
@@ -1499,9 +1505,12 @@  static void bap_state_changed(struct bt_bap_stream *stream, uint8_t old_state,
 			return;
 		break;
 	case BT_BAP_STREAM_STATE_STREAMING:
-		if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE)
 			bap_update_bcast_qos(transport);
 		break;
+	case BT_BAP_STREAM_STATE_RELEASING:
+		if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK)
+			return;
+		break;
 	}
 
 	io = bt_bap_stream_get_io(stream);