PatchPanel: Keep peer alive during use.
Test: BT call, switch from hearing aid to headset
Bug: 126789266
Change-Id: I589e5ecaac25c1ce1d504a387662b96cf50f63ba
diff --git a/services/audioflinger/TrackBase.h b/services/audioflinger/TrackBase.h
index 0ba0ab4..e23173f 100644
--- a/services/audioflinger/TrackBase.h
+++ b/services/audioflinger/TrackBase.h
@@ -337,10 +337,19 @@
PatchTrackBase(sp<ClientProxy> proxy, const ThreadBase& thread,
const Timeout& timeout);
void setPeerTimeout(std::chrono::nanoseconds timeout);
- void setPeerProxy(PatchProxyBufferProvider *proxy) { mPeerProxy = proxy; }
+ template <typename T>
+ void setPeerProxy(const sp<T> &proxy, bool holdReference) {
+ mPeerReferenceHold = holdReference ? proxy : nullptr;
+ mPeerProxy = proxy.get();
+ }
+ void clearPeerProxy() {
+ mPeerReferenceHold.clear();
+ mPeerProxy = nullptr;
+ }
protected:
const sp<ClientProxy> mProxy;
+ sp<RefBase> mPeerReferenceHold; // keeps mPeerProxy alive during access.
PatchProxyBufferProvider* mPeerProxy = nullptr;
struct timespec mPeerTimeout{};