AudioFlinger: Add PatchRecord PatchTrack interfaces
IAfPatchTrack
IAfPatchRecord
Test: atest audiorecord_tests audiotrack_tests audiorouting_tests trackplayerbase_tests audiosystem_tests
Test: atest AudioTrackTest AudioRecordTest
Test: YouTube and Camera
Bug: 288339104
Bug: 288468076
Merged-In: I2dde38e5e1cee1af75d28ddbc647db7000b9cf0c
Change-Id: I2dde38e5e1cee1af75d28ddbc647db7000b9cf0c
diff --git a/services/audioflinger/TrackBase.h b/services/audioflinger/TrackBase.h
index 6ac2df8..7cd78c3 100644
--- a/services/audioflinger/TrackBase.h
+++ b/services/audioflinger/TrackBase.h
@@ -388,37 +388,28 @@
std::optional<mediautils::BatteryStatsAudioHandle> mBatteryStatsHolder;
};
-// PatchProxyBufferProvider interface is implemented by PatchTrack and PatchRecord.
-// it provides buffer access methods that map those of a ClientProxy (see AudioTrackShared.h)
-class PatchProxyBufferProvider
-{
-public:
-
- virtual ~PatchProxyBufferProvider() = default;
-
- virtual bool producesBufferOnDemand() const = 0;
- virtual status_t obtainBuffer(Proxy::Buffer* buffer,
- const struct timespec *requested = NULL) = 0;
- virtual void releaseBuffer(Proxy::Buffer* buffer) = 0;
-};
-
-class PatchTrackBase : public PatchProxyBufferProvider
+class PatchTrackBase : public PatchProxyBufferProvider, public virtual IAfPatchTrackBase
{
public:
using Timeout = std::optional<std::chrono::nanoseconds>;
PatchTrackBase(const sp<ClientProxy>& proxy, const ThreadBase& thread,
const Timeout& timeout);
- void setPeerTimeout(std::chrono::nanoseconds timeout);
- template <typename T>
- void setPeerProxy(const sp<T> &proxy, bool holdReference) {
- mPeerReferenceHold = holdReference ? proxy : nullptr;
- mPeerProxy = proxy.get();
- }
- void clearPeerProxy() {
+ void setPeerTimeout(std::chrono::nanoseconds timeout) final;
+ void setPeerProxy(const sp<IAfPatchTrackBase>& proxy, bool holdReference) final {
+ if (proxy) {
+ mPeerReferenceHold = holdReference ? proxy : nullptr;
+ mPeerProxy = proxy->asPatchProxyBufferProvider();
+ } else {
+ clearPeerProxy();
+ }
+ }
+ void clearPeerProxy() final {
mPeerReferenceHold.clear();
mPeerProxy = nullptr;
}
+ PatchProxyBufferProvider* asPatchProxyBufferProvider() final { return this; }
+
bool producesBufferOnDemand() const override { return false; }
protected: