From patchwork Sat Mar 1 15:57:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869634 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D79871E25F2 for ; Sat, 1 Mar 2025 15:57:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844677; cv=pass; b=jGqmG+atk/kH1f9wS+FhMR3cFfg5pRnuTS6blnc071vCjItTTU70HdAPkq8g1s8KcTIxOMMmzJ/pKu3GrffyFuMTH+SlYzPGos22MRuSA8ThObHyr5g+R+YwQyRV5UBs8XITsOhlKaMPFG0FDeBbiAw0lH98dtF1BTyqSIe9424= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844677; c=relaxed/simple; bh=Ux5LcfynxecuvLvkm4hsFeM7T4nlOoQFGkhWuHZuF3k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dh2GljSfb9BO8pbtyn3dfIoArI1/pS+rEzGpR9QTBHTADplpRQg3hBFDe+9fhHKGWFPFKLbaEfWMi/0KmjS4ZNVQ0E4PVjt3rNHkOjeILovyql+uywjWqEGZlfpU6H0baN7T0Y4Z3TGFb+PFf+NOoayzjq83n3qiMgLDl5Bv0K8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=pJ4TX77m; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="pJ4TX77m" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV24tSlz4BKHQ; Sat, 1 Mar 2025 17:57:46 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UPjG68OlHxHej9ZzthsJkgqZ31PR1WkRYBKIgLhBFcQ=; b=pJ4TX77mOjVqwEhydduJs3DJ2tz65fFrGDgPys3Q1Ls6+rRXYMQuxKw+5awXoZ7HfwqT7Z UORD279hh0EVUciyIhJBaOvA2lLl7tCYoHLO4tazuPCw7zYZOCDuNmkgVsSic5G6sik1ub qFzaBHH8Q+yaGYF29Vlvq9irZUdnhi+GLJLHD2rZDoOBDSCaIzKK8oFwxmIXfbWi6Nyg92 y+4N9UbwvBvmMUyosTRvm61RwQYxCdpKh8LZJlizrcWzDFh66Za7MkxOV3NrzD20DLP6NU OmuelsXTGHmi6bcA97NM9lW+NdUsjtyjqHK30o5ahiNoan/RdVSIFxl1Cizepg== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844667; a=rsa-sha256; cv=none; b=Q7Ql0BrZHXs1qXr3ir0F0DUiOAXLW73DMF5+Wy9tDKbSjZ1MlsvBITgLwe2RXvuhqjkw1N LFs2K5/J0LncgiqnwNDNfzDuG5G+Za2DDI/HHzW3TynYAiJkuZQ3xwjCTadb6QIeqeTB3H w4x0Mu/1AneXbQREl8gslhKX+guIlEyqX3UqV8n2AnVx6xdN4CTLoFNaBjCeWBXHFVO+4E PWISmqjpWNwueZdWVB7DMNyVegFcO1AbiflerXKBI28Vew0OcLxpXvXIDrgY5qA61TNca7 NFy+kbpBjv2X2MRdPwjGEcygK1VEDiG1kPQKJu/GVhklKuYBwVJkuX63eNYpaw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UPjG68OlHxHej9ZzthsJkgqZ31PR1WkRYBKIgLhBFcQ=; b=EHUxMI30CY+BlI3niGlzIZgfUZRmeEWHemVDay0Yr3y4j9vtK3/lsrDVSAdIH2XO90nGvq XuvAtf7yBVXux+Z2w8ta/U5rK/NIna2YH9RdF23ZCDurEvb00yuq8yKRTlKRUJU9+g4LxP YLqfLwcZxsdkbUThlHBkKadpK4P695jjYueYZbLM08dNa8Dt+I9s2rbjF03QyNoUHcCVy2 DD2OQ2JeVWWJkwp4q/6k7NqMHDmi+NXpyDGq0wq0I8Qb8Ti9lZLvIUPVzPTraByYtyG+38 Y8feIFLCrldG1EcEDc7zq6R2fZ/9FrhLGg7FR/89TpwF/VXVm1rUxgLA6nXH+g== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 1/9] org.bluez.MediaEndpoint: removing BAP streams with ClearConfiguration Date: Sat, 1 Mar 2025 17:57:32 +0200 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Allow user to remove specific streams by calling ClearConfiguration(transport_path) on the endpoint. If the path is the endpoint path instead, clear all streams associated with the endpoint. --- doc/org.bluez.MediaEndpoint.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/org.bluez.MediaEndpoint.rst b/doc/org.bluez.MediaEndpoint.rst index f2b830ab0..b81106f0b 100644 --- a/doc/org.bluez.MediaEndpoint.rst +++ b/doc/org.bluez.MediaEndpoint.rst @@ -109,6 +109,12 @@ void ClearConfiguration(object transport) Clear transport configuration. + **Server role:** [ISO only] + + Close the stream associated with the given transport. If the + path given is the path of this endpoint, all its streams are + closed. + void Release() `````````````` From patchwork Sat Mar 1 15:57:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869633 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 832D81E2616 for ; Sat, 1 Mar 2025 15:57:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844678; cv=pass; b=pzhSPBFdarn2LhuvVZlv6l7cYHmXVRZlCLNXmFc7TBdWt+ew054oYqe7SjwmlfKj+FS4dta5B6ps0KqCd4ybel0KDNqK3oE1sAf4VB+WY4zzhikuZ5nfDmZGkz9ZYNyQf2nF4bRYakki2jKbhWtP+S7+Z96OPpYzcJtD6W57NKs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844678; c=relaxed/simple; bh=stWgJ+O85uEr95Nl9bercZpz8zC1xflPqMpdjtUVNOQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RIxcYI5KQmb4zvw0ckPPIxaC++WU30pJMLgnp1d5bchkoq41CBG+9DCLiHQfY/W2n9sa26/y0L3jFU3gGLK76HexdosJ7FOxWpyZnkx0mEY6Rx/g1SPcCUhiIGIA47zwQJIdrEpBtBKLShlPOVqyrLN9igMxpxCudcL42xOv52w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=b1UIkpWm; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="b1UIkpWm" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV32pl3z4BKHW; Sat, 1 Mar 2025 17:57:47 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zG1uo1/mrsbdo8oiNsGlIvnIFNBikeqzXJ9l3A08nEY=; b=b1UIkpWmuG018izmcntrHrn15BOCFZiWVMtg3wEW1GIDsxgMjdgC7qRkZjZt1dei/juNqn +o2Edlfzag4TgN5/5aFxxqwxtv1sMBmOUstdSN3MZti7VbnyRsOq7nMwgMN+sU32NCiYYW 0eOT4fl5Jw3dk2z5ZAzXN/tgUHwC0nUUJgdOLhMPUomvB55mPnSX6/8gfidpJ9N+HFOtq3 +WrltmTlbGM2XlsKgJ3Us2n99kF9iYZkHLrupHjwJefZZeQiGlO840cz6w7x7IZETYkdVn 8nJJ+RAYqCqvCT97ZzJaVUOpuovpqCC0e8vf7phAB9y9hP7Lw8S2Qp59fndNrg== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844667; a=rsa-sha256; cv=none; b=YYZd3iJGJiTHmb8lKvnoBgovCwHEClAWr6CwgjUC2/9ojEBzm24SEkHuzsMRyG2RZPy8LH Ztff+LxUANWirIX505aj6tUVohyskJGXOIT7DOwElAQ/W1pCYW+/0QE3g3xceweeh6FUL1 tH2cbNTZrpppuBNKc4fl2+Ra4N/gZPBgQXqzQfJn9+ZwNV45naR7Mp0yAjQn/GuHed+LXj L1oANeNEri0ncGlRgPiNlsdwXrnSboY5JA59imXad+BZ6gqtMzrQqLMzrbyejvcxindEUq euLfmP1t8xayuwwAQODaEpN3SGezOLUzkW5kNXBcNMIeUW1Kn12WZ4Fqn96C3Q== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zG1uo1/mrsbdo8oiNsGlIvnIFNBikeqzXJ9l3A08nEY=; b=tF+RRBazVz0L3nPY9KtCH6nzdHQosRMxFh5UQe64LEUUU7/AIPMv9s+4ZQHCzcJoGAU5bz k3TdNveeatAZEv5bHiJtralntXNPJpXrVjO7zEzAZDxES0WXixoCcXOFOkH6o8fQjWgnyL G8mkf1CDR/W2j6JyGm9//q3rZVO/2rQdyxbyuyqzuT2sO5StLZ23ZQO8MTobGSS/Bjnk67 lr/UYq9SWr8KGZnhkP5rTc/AnQehAXmAl+/fW5uT6RI3QQlKbz8OXbyP3OsDjVEubrbhbt Q4PUoGI5wGgOmCgFBPk1d7ZFurQBEmhjUhOrSiAPSNv5ukBitwMSCatxOEhsEQ== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 2/9] org.bluez.MediaEndpoint: add client role SelectProperties Date: Sat, 1 Mar 2025 17:57:33 +0200 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add a simple way for the sound server to reconfigure a BAP unicast endpoint, by calling org.bluez.MediaEndpoint.SelectProperties(). This shall destroy all streams of the endpoint, and restart the SelectProperties() configuration flow from the beginning. Since it may be necessary to reconfigure multiple endpoints at once to correctly make bidirectional CIS, add Defer argument to just mark eps for configuration. In future, org.bluez.MediaEndpoint.SetConfiguration() could be changed to handle unicast in the same way as broadcast: only create streams. This allows sound server to have full control over stream configuration itself, and not rely on bt_bap_select(). --- doc/org.bluez.MediaEndpoint.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/doc/org.bluez.MediaEndpoint.rst b/doc/org.bluez.MediaEndpoint.rst index b81106f0b..5c42b878c 100644 --- a/doc/org.bluez.MediaEndpoint.rst +++ b/doc/org.bluez.MediaEndpoint.rst @@ -69,6 +69,8 @@ array{byte} SelectConfiguration(array{byte} capabilities) dict SelectProperties(dict capabilities) ```````````````````````````````````````` + **Server Role** + Select BAP unicast configuration from the supported capabilities: :object Endpoint: @@ -104,6 +106,25 @@ dict SelectProperties(dict capabilities) Note: There is no need to cache the selected properties since on success the configuration is send back as parameter of SetConfiguration. + **Client Role** + + Reconfigure a BAP unicast endpoint. This closes all existing + streams of the endpoint, and restarts the configuration + selection flow which e.g. triggers calls to *SelectProperties* + allowing the sound server to modify the configuration. + + The following arguments are taken in *capabilities*: + + :boolean Defer [optional]: + + If True, mark endpoint for reconfiguration, but + postpone it until a non-deferred *SelectProperties()* + operation is made on an endpoint of the same device. + + This is necessary to use when reconfiguring source and + sink streams with the intention that they be combined + into the same CIG, possibly forming bidirectional CIS. + void ClearConfiguration(object transport) ````````````````````````````````````````` From patchwork Sat Mar 1 15:57:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869740 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 832761E2614 for ; Sat, 1 Mar 2025 15:57:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844677; cv=pass; b=OOFaMg44qQJjDqMSDRuixLWKDbwNGi0n38+8CpWVcSYrCj8ZM0izxyzPyu6Ku9EcLZyIR1GoMn4yhs0IbOX9bUKzclWi00DWftXxGgnqwvgVogi8UvFKp/yJ+GTFtMtmGNlLG18WnCVhzePkvt7d5fHZDuiq9qsRT5jthyXoTos= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844677; c=relaxed/simple; bh=krzWgWBaRgzESrX8FAllhCFWCdRgM3n3/CTwsJMG3uE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d8Tw7l0bT7UemktyoVOzgUq0gW7Ki8LTtudGWVxmmxZXrZauoRffLfK0Loq70Ts2XpSYhUgvfx7NlrGJAAgQb/0fIxpig+51YXB9CYP3n+nXbYXx1nYEgKKhts/MJbCzv3gFGDaiQ8yp1Xc8TGIuUzroBXdGpICAhIgozQ2o/N4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=HwAINF0I; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="HwAINF0I" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV40lNFz4BKHY; Sat, 1 Mar 2025 17:57:47 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844668; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6da2jtaZhWuDX7JVWwBQJce5gdOKNslhErD2wiZ14EM=; b=HwAINF0IKqO1kotPB/Q6tJsTGZBrKxtvAUsfghGqhzVC+Gw/DoicBdFD2QUaCvle1uBz2d wc4Y0vT3uqavAvOkwMiMNna9kZDSFvSbknavaCAG5LIxnKUJsa1vrAE4EV0PcOT9+CQVqM ovLFrD0ZdAifohA944vy64L0dFOuQyUp/5a/LDNIQktRcucuJy7VhFrJVHPpj0v2W/+lSY 3JvQVL+W+Uft4zzY8RORKF8duV/3H2qHZJznCSFTrZaez+GMh10+ZLrxmrCbOMOepSd+Lv gJkCNm6HkI3IP8/KZqQZZZdgrLRIiSEaruUkK4DhnejzxluFCWA2qb+MJm8DSQ== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844668; a=rsa-sha256; cv=none; b=vbEj34D6YF0REh7O5Ct+k+nhNyj9k1xhGESrODsuC8uOMRCdylcxjtz3lwqifkCm3kSfAV VgX0TX/hW4iB+eErAzbtXom4ek/wORfKribQkEqbQNEQkqTFRg+/K5glZlAgq6BDDfgs6/ eB+fHJcnZMD9rHy02hyH6iL5fi4njMQSRtBsHhNl7aVybDOOAwUz8RNkusvUfmuvlX/VFy J/L04+MLMkBHZVjWKLMKDjimaVLuymNJen9JtaxQly8g/VkiU/bDdjaE5qSmrnQZvWOdFT sJ9w4EjcTQvYfNKso/tKLhfLtGrG9KwhdGbMB+/xfYFlYl8IqHTvuk77RnyvgQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844668; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6da2jtaZhWuDX7JVWwBQJce5gdOKNslhErD2wiZ14EM=; b=lvtquKQJiFPWeriDMrj8vnbduQuP17IkwOolo4AbGGVhtAjVRPGdD8WVcA25tIiBaMm7Wv 5PQHLzoOvRTtE+fq5l+4QDcfzEPJKpGAS5+CODdiETCRZ0LwxBcnq8OPYBsGcWgjLB03Uh h/ZkZtdVTffwC9qgQGoE417ubfoONIyjVetL4cUIZy932fMb/Pyi4Eb4FuDqWvUXnC7HSL ZT7HVFj8sPaRNDHtvudvUrAjBI7mrQb5xiB4mPlTCU6Y80oEqrB+xEoQv0Bl2Ez8CqRTIn 4npoLq1VBoVOV3VMAqLp1QjOaSwS8o7EvsAFtqq6IGEViZI+dJujmMvAPRC87w== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 3/9] bap: add and use chainable future abstraction Date: Sat, 1 Mar 2025 17:57:34 +0200 Message-ID: <5aff62c90e7e313b42f28cbc3c8c81788f74c8ce.1740844616.git.pav@iki.fi> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Multi-part operations will need to postpone things like DBus replies until all parts are complete. Make this a bit simpler with a chainable future. --- profiles/audio/bap.c | 136 +++++++++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 31 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 37168e58c..8b9b89c70 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -80,7 +80,7 @@ struct bap_setup { struct iovec *metadata; unsigned int id; struct iovec *base; - DBusMessage *msg; + struct future *qos_done; void (*destroy)(struct bap_setup *setup); }; @@ -114,6 +114,17 @@ struct bap_data { void *user_data; }; +typedef void (*future_func_t)(int err, const char *err_msg, void *data); + +struct future { + unsigned int step, steps; + const char *name; + future_func_t func; + void *data; + int err; + const char *err_msg; +}; + static struct queue *sessions; /* Structure holding the parameters for Periodic Advertisement create sync. @@ -155,6 +166,94 @@ struct bt_iso_qos bap_sink_pa_qos = { } }; +static void future_clear(struct future **p, int err, const char *err_msg) +{ + struct future *h = *p; + + if (!h) + return; + + DBG("future %p (%s) 0x%02x (%s) step %u/%u", h, h->name ? h->name : "", + err, (err && err_msg) ? err_msg : "", h->step + 1, h->steps); + + *p = NULL; + + if (err && !h->err) { + h->err = err; + h->err_msg = err_msg; + } + + if (++h->step < h->steps) + return; + + h->func(h->err, h->err_msg, h->data); + free(h); +} + +static void future_dbus_callback_func(int err, const char *err_msg, void *data) +{ + DBusMessage *msg = data; + DBusMessage *reply; + + if (err && !err_msg) + err_msg = strerror(err); + + switch (err) { + case 0: + reply = dbus_message_new_method_return(msg); + break; + case EINVAL: + reply = btd_error_invalid_args_str(msg, err_msg); + break; + default: + reply = btd_error_failed(msg, err_msg); + break; + } + + g_dbus_send_message(btd_get_dbus_connection(), reply); + + dbus_message_unref(msg); +} + +static void future_init(struct future **p, const char *name, future_func_t func, + void *data) +{ + struct future *h; + + future_clear(p, ECANCELED, NULL); + + h = new0(struct future, 1); + h->steps = 1; + h->name = name; + h->func = func; + h->data = data; + + DBG("future %p (%s) init", h, h->name ? h->name : ""); + + *p = h; +} + +static void future_init_dbus_reply(struct future **p, const char *name, + DBusMessage *msg) +{ + future_init(p, name, future_dbus_callback_func, dbus_message_ref(msg)); +} + +__attribute__((unused)) +static void future_init_chain(struct future **p, struct future *h) +{ + future_clear(p, ECANCELED, NULL); + + if (h) { + h->steps++; + + DBG("future %p (%s) init step %u", h, h->name ? h->name : "", + h->steps); + } + + *p = h; +} + static bool bap_data_set_user_data(struct bap_data *data, void *user_data) { if (!data) @@ -740,24 +839,12 @@ static void qos_cb(struct bt_bap_stream *stream, uint8_t code, uint8_t reason, void *user_data) { struct bap_setup *setup = user_data; - DBusMessage *reply; DBG("stream %p code 0x%02x reason 0x%02x", stream, code, reason); setup->id = 0; - if (!setup->msg) - return; - - if (!code) - reply = dbus_message_new_method_return(setup->msg); - else - reply = btd_error_failed(setup->msg, "Unable to configure"); - - g_dbus_send_message(btd_get_dbus_connection(), reply); - - dbus_message_unref(setup->msg); - setup->msg = NULL; + future_clear(&setup->qos_done, code ? EIO : 0, "Unable to configure"); } static void config_cb(struct bt_bap_stream *stream, @@ -765,7 +852,6 @@ static void config_cb(struct bt_bap_stream *stream, void *user_data) { struct bap_setup *setup = user_data; - DBusMessage *reply; DBG("stream %p code 0x%02x reason 0x%02x", stream, code, reason); @@ -786,14 +872,7 @@ static void config_cb(struct bt_bap_stream *stream, return; } - if (!setup->msg) - return; - - reply = btd_error_failed(setup->msg, "Unable to configure"); - g_dbus_send_message(btd_get_dbus_connection(), reply); - - dbus_message_unref(setup->msg); - setup->msg = NULL; + future_clear(&setup->qos_done, EIO, "Unable to configure"); } static void setup_io_close(void *data, void *user_data) @@ -872,7 +951,6 @@ static struct bap_setup *setup_new(struct bap_ep *ep) static void setup_free(void *data) { struct bap_setup *setup = data; - DBusMessage *reply; DBG("%p", setup); @@ -881,12 +959,7 @@ static void setup_free(void *data) setup->id = 0; } - if (setup->msg) { - reply = btd_error_failed(setup->msg, "Canceled"); - g_dbus_send_message(btd_get_dbus_connection(), reply); - dbus_message_unref(setup->msg); - setup->msg = NULL; - } + future_clear(&setup->qos_done, ECANCELED, NULL); if (setup->ep) queue_remove(setup->ep->setups, setup); @@ -1038,7 +1111,8 @@ static DBusMessage *set_configuration(DBusConnection *conn, DBusMessage *msg, switch (bt_bap_stream_get_type(setup->stream)) { case BT_BAP_STREAM_TYPE_UCAST: - setup->msg = dbus_message_ref(msg); + future_init_dbus_reply(&setup->qos_done, "set_configuration", + msg); break; case BT_BAP_STREAM_TYPE_BCAST: /* No message sent over the air for broadcast */ From patchwork Sat Mar 1 15:57:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869739 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D1CF31E285A for ; Sat, 1 Mar 2025 15:57:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844678; cv=pass; b=Rcmuxl9EiGGnBuu2PVuUywkONt0+wkzu/93fl8AYq9lIAe3LmvGS5aO4WM1m9x5aUFE3xpgr92FoqeMNByNJ+hWiogLwsIC45zcFHsNmnmZJjkx3ZMyEgzjPfXAHucQylOhJk4loAjoyR+J1nEXkFO6Il6jpkbootzR1x2rooGE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844678; c=relaxed/simple; bh=4Fnm2JP/45UAwEEJfuUAjSAvc6A9AiXOIz6y3NQKTVM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VuxciEv0vwtTIE5rbu3lhtaAU/WeS5v/brgCaj+3PiR9odH/dHI0/8QC8CbF+0BpyAAcJIdod1kiwOZk5cdgD4RKOPwZn2Oodum5Fi4aAw06oWP8775znhDSSQhIXTUslzUahWmJH8JY2G1yAPfzMCm01UlO3pk4TBNBe9ZkrM0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=tFoFtToa; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="tFoFtToa" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV45rQwz4BKHn; Sat, 1 Mar 2025 17:57:48 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844669; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NrLVNcNBbcKQ1SxqJACUSBtWsdC70xec3EeqVspDAR8=; b=tFoFtToaADkNzSBq3pUhXv/itBWrN1fx+Df5nVSN9aj65vv7Zgo6cu/UYfbtodiWKq+XYc /0dwQm080dSM0iOYu2KkB8yAxge70B1RmNOcW37tJlWNdHsXWJL4wDt6rGocM+IBZmeAxw ouA82KDbALVN91O4rhFbk57GWpvR3KsKzauHdUswt9P7KeaDPVSH0ztTBzDPBoIFYNzz7e x0CRp/GF68sEmFH1Rgb8BZwAo2EVPKqnsHW/rsO2nH9TIchzKxQpXkSNPaftRUvF0cXQBv Is2V+pjkpdzX+NPMDISxMhLhVGoTFSHKm38ITRRQxf7rbTPCyEb3uzJ9kVFhmA== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844669; a=rsa-sha256; cv=none; b=oG+ElgA5DYJOrSXLHGK0sofn7Bj8/9UbfAoY4O4mvlczt0yYauKUR+TZTi8N+ajnx2WtUP EpWLFUdpGMspx4P6qrIhJo9C3rSiWcOSYJo3lbUSpUXrMBaOCLmYfZV54XoKU6x11Z93jA zqQGqF1yK0B04oK5rwqG2PUbiYWWYcedXN/nwBJ9f0zV7wRvU8RwwQExfsK4c9wFBM5w2D hoG4UH2GAd4XSnhSoOidhFa+3wzb2DKkClxDQXLOZ0JXOnlTSuLB41K/ktWRRt0/T2OOPC iu6cIUbrcftmD1OAdhyf+uZkh+JJfYQcQuQYM6LhMoBgBcaX0XxIAwrv6TDhjw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844669; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NrLVNcNBbcKQ1SxqJACUSBtWsdC70xec3EeqVspDAR8=; b=Qs5Io/FENcg4WDD+WhQlM2XllyRCIcjy72LCrhJPVL244fEC6A0iMmvWucco0GyLzP8Wxs S0/ObWaXQlyc/oqFaZTLda8g8NLjNXrWbTYLkfwhmwAxKP56wfWsKZWjNpCANSZR2y5b7F DXiR1uF2HXyTQGnYm9C6DbA883wN9nzd3bSth4kDjGLV7b2AbAtdnH2Xpuj+tzpmq+16pl M7bFyKz889X/Q+vEmZakqgznHTNvPMs/gwUcU/RzzjGd1n8emhL8bpYVaewcxjjxF9lsez iQtBrjHViY+SNllbmYUKKOzQl5SgEFcCmiyYnqeTS7H2JcmSORMVdiagH6+iFg== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 4/9] bap: use futures for select operation Date: Sat, 1 Mar 2025 17:57:35 +0200 Message-ID: <53008159e52e92871039f94677f3b469eea83cfe.1740844616.git.pav@iki.fi> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Change select operation to use futures. Remove spurious bap_config for bcast streams, it does not even run if there are only bcast PACs, and bcast streams are created differently. --- profiles/audio/bap.c | 74 ++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 19 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 8b9b89c70..39484c74a 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -93,6 +93,8 @@ struct bap_ep { uint16_t supported_context; uint16_t context; struct queue *setups; + struct future *select_done; + int selecting; }; struct bap_data { @@ -110,7 +112,6 @@ struct bap_data { struct queue *streams; GIOChannel *listen_io; unsigned int io_id; - int selecting; void *user_data; }; @@ -166,6 +167,8 @@ struct bt_iso_qos bap_sink_pa_qos = { } }; +static void pac_select_all(struct bap_data *data); + static void future_clear(struct future **p, int err, const char *err_msg) { struct future *h = *p; @@ -239,7 +242,6 @@ static void future_init_dbus_reply(struct future **p, const char *name, future_init(p, name, future_dbus_callback_func, dbus_message_ref(msg)); } -__attribute__((unused)) static void future_init_chain(struct future **p, struct future *h) { future_clear(p, ECANCELED, NULL); @@ -1595,7 +1597,6 @@ static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, if (err) { error("err %d", err); - ep->data->selecting--; goto done; } @@ -1604,16 +1605,12 @@ static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, setup->metadata = util_iov_dup(metadata, 1); setup->qos = *qos; - DBG("selecting %d", ep->data->selecting); - ep->data->selecting--; - done: - if (ep->data->selecting) - return; + DBG("ep %p selecting %d", ep, ep->selecting); - queue_foreach(ep->data->srcs, bap_config, NULL); - queue_foreach(ep->data->snks, bap_config, NULL); - queue_foreach(ep->data->bcast, bap_config, NULL); + ep->selecting--; + if (!ep->selecting) + future_clear(&ep->select_done, 0, NULL); } static bool pac_register(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, @@ -1631,11 +1628,17 @@ static bool pac_register(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, return true; } +struct pac_select_data { + struct bap_data *data; + struct future *select_done; +}; + static bool pac_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, void *user_data) { - struct btd_service *service = user_data; - struct bap_data *data = btd_service_get_user_data(service); + struct pac_select_data *select_data = user_data; + struct bap_data *data = select_data->data; + struct btd_service *service = data->service; struct match_ep match = { lpac, rpac }; struct queue *queue; struct bap_ep *ep; @@ -1658,8 +1661,12 @@ static bool pac_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, } /* TODO: Cache LRU? */ - if (btd_service_is_initiator(service)) - bt_bap_select(lpac, rpac, &ep->data->selecting, select_cb, ep); + if (btd_service_is_initiator(service)) { + bt_bap_select(lpac, rpac, &ep->selecting, select_cb, ep); + if (ep->selecting) + future_init_chain(&ep->select_done, + select_data->select_done); + } return true; } @@ -1678,8 +1685,12 @@ static void ep_cancel_select(struct bap_ep *ep) { struct bt_bap *bap = ep->data->bap; + future_clear(&ep->select_done, ECANCELED, NULL); + bt_bap_foreach_pac(bap, BT_BAP_SOURCE, pac_cancel_select, ep); bt_bap_foreach_pac(bap, BT_BAP_SINK, pac_cancel_select, ep); + + ep->selecting = 0; } static bool pac_found_bcast(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, @@ -1703,9 +1714,36 @@ static bool pac_found_bcast(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, return true; } +static void select_complete_cb(int err, const char *err_msg, void *user_data) +{ + struct bap_data *data = user_data; + + if (err == ECANCELED) + return; + + queue_foreach(data->srcs, bap_config, NULL); + queue_foreach(data->snks, bap_config, NULL); +} + +static void pac_select_all(struct bap_data *data) +{ + struct pac_select_data select_data = { + .data = data, + }; + + future_init(&select_data.select_done, "pac_select_all", + select_complete_cb, data); + + bt_bap_foreach_pac(data->bap, BT_BAP_SOURCE, pac_select, &select_data); + bt_bap_foreach_pac(data->bap, BT_BAP_SINK, pac_select, &select_data); + + future_clear(&select_data.select_done, 0, NULL); +} + static void bap_ready(struct bt_bap *bap, void *user_data) { struct btd_service *service = user_data; + struct bap_data *data = btd_service_get_user_data(service); DBG("bap %p", bap); @@ -1715,8 +1753,7 @@ static void bap_ready(struct bt_bap *bap, void *user_data) bt_bap_foreach_pac(bap, BT_BAP_SOURCE, pac_register, service); bt_bap_foreach_pac(bap, BT_BAP_SINK, pac_register, service); - bt_bap_foreach_pac(bap, BT_BAP_SOURCE, pac_select, service); - bt_bap_foreach_pac(bap, BT_BAP_SINK, pac_select, service); + pac_select_all(data); } static bool match_setup_stream(const void *data, const void *user_data) @@ -2684,8 +2721,7 @@ static void pac_added(struct bt_bap_pac *pac, void *user_data) bt_bap_foreach_pac(data->bap, BT_BAP_SOURCE, pac_register, service); bt_bap_foreach_pac(data->bap, BT_BAP_SINK, pac_register, service); - bt_bap_foreach_pac(data->bap, BT_BAP_SOURCE, pac_select, service); - bt_bap_foreach_pac(data->bap, BT_BAP_SINK, pac_select, service); + pac_select_all(data); } static void pac_added_broadcast(struct bt_bap_pac *pac, void *user_data) From patchwork Sat Mar 1 15:57:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869632 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A0231E47A9 for ; Sat, 1 Mar 2025 15:57:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844679; cv=pass; b=M7ZUA9XLxRPZIWKR3xSyE/lh0CBVuG7IFMBa9vUHtp9vt4hq8gZ1yycj1ZtLILR7dPrNqUdxkikgNJqBe9oD8TqwEXdP/VXAyzJ9MVysUU7qZNSexj9gMkbK+ZrIo7gNyS3IXEQ1NKikTK40dI63gFHDZqKdsH065l5ULgsshn8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844679; c=relaxed/simple; bh=lgA/kCl/2n0WRFX7hJDs0NBqYtojFP+no8BghNN6lmg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=naEW2WIioZswtWKMKgU0BaqaIcHDWAyFd8zYW8ha1GJ4ltkPM6b5e2cVmVo7gZ81PQWCEmpHV7fTY7Pr/aRQ3huDwGG4MREsZIbXUc2xhze7AtRwP+vR/UxgsQn6K1XHmkiRlD7McXFphylzp+Q5m839Z1go0Qs9N6dDikVr4+Y= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=iIzKvWfY; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="iIzKvWfY" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV53qxCz4BKHw; Sat, 1 Mar 2025 17:57:49 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844670; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OW7sJjRt/jXBHyUdu8Cj6QgyEgAKIyF9d2uJHVYZ7Xc=; b=iIzKvWfYkXKQ/5nOR6kZllV8/0pIakP2+mzrrglyXOmJpejqG7/Oo2PUDcp7xDMMvkvTel iQoHd7slt1Q9vzSSrQxt+tuX4cq04h/VI5GUN0+B3XlOTIBCaxQ8rPldyTeVhedvym5Kwz GKReVumTD/qlqbSFrNUCAAMH36BQfeRdTQ//IPc5PASx0VwTlkaLQdIgEtwIyt0J6MPcvy zucai1cyLsaraEmabcEIQQh+UZArwi8/miVGBdHEOTUcBq5Kk+GmkUhVmW0ax4+xtuhQ/6 nWt3n+rYOnj5q8WJsp1j4S1vqNt+7YbzyTkx+XxW9VfGyQt2sPkrz3Ji7SFTkw== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844670; a=rsa-sha256; cv=none; b=bhIK3tJ+WIkRfQUNOcxeI/8PEqi+ZrxEPKIZ2uOt27/DhRSIKRVzUfmOerlAkUFrA43dLM wJrIRT0J82JfHMmLPNbwEVwmdZsOtmgmdSKApl/6m/dnFd6ARjs6ZtAbdkB9BSF3ECb7XJ zOaf/JpF9Y6VRDJMxjDM4xykOpAna+vFpRxrGRat0p6x72QuDSM/INFVwbgTUKj2zc1eIB mMwkulThjS8jqHstHrJhUQwWzJsxEWgVZ8M2sPBp9dwRw5+yS7L24lGeoAX8c24NM7EUVR 8kAh0c3lC1uqtG3fmpCvvAc+I4gIWHQpNU2GCoaB3QC4HZ4facDoUwE7SBpgRQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844669; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OW7sJjRt/jXBHyUdu8Cj6QgyEgAKIyF9d2uJHVYZ7Xc=; b=nqXnaEfH/lqvyjq5aC+2tku+UtTu+09+q/MZkwd3EDhe1LgY9dMDoalKxZskErMUPAbY8J fcV1bgAvvN69BdO41esTASKEx2BeC+Du/Q6x/hyRxwGCHMxh2lTIhLywaHkRSHpqmRlDjT otcdWhkVJqHjuvwojNJcZaRfqVA2GwYvKryu71esCMgaK18OYstnCElkrfzNSnpz/fuiE/ CLpFfmTZ1kbkPZXGaMaI42RvzAHrjEtYtLU6NMfn/1RO8iMKZsbo39+KgvsD7Y1viNEJUm y9/Rxym30vL25jfLPFmSLrIPloj67Yt1fYjSuAj8Js2Vx4w4fhiSGXsLeeBBPA== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 5/9] shared/bap: bap_abort_stream_req() should cancel also current req Date: Sat, 1 Mar 2025 17:57:36 +0200 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 After bap_abort_stream_req() no req callbacks for stream shall be called, so it has to fail also the currently in-flight request. --- src/shared/bap.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/shared/bap.c b/src/shared/bap.c index 208fc1bf2..54c6e8629 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -1229,6 +1229,13 @@ static void bap_abort_stream_req(struct bt_bap *bap, struct bt_bap_stream *stream) { queue_remove_all(bap->reqs, match_req_stream, stream, bap_req_abort); + + if (bap->req && bap->req->stream == stream) { + struct bt_bap_req *req = bap->req; + + bap->req = NULL; + bap_req_complete(req, NULL); + } } static void bt_bap_stream_unref(struct bt_bap_stream *stream) From patchwork Sat Mar 1 15:57:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869738 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C1F11E3DC8 for ; Sat, 1 Mar 2025 15:57:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844679; cv=pass; b=CoBZYERhDpB+xHlp8JeCMwxub2DcQ6o2Of5B7yu5gE7Ec9UTqH18N8h5f8twpIsP9mg1O/Bdn+0hR6W6paDDsb0Gr4CzZUeNtoKZCQ3nx7GCiEAGWUd3XMEbtlVM86R35DqCGl52aLi2rq27cnbQOm0a7Lr2VcIOLJSwVsHrwK4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844679; c=relaxed/simple; bh=O4sl4Z/4gnT5Aq3feJGoYtOmhzErrRmfWG261SLz73Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=K7P3xkCWSaB8+ACi7dbIMxMNvYE0dGTQKCekgWmN9cE0thspg3spimpGFHVzK6hJB3g9Muh1LLC4Isx7HQYikOHS9IBbqLDGb0kj2M/QQ47EDlBtw9d3tTxXYmhS+DSy3KeJF71vvr4HkDcHHGdzjDqMznCM7awMNibJKiWDmzg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=hvD/ZQOT; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="hvD/ZQOT" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV61pDRz4BKJ3; Sat, 1 Mar 2025 17:57:50 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844670; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qtZIBLU2MjTHMt/68ts6bDpQp7tO03qDMLBtTCNLe5g=; b=hvD/ZQOTrsi/SZHry4YMxT1atYGnrTCAwcayGr8d+KzBNUgCxy+T3AJJaO6NQIGKs8DnEF jv/f9tUyRdZ/sS1Vr4rlmMxV9aktcT+LYFFSZxZMASxN0pnpPyK6xNVnEOpdguLZi4mXut MXd19eOtI5EtR3QVYKzjfKUUXo6UlNmuDYcO7NLqB27+3YBL/YKWsnvAK02heramUz9fJ6 Hr4VfCwT3kutIHjXCzGwdO+jtOzDfpTdcrF0+q0MkYkejYLPPcMsEXhamPezObrrq6I8QH paBcJ7Z96fCOzGs4I1uc8Pk7V9Lx849VKIbJlyNul+r7cSebOSd2bS0IZkD62Q== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844670; a=rsa-sha256; cv=none; b=BbDB87BJ2vIzGM57OLqGJ/jvfJxAfSg+HGJIjKGk/Gg3/jjGS520Uxe/ge/2XI/dTnIRsG iAFQM4EJT3/Fbu+lr+0KORPYjFTORDNkGH3aYn5HOQ92xE1yMaB/v3JGwwyrhwXwxMVQ+2 HotDszxxvRIkzwLHOAMY6cj6/HXOepVOixPkRxUUINpgkTba6J8rd1Rbrty58Jh+p5PHKr 1AWnKfyvggL9rx8oVLqBZ28mJAd4GVkyBNu6ghOv20UWnHlnYzhDik6rW0XdKVqsNmOaWh 07MKwuap4gBxk37BHQ9T7AxKSoOif3/zz+OgwpSXJdMNC3Mif8W/ACP5ZPBlAQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844670; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qtZIBLU2MjTHMt/68ts6bDpQp7tO03qDMLBtTCNLe5g=; b=K7mNfyHVo2/oJ9Zan4JQJweK50WceJ0BAqJNhbQEbdx2TlUUry9+c2xvEeQhLtkVEv1lvO ZGwZXCJikvNV4CBMz1JZnYdAQq1yzgvPIImnQkul1kWMQ9qlQsAFpvkGxIRT7GfNMU2MCP bAOGOEqOnT8ApEVxK8FigG5cF61vD27//i1nr2yse9FeictKol/AL+jk0GscIUPbSlG/Fr iGWSnT8W4L64oXRA2JpjGqMbT2IznmTxtVd81M970ULx7aP9gvIN+dYynA8HYFsbwKu3u4 0teB4p1OBcyuv6aGV87CIjpLJ6kleC/EaS2tuZlcRzfmDUedTep+l757++Zkgw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 6/9] shared/bap: make sure ucast client stream is destroyed after releasing Date: Sat, 1 Mar 2025 17:57:37 +0200 Message-ID: <5f103220d38f8eb549eb41ac971d1f4cf1e684ba.1740844616.git.pav@iki.fi> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Upper layer as Unicast Client needs to be able to destroy streams when it wants to reconfigure endpoints. This does not currently work right, because of Server issued Releasing->Config (caching) state transitions, which currently cause streams never enter Idle (so they are never destroyed). Fix this by considering Releasing->Config as Releasing->Idle->Config. Also do not make new streams from cached config data as Unicast Client, and leave all stream configuration to upper layer. --- src/shared/bap.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 54c6e8629..4f44db07a 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -1363,6 +1363,31 @@ static void bap_stream_state_changed(struct bt_bap_stream *stream) struct bt_bap *bap = stream->bap; const struct queue_entry *entry; + switch (stream->ep->old_state) { + case BT_ASCS_ASE_STATE_RELEASING: + /* After Releasing, Server may either transition to Config or + * Idle. Our Unicast Client streams shall be considered + * destroyed after Releasing, so that upper layer can control + * stream creation. Make the lifecycle management simpler by + * making sure the streams are destroyed by always emitting Idle + * to upper layer after Releasing, even if the remote ASE did + * not go through that state. + */ + if (stream->client && + stream->ep->state != BT_ASCS_ASE_STATE_IDLE && + (stream->lpac->type & (BT_BAP_SINK | + BT_BAP_SOURCE))) { + struct bt_bap_endpoint *ep = stream->ep; + uint8_t state = ep->state; + + ep->state = BT_ASCS_ASE_STATE_IDLE; + bap_stream_state_changed(stream); + ep->state = state; + return; + } + break; + } + /* Pre notification updates */ switch (stream->ep->state) { case BT_ASCS_ASE_STATE_IDLE: @@ -4851,7 +4876,8 @@ static void ep_status_config(struct bt_bap *bap, struct bt_bap_endpoint *ep, } /* Any previously applied codec configuration may be cached by the - * server. + * server. However, all Unicast Client stream creation shall be left to + * the upper layer. */ if (!ep->stream) { struct match_pac match; @@ -4866,7 +4892,9 @@ static void ep_status_config(struct bt_bap *bap, struct bt_bap_endpoint *ep, if (!match.lpac || !match.rpac) return; - bap_stream_new(bap, ep, match.lpac, match.rpac, NULL, true); + if (!(match.lpac->type & (BT_BAP_SINK | BT_BAP_SOURCE))) + bap_stream_new(bap, ep, match.lpac, match.rpac, + NULL, true); } if (!ep->stream) From patchwork Sat Mar 1 15:57:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869631 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 391D51E51F2 for ; Sat, 1 Mar 2025 15:57:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844680; cv=pass; b=njkJOxUnmP7hE2qDGp7QUWI5UDMjYRkNF5go3LUa4f59PpJjmX9DlmVwj+Nmb4PSbmyLbZCYLbVy3Mz6m/wgw98xAAZjeY8Y847RKe6ADuLAX0sJJtTuw4qjAhh6b3TMkyTR2wze3TwOPesK5/pweZXVuPrudbJtos4z3EymkJ4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844680; c=relaxed/simple; bh=R1uajWOdVZM/GSJq0D17DD+g2Pz/nKy3XLpFoajFEc8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=stK2svwK0cse3uJPlb8SpnPlc0YsucfnVqHcaRzaRy3sWmn0M4chhhngazs1FVeerffAzC3lsEpADMnoF3hekmXGDwowXTfGNldmSV2rGcEDcB6HvGFJ3hfhYs4gw4kQSlOyqEVv8fRuX9tf8sdP7oEmBn5hfm3uq4w35WkJs6A= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=IWsOE10O; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="IWsOE10O" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV66rmzz4BKHR; Sat, 1 Mar 2025 17:57:50 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844671; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KYqibg+YY66EQe/1Ffp2wAtCIp4QaM0Yk4Frj1UsDQc=; b=IWsOE10OsL3QE7fuR/yrXSH5WyXFV7OCqV56//E7o2OnKEFWUfAL+cJLp97xufJ55Bi01h FfJnyEKfAhUYDOZBeyN7sVJ0Cg1b4CdnpXDY/m0HOfgJq3T3nkbjBWHgZKh2HfNQfTL5bn Fc1Ij7y1bdhDJWI6R9OrCBVqDDbANbZrqYxFcCoIwRlUER+YikeVVp3bt3K0p6uMC2JgD9 ES/iD5SnXeC57j3oklrRkpE7MOZQPK6t0WRK0AzugwmYtBIfxGQQwDiy2z05+yOY+9ajFW PSNwv6JWKVxnLesF/ckzzhtjktUHb1R5vUTA8y4PjwEcUSrdFSbrDJq/TuSrvg== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844671; a=rsa-sha256; cv=none; b=tLw8HUDpDwNzegYtpYiLMuSe02Abk+zFCH2vZ11KC5yFnYNeusgHOB1WQ8/7YybvzvdoSh u8NclwxVV11IDIi1Rx/UvyhAaRujNKbQRa8rWCXlhTgH1tlSkiaM/gbVsjDKaNkbPkdshy 8QormxDA6bsE2YwsdJnAKv0/WxULRLplAgrHD+EtFTPkMUtuc2nF25q7+UbMy86UukJ45N Jwcqu4AXdO7PfYaOJfFo0114TApvVBMcswBTzF1gFq8sjVnopAPhEokTaIUltzTtA8gJ6Q qEXtb/7Hk1tdZH8JC6IestEz1RJ7TvHJBTETL7muzMWUud8UMQ1/aNQGIrKhNg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844671; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KYqibg+YY66EQe/1Ffp2wAtCIp4QaM0Yk4Frj1UsDQc=; b=ON/tg9xWf0hPI23MXHBLH2nj0xrWqxhrAfYtHdEQ9ycg2qrQm9ZllJbComRrc+6MP5U1oY ge3yU9HvE3cqLmcPY+ko/zMyXXLiDFLNZ+KJYSCXN++NYFzvIYwH/DZ2lq8yc89QuVTMOr uLjhjDueYY4GTtwLWDcGjzH69PRf9FrkwhjttKEPfbQj04YcX1XF21xlMF1rvnID9csFmS 2GAetM2n1nhvssw7p5liCRUMbVQF59o55pMulhkaDQ5UdTtDK9HwM1+wjJDanT0f16md2b gAqonzQQevaPPD7tgyJqGrZPDMIM7dPY7EQXx73wZLN0UEKH9SOf/Z0gZeK10Q== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 7/9] bap: support removing streams with ClearConfiguration() Date: Sat, 1 Mar 2025 17:57:38 +0200 Message-ID: <1fba5476695ae5ff96f3d80d6f2cf19367cb4d70.1740844617.git.pav@iki.fi> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Implement removing streams via ClearConfiguration(). --- profiles/audio/bap.c | 87 ++++++++++++++++++++++++++++++++++++-- profiles/audio/transport.c | 17 ++++++++ profiles/audio/transport.h | 1 + 3 files changed, 102 insertions(+), 3 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 39484c74a..46512a7f3 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -58,6 +58,7 @@ #include "bap.h" #include "bass.h" +#include "transport.h" #define ISO_SOCKET_UUID "6fbaf188-05e0-496a-9885-d6ddfdb4e03e" #define PACS_UUID_STR "00001850-0000-1000-8000-00805f9b34fb" @@ -81,6 +82,7 @@ struct bap_setup { unsigned int id; struct iovec *base; struct future *qos_done; + struct future *close_done; void (*destroy)(struct bap_setup *setup); }; @@ -903,12 +905,30 @@ static void setup_io_close(void *data, void *user_data) bt_bap_stream_io_connecting(setup->stream, -1); } -static void ep_close(struct bap_ep *ep) +static void setup_close(void *data, void *user_data) +{ + struct bap_setup *setup = data; + struct future *close_done = user_data; + struct bt_bap_stream *stream = setup->stream; + + DBG("%p", setup); + + future_init_chain(&setup->close_done, close_done); + + setup_io_close(setup, NULL); + + if (bt_bap_stream_get_state(stream) != BT_BAP_STREAM_STATE_RELEASING) + bt_bap_stream_release(stream, NULL, NULL); + else + setup_free(setup); +} + +static void ep_close(struct bap_ep *ep, struct future *close_done) { if (!ep) return; - queue_foreach(ep->setups, setup_io_close, NULL); + queue_foreach(ep->setups, setup_close, close_done); } static struct bap_setup *setup_new(struct bap_ep *ep) @@ -962,6 +982,7 @@ static void setup_free(void *data) } future_clear(&setup->qos_done, ECANCELED, NULL); + future_clear(&setup->close_done, 0, NULL); if (setup->ep) queue_remove(setup->ep->setups, setup); @@ -1077,7 +1098,7 @@ static DBusMessage *set_configuration(DBusConnection *conn, DBusMessage *msg, * TO DO reconfiguration of a BIS. */ if (bt_bap_pac_get_type(ep->lpac) != BT_BAP_BCAST_SOURCE) - ep_close(ep); + ep_close(ep, NULL); setup = setup_new(ep); @@ -1129,6 +1150,63 @@ static DBusMessage *set_configuration(DBusConnection *conn, DBusMessage *msg, return NULL; } +struct close_stream_data { + const char *path; + struct future *close_done; + unsigned int count; +}; + +static void close_stream(void *data, void *user_data) +{ + struct bap_setup *setup = data; + struct close_stream_data *info = user_data; + struct bt_bap_stream *stream = setup->stream; + const char *path = media_transport_stream_path(stream); + + if (info->path && (!path || strcmp(info->path, path))) + return; + + setup_close(setup, info->close_done); + info->count++; +} + +static unsigned int ep_close_stream(struct bap_ep *ep, + struct future *close_done, + const char *transport_path) +{ + struct close_stream_data info = { transport_path, close_done, 0 }; + + queue_foreach(ep->setups, close_stream, &info); + return info.count; +} + + +static DBusMessage *clear_configuration(DBusConnection *conn, DBusMessage *msg, + void *data) +{ + struct bap_ep *ep = data; + const char *path; + DBusMessageIter args; + struct future *done = NULL; + + dbus_message_iter_init(msg, &args); + dbus_message_iter_get_basic(&args, &path); + + DBG("%s: %s", ep->path, path ? path : "NULL"); + + future_init_dbus_reply(&done, "clear_configuration", msg); + + if (strcmp(path, ep->path) == 0) + path = NULL; + + if (ep_close_stream(ep, done, path)) + future_clear(&done, 0, NULL); + else + future_clear(&done, path ? EINVAL : 0, NULL); + + return NULL; +} + static bool stream_io_unset(const void *data, const void *user_data) { struct bt_bap_stream *stream = (struct bt_bap_stream *)data; @@ -1350,6 +1428,9 @@ static const GDBusMethodTable ep_methods[] = { GDBUS_ARGS({ "endpoint", "o" }, { "Configuration", "a{sv}" } ), NULL, set_configuration) }, + { GDBUS_EXPERIMENTAL_ASYNC_METHOD("ClearConfiguration", + GDBUS_ARGS({ "transport", "o" }), + NULL, clear_configuration) }, { }, }; diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c index f3ac1a251..e81ef6e9a 100644 --- a/profiles/audio/transport.c +++ b/profiles/audio/transport.c @@ -2671,3 +2671,20 @@ void media_transport_update_device_volume(struct btd_device *dev, btd_device_set_volume(dev, volume); } + +const char *media_transport_stream_path(void *stream) +{ + GSList *l; + + if (!stream) + return NULL; + + for (l = transports; l; l = l->next) { + struct media_transport *transport = l->data; + + if (media_transport_get_stream(transport) == stream) + return transport->path; + } + + return NULL; +} diff --git a/profiles/audio/transport.h b/profiles/audio/transport.h index 808e1a193..7c107281a 100644 --- a/profiles/audio/transport.h +++ b/profiles/audio/transport.h @@ -33,3 +33,4 @@ void transport_get_properties(struct media_transport *transport, int media_transport_get_device_volume(struct btd_device *dev); void media_transport_update_device_volume(struct btd_device *dev, int volume); +const char *media_transport_stream_path(void *stream); From patchwork Sat Mar 1 15:57:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869737 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 392391E51F5 for ; Sat, 1 Mar 2025 15:57:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844680; cv=pass; b=QvbeX7fldz1ARYtjkW89WKdXPU4oQH4LAlkyp6OAxHMcQ6PJkIpAuLAgAvgq9TrLRA4XPQDp4rsRHRNWV2f0WKQE213kOmNDM+yZ+zN206kWflZHbbTTCetbot7byndBFipKwD1R4NQSi93IRIFD1/uCq8OsKjMPDpn8jrOEN2s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844680; c=relaxed/simple; bh=Pwx3hH36t6gVhmXIC+DngVRHU9kXWvZspxBEY2Wuhko=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KO1ejkQCoGPtUWx/U3d4VAuhuRaFPW0In8rVQ81F3kL2G4htOqB54On8eAAg9he3HEVXd8CQD+6M9PMrKd+MWZVYzrWIBG9peReZ7jdEq75fN1/8pgrT5cNXQY98QgNL3nPSH2xvzjbKgko4tp/y167f6NyI8K37+Of9HlzvNYY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=mfXTj5H/; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="mfXTj5H/" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV82Dqrz4BKJ1; Sat, 1 Mar 2025 17:57:52 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844672; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+Ry7H3NZM02h6zjB6Cz3Dotr5se19uHMHfSUvNGpUZ4=; b=mfXTj5H/oF2EO2S8dotAMghRxImBYMrrH7pTGqLTQJ+DuumbDVSY1l8J7PIpOz9d3E71bN YNOMZ+GL4H9OVXjRAle/31ND/AKtvsA1b0ncqidRnIoTNHVGa6+hjFu3kjlJx2H5q07+qs SWAzjLZQSzqroBNlVIYLwCgezqYi4QHFKEFva65es3KSORfIUyrHFmt+vQFBLWzFWjsEff OS6PdZmGUos45zeEWyCBiFXxKdVkf6QrXselL11/bVN9YHl7CKeDghrt0CcKvzxTqK9IWh /xaqEjqagQNePA9nfEiXErLRRpMptqdJx1h/7pkdJ0ApqRc0qh//uHx6PRk8GA== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844672; a=rsa-sha256; cv=none; b=AOYS3kgDMaHegSdtbp/6S7IJCSx4/vF9C06GGhqbBhv3g4ag7/pnJMBWbfMHZCzTsAubM7 7YxOnomNib8glOwtdfTxijWG58Jm+W66TrZT0PeCAOc9NYk9RTEdmYGTQOW4TDj++4ADgc uIvdE/rLESaeFeOEQoLX7+lP7NyDTpU8hSUEYYEkjaiWw+KS3lrZCp0paVIv2rhs8z1wmw +Ky/sxp/2HgudDhKLykEdMuxLsROEtB5gAU3DVxO2E1E51u1Q37yv6WlrzCCmRlN1xsVYO vhp1f6tTEdgK7wUcuDwBNb6o69ACP4n2jH3IqeoXgFeCaqBUjiCzN54XTJdMIg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844672; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+Ry7H3NZM02h6zjB6Cz3Dotr5se19uHMHfSUvNGpUZ4=; b=Fh4oao8pVE9SOcT6lEC3sPVxlexDRjOivhPWAAjUMinYHilpGL6MXYdyOJQZdF7CYkzjfb xwlwjAQF73q8Nn7kBFlK2ypUbxOpWOr/a2CKMN1xuh4rF/ykTpE0/G843vQDCtE0aUzcsm Gt79fTj5GAHxNgKHpUDZyjwlaGej0fRHnbiLzn/SEuGADnkWs1ik4gqedDc06x7GHxyVzM rp0DMRhu1vj2rZ1iQZj0GiYLkl2Hu1l60pUFsStrJc+DNX3iH4n9r6e1ezkcPfFU/YisS/ 5mIh6RfMaE5uHshLcbj2pCRj+bB7vzysW2OCZflL2mp1pG677UzdgjDUANgyIw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 8/9] bap: do not try QoS before links are updated & io created Date: Sat, 1 Mar 2025 17:57:39 +0200 Message-ID: <643267ffb9f4c4b2b7b5e36b551f890f3e9e81c4.1740844617.git.pav@iki.fi> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 It's not possible to QoS in config_cb, even if stream is in Config state, because stream->io may not exist and stream links are not yet updated. The stream links are updated only before bap_state(), so the completion of config has to be handled only there. Wait for both events to complete before proceeding to QoS. --- profiles/audio/bap.c | 80 +++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 46512a7f3..da1f9feb1 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -83,6 +83,7 @@ struct bap_setup { struct iovec *base; struct future *qos_done; struct future *close_done; + bool config_done; void (*destroy)(struct bap_setup *setup); }; @@ -851,32 +852,49 @@ static void qos_cb(struct bt_bap_stream *stream, uint8_t code, uint8_t reason, future_clear(&setup->qos_done, code ? EIO : 0, "Unable to configure"); } +static void setup_create_io(struct bap_data *data, struct bap_setup *setup, + struct bt_bap_stream *stream, int defer); + +static void setup_qos(struct bap_setup *setup) +{ + struct bap_data *data = setup->ep->data; + struct bt_bap_stream *stream = setup->stream; + + if (setup->id || !stream) + return; + + setup_create_io(data, setup, stream, true); + if (!setup->io) { + error("Unable to create io"); + if (bt_bap_stream_get_state(stream) != + BT_BAP_STREAM_STATE_RELEASING) + bt_bap_stream_release(stream, NULL, NULL); + return; + } + + /* Wait QoS response to respond */ + setup->id = bt_bap_stream_qos(stream, &setup->qos, qos_cb, setup); + if (!setup->id) { + error("Failed to Configure QoS"); + bt_bap_stream_release(stream, NULL, NULL); + } +} + static void config_cb(struct bt_bap_stream *stream, uint8_t code, uint8_t reason, void *user_data) { struct bap_setup *setup = user_data; + const char *err_msg = "Unable to configure"; DBG("stream %p code 0x%02x reason 0x%02x", stream, code, reason); setup->id = 0; - if (!code) { - /* Check state is already set to config then proceed to qos */ - if (bt_bap_stream_get_state(stream) == - BT_BAP_STREAM_STATE_CONFIG) { - setup->id = bt_bap_stream_qos(stream, &setup->qos, - qos_cb, setup); - if (!setup->id) { - error("Failed to Configure QoS"); - bt_bap_stream_release(stream, NULL, NULL); - } - } - - return; - } - - future_clear(&setup->qos_done, EIO, "Unable to configure"); + if (code) + future_clear(&setup->qos_done, EIO, err_msg); + else if (setup->config_done) + setup_qos(setup); } static void setup_io_close(void *data, void *user_data) @@ -1128,6 +1146,8 @@ static DBusMessage *set_configuration(DBusConnection *conn, DBusMessage *msg, return btd_error_invalid_args(msg); } + setup->config_done = false; + if (setup->metadata && setup->metadata->iov_len) bt_bap_stream_metadata(setup->stream, setup->metadata, NULL, NULL); @@ -1655,6 +1675,8 @@ static void setup_config(void *data, void *user_data) return; } + setup->config_done = false; + if (setup->metadata && setup->metadata->iov_len) bt_bap_stream_metadata(setup->stream, setup->metadata, NULL, NULL); @@ -2086,9 +2108,6 @@ static bool is_cig_busy(struct bap_data *data, uint8_t cig) return queue_find(sessions, cig_busy_session, &info); } -static void setup_create_io(struct bap_data *data, struct bap_setup *setup, - struct bt_bap_stream *stream, int defer); - static gboolean setup_io_recreate(void *user_data) { struct bap_setup *setup = user_data; @@ -2473,25 +2492,10 @@ static void bap_state(struct bt_bap_stream *stream, uint8_t old_state, queue_remove(data->streams, stream); break; case BT_BAP_STREAM_STATE_CONFIG: - if (setup && !setup->id) { - setup_create_io(data, setup, stream, true); - if (!setup->io) { - error("Unable to create io"); - if (old_state != BT_BAP_STREAM_STATE_RELEASING) - bt_bap_stream_release(stream, NULL, - NULL); - return; - } - - /* Wait QoS response to respond */ - setup->id = bt_bap_stream_qos(stream, - &setup->qos, - qos_cb, setup); - if (!setup->id) { - error("Failed to Configure QoS"); - bt_bap_stream_release(stream, - NULL, NULL); - } + if (setup) { + setup->config_done = true; + if (!setup->id) + setup_qos(setup); } break; case BT_BAP_STREAM_STATE_QOS: From patchwork Sat Mar 1 15:57:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 869630 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ABC4E1E285A for ; Sat, 1 Mar 2025 15:57:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844681; cv=pass; b=UETDuDzY6tuJ4lqx9vZZIglMIvPbudarirlK8UbW3vkzmJxv/WqkZj7Tjv/gbM+zBCLtnS/9os2ayEPmVAH3roMtdnCDF21ufioK3DiphDInJBA/dxT+oBddYCxt2EMsNlbMW5/jacvQsHqWMeUzTAAOjsgPWvjWBgs3sKCU2rY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740844681; c=relaxed/simple; bh=vIg5Wo2MwRmGMKyYqZxwYahlHiwW3HGGanheFgL4WtA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O0BcieEyECTmDak2oq8PUy6TPEt0WroInlZ1ddnwktAZnoQBRlSlkdZ8UIXvI8+1Poe9yK6YACMXA2kIAIDYDO/xgN5bakBXLP6I2O4vwiJib9aH4MXmCRMglHdx+05inoKr/2e9liyC1Wlumi4ora+OuW7ZbiIfZjpj0RtMqSI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=thCTmmgI; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="thCTmmgI" Received: from monolith.lan (unknown [193.138.7.158]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4Z4qV90C44z4BKHF; Sat, 1 Mar 2025 17:57:52 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844673; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=n+nOXp3SXEFlsKyjS0lckZ0r6L7Oib3YPvbadYF+QJ8=; b=thCTmmgIn/lWV3rcO/Tl1qWaIHsHU7c5dIobw9USJu41DvvOEoO0Jc2iXZ8hR5KuPwvSOo fEt63CmZdUFYHHbkN8msQeukSu40YwqQJ6gImD/yPTXKOwJI6LjaOd5cf84peUiMO4kViQ WJJRokAOtAGFkLXwaTVGcxXQ8/E++9AGuKuYZ3pErJ0hTsl9qsVQUAzAcpKh6cDpphBT2g lOvmhig1nPhDhBXnZQtlughfEGl9ipmvvONUMyvt7oOqKANxXX9jVIbP6I5Bh4nfr7pcip LYxZp5Wz1xLeIubP1y1LoNGr3PZCrT8hBoqAJb7XGAIVcEW08BvqB/nplJTfaw== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1740844673; a=rsa-sha256; cv=none; b=sKNGKRGhQk3L2K+jpw5Z09Hq7ashOkg6Z/EYcaPFm5NwPzrFDgkjbqsgDXIstTccY1NLLF U0z5cglHDa3LfL4jkU2GMUGQOQMKspeHtdsgyn/q2dqRYvEzGUjpgAHnMa1uZkIW7pu1AN N/KAiIfLqFwSFP1rdlaDtOSzbv7QY1mam37jRQ2AOpRoeNmbFYz90rKmjQiUtOsqSh9coS 7fiaobZhsnUbTOZam5bIbfai8EhpfUxa2WllaIDB0+Mbk5wZ6Zh4ziriHmaTM4kv3rJ/EM 3PAjBFkHLQRXKgnFaWqU8ZXDZKGR8J12DsH6TeShvmg1jBfPpWCYJ/kBlft/jA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1740844673; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=n+nOXp3SXEFlsKyjS0lckZ0r6L7Oib3YPvbadYF+QJ8=; b=o7dBVWlfw/MEZw6LBfElB48CtV9a+BnV2mxqOAOtzy/ljkxDyvui9PBrAdMACiDnhEzsqG PE7izY5qiYjmA7lWblXjL64trbV6UCX1qHKcPnSvHWP7SU4tolE6fdOm0J4aAFyWeQ/5dE REMvCMYrP3t2N9PX1Nx24ifF7j+LqDGlVGXGrN6n0Iyz86Vqs3Zqe5paFCNdLx0xVREbTn ztQehK3g6bOKLfUVx1fHmt56S6oSNW034DZ/Dk3qTAgsBvYh5nY90XmLrLg7Jpz2LzkN/e TrhvFah15Pgl9XlX2k9UP3R+FRAvPGWahyk06h0p2WEGV1dz5NOHFz+BxeuFRQ== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [RFC PATCH BlueZ 9/9] bap: implement client role SelectProperties() Date: Sat, 1 Mar 2025 17:57:40 +0200 Message-ID: <29374a3f670ddd80af0f87a2ecc27b5d3e64f03c.1740844617.git.pav@iki.fi> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add SelectProperties() on a BAP unicast endpoint, which triggers its reconfiguration or marks it for reconfiguration. First, all associated streams are closed. After that, endpoints marked for reconfiguration are reconfigured using the same flow as in the initial configuration. --- profiles/audio/bap.c | 180 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 166 insertions(+), 14 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index da1f9feb1..0590067eb 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -96,8 +96,10 @@ struct bap_ep { uint16_t supported_context; uint16_t context; struct queue *setups; + struct future *setup_done; struct future *select_done; int selecting; + bool reconfigure; }; struct bap_data { @@ -170,7 +172,8 @@ struct bt_iso_qos bap_sink_pa_qos = { } }; -static void pac_select_all(struct bap_data *data); +static void pac_select_all(struct bap_data *data, bool reconfigure, + struct future *done); static void future_clear(struct future **p, int err, const char *err_msg) { @@ -849,7 +852,8 @@ static void qos_cb(struct bt_bap_stream *stream, uint8_t code, uint8_t reason, setup->id = 0; - future_clear(&setup->qos_done, code ? EIO : 0, "Unable to configure"); + if (code) + future_clear(&setup->qos_done, EIO, "Unable to configure"); } static void setup_create_io(struct bap_data *data, struct bap_setup *setup, @@ -1227,6 +1231,120 @@ static DBusMessage *clear_configuration(DBusConnection *conn, DBusMessage *msg, return NULL; } +static void ep_close_if_reconfigure(void *obj, void *user_data) +{ + struct bap_ep *ep = obj; + struct future *done = user_data; + + if (ep->reconfigure) + ep_close(ep, done); +} + +static int select_properties_parse(DBusMessageIter *props, bool *defer) +{ + const char *key; + + if (dbus_message_iter_get_arg_type(props) != DBUS_TYPE_DICT_ENTRY) + return -EINVAL; + + while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter value, entry; + int var; + + dbus_message_iter_recurse(props, &entry); + dbus_message_iter_get_basic(&entry, &key); + + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &value); + + var = dbus_message_iter_get_arg_type(&value); + + if (!strcasecmp(key, "Defer")) { + dbus_bool_t flag; + + if (var != DBUS_TYPE_BOOLEAN) + goto fail; + + dbus_message_iter_get_basic(&value, &flag); + *defer = flag; + } + + dbus_message_iter_next(props); + } + + return 0; + +fail: + DBG("Failed parsing %s", key); + + return -EINVAL; +} + +struct select_properties_data { + struct bap_data *data; + DBusMessage *msg; +}; + +static void select_properties_reconfig(int err, const char *err_msg, void *data) +{ + struct select_properties_data *info = data; + struct future *done = NULL; + + future_init_dbus_reply(&done, "select_properties_reconfig", info->msg); + dbus_message_unref(info->msg); + + /* Reconfigure endpoints using the same flow as for initial config */ + if (!err) + pac_select_all(info->data, true, done); + + future_clear(&done, err, err_msg); + + free(info); +} + +static DBusMessage *select_properties(DBusConnection *conn, DBusMessage *msg, + void *user_data) +{ + struct bap_ep *ep = user_data; + struct bap_data *data = ep->data; + struct select_properties_data *info; + struct future *done = NULL; + bool defer = false; + DBusMessageIter args, props; + + switch (bt_bap_pac_get_type(ep->lpac)) { + case BT_BAP_SOURCE: + case BT_BAP_SINK: + break; + default: + return btd_error_invalid_args(msg); + } + + dbus_message_iter_init(msg, &args); + dbus_message_iter_recurse(&args, &props); + if (select_properties_parse(&props, &defer)) + return btd_error_invalid_args(msg); + + DBG("%s defer %d", ep->path, (int)defer); + + ep->reconfigure = true; + if (defer) + return dbus_message_new_method_return(msg); + + info = new0(struct select_properties_data, 1); + info->data = ep->data; + info->msg = dbus_message_ref(msg); + + future_init(&done, "select_properties", select_properties_reconfig, + info); + + queue_foreach(data->snks, ep_close_if_reconfigure, done); + queue_foreach(data->srcs, ep_close_if_reconfigure, done); + + future_clear(&done, 0, NULL); + return NULL; +} + static bool stream_io_unset(const void *data, const void *user_data) { struct bt_bap_stream *stream = (struct bt_bap_stream *)data; @@ -1451,6 +1569,10 @@ static const GDBusMethodTable ep_methods[] = { { GDBUS_EXPERIMENTAL_ASYNC_METHOD("ClearConfiguration", GDBUS_ARGS({ "transport", "o" }), NULL, clear_configuration) }, + { GDBUS_EXPERIMENTAL_ASYNC_METHOD("SelectProperties", + GDBUS_ARGS( + { "Properties", "a{sv}" }), + NULL, select_properties) }, { }, }; @@ -1684,13 +1806,6 @@ static void setup_config(void *data, void *user_data) bt_bap_stream_set_user_data(setup->stream, ep->path); } -static void bap_config(void *data, void *user_data) -{ - struct bap_ep *ep = data; - - queue_foreach(ep->setups, setup_config, NULL); -} - static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, struct iovec *metadata, struct bt_bap_qos *qos, void *user_data) @@ -1707,13 +1822,16 @@ static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, setup->caps = util_iov_dup(caps, 1); setup->metadata = util_iov_dup(metadata, 1); setup->qos = *qos; + future_init_chain(&setup->qos_done, ep->setup_done); done: DBG("ep %p selecting %d", ep, ep->selecting); ep->selecting--; - if (!ep->selecting) + if (!ep->selecting) { + future_clear(&ep->setup_done, 0, NULL); future_clear(&ep->select_done, 0, NULL); + } } static bool pac_register(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, @@ -1734,6 +1852,8 @@ static bool pac_register(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, struct pac_select_data { struct bap_data *data; struct future *select_done; + struct future *setup_done; + bool reconfigure; }; static bool pac_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, @@ -1763,12 +1883,21 @@ static bool pac_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, return true; } + if (select_data->reconfigure) { + if (!ep->reconfigure) + return true; + ep->reconfigure = false; + } + /* TODO: Cache LRU? */ if (btd_service_is_initiator(service)) { bt_bap_select(lpac, rpac, &ep->selecting, select_cb, ep); - if (ep->selecting) + if (ep->selecting) { future_init_chain(&ep->select_done, select_data->select_done); + future_init_chain(&ep->setup_done, + select_data->setup_done); + } } return true; @@ -1788,6 +1917,7 @@ static void ep_cancel_select(struct bap_ep *ep) { struct bt_bap *bap = ep->data->bap; + future_clear(&ep->setup_done, ECANCELED, NULL); future_clear(&ep->select_done, ECANCELED, NULL); bt_bap_foreach_pac(bap, BT_BAP_SOURCE, pac_cancel_select, ep); @@ -1817,6 +1947,21 @@ static bool pac_found_bcast(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac, return true; } +static void setup_ensure_stream(void *data, void *user_data) +{ + struct bap_setup *setup = data; + + if (!setup->stream) + setup_config(setup, user_data); +} + +static void bap_config(void *data, void *user_data) +{ + struct bap_ep *ep = data; + + queue_foreach(ep->setups, setup_ensure_stream, NULL); +} + static void select_complete_cb(int err, const char *err_msg, void *user_data) { struct bap_data *data = user_data; @@ -1828,10 +1973,13 @@ static void select_complete_cb(int err, const char *err_msg, void *user_data) queue_foreach(data->snks, bap_config, NULL); } -static void pac_select_all(struct bap_data *data) +static void pac_select_all(struct bap_data *data, bool reconfigure, + struct future *done) { struct pac_select_data select_data = { .data = data, + .reconfigure = reconfigure, + .setup_done = done, }; future_init(&select_data.select_done, "pac_select_all", @@ -1856,7 +2004,7 @@ static void bap_ready(struct bt_bap *bap, void *user_data) bt_bap_foreach_pac(bap, BT_BAP_SOURCE, pac_register, service); bt_bap_foreach_pac(bap, BT_BAP_SINK, pac_register, service); - pac_select_all(data); + pac_select_all(data, false, NULL); } static bool match_setup_stream(const void *data, const void *user_data) @@ -2499,7 +2647,11 @@ static void bap_state(struct bt_bap_stream *stream, uint8_t old_state, } break; case BT_BAP_STREAM_STATE_QOS: + if (setup) { setup_create_io(data, setup, stream, true); + future_clear(&setup->qos_done, setup->io ? 0 : EIO, + "Unable to configure"); + } break; case BT_BAP_STREAM_STATE_ENABLING: if (setup) @@ -2806,7 +2958,7 @@ static void pac_added(struct bt_bap_pac *pac, void *user_data) bt_bap_foreach_pac(data->bap, BT_BAP_SOURCE, pac_register, service); bt_bap_foreach_pac(data->bap, BT_BAP_SINK, pac_register, service); - pac_select_all(data); + pac_select_all(data, false, NULL); } static void pac_added_broadcast(struct bt_bap_pac *pac, void *user_data)