audio: Refactor streams implementation

Simplify the experience of implementing stream variants.
Stream class now exposes two interfaces: DriverInterface
and StreamCommonInterface, which represent the two
aspects of its usage: via the FMQ on the worker thread,
and via IStreamCommon Binder interface.

Input/output streams now inherit the concrete stream
variant, and implement interface methods specific for
IStreamIn and IStreamOut.

Added DriverInterface::shutdown method which is called
on the worker thread prior to the exit.

Bug: 282568751
Test: atest VtsHalAudioCoreTargetTest
Merged-In: I5bf8da2f22b27f0e284a41fc30b920d87ac2936c
Change-Id: I5bf8da2f22b27f0e284a41fc30b920d87ac2936c
(cherry picked from commit d5554cfae2a2b7af14c770f4f2f9aded76f64ea1)
diff --git a/audio/aidl/default/StreamStub.cpp b/audio/aidl/default/StreamStub.cpp
index 2467320..289afa1 100644
--- a/audio/aidl/default/StreamStub.cpp
+++ b/audio/aidl/default/StreamStub.cpp
@@ -31,33 +31,34 @@
 
 namespace aidl::android::hardware::audio::core {
 
-DriverStub::DriverStub(const StreamContext& context, bool isInput)
-    : mFrameSizeBytes(context.getFrameSize()),
+StreamStub::StreamStub(const Metadata& metadata, StreamContext&& context)
+    : StreamCommonImpl(metadata, std::move(context)),
+      mFrameSizeBytes(context.getFrameSize()),
       mSampleRate(context.getSampleRate()),
       mIsAsynchronous(!!context.getAsyncCallback()),
-      mIsInput(isInput) {}
+      mIsInput(isInput(metadata)) {}
 
-::android::status_t DriverStub::init() {
+::android::status_t StreamStub::init() {
     usleep(500);
     return ::android::OK;
 }
 
-::android::status_t DriverStub::drain(StreamDescriptor::DrainMode) {
+::android::status_t StreamStub::drain(StreamDescriptor::DrainMode) {
     usleep(500);
     return ::android::OK;
 }
 
-::android::status_t DriverStub::flush() {
+::android::status_t StreamStub::flush() {
     usleep(500);
     return ::android::OK;
 }
 
-::android::status_t DriverStub::pause() {
+::android::status_t StreamStub::pause() {
     usleep(500);
     return ::android::OK;
 }
 
-::android::status_t DriverStub::transfer(void* buffer, size_t frameCount, size_t* actualFrameCount,
+::android::status_t StreamStub::transfer(void* buffer, size_t frameCount, size_t* actualFrameCount,
                                          int32_t* latencyMs) {
     static constexpr float kMicrosPerSecond = MICROS_PER_SECOND;
     static constexpr float kScaleFactor = .8f;
@@ -79,16 +80,12 @@
     return ::android::OK;
 }
 
-::android::status_t DriverStub::standby() {
+::android::status_t StreamStub::standby() {
     usleep(500);
     return ::android::OK;
 }
 
-::android::status_t DriverStub::setConnectedDevices(
-        const std::vector<AudioDevice>& connectedDevices __unused) {
-    usleep(500);
-    return ::android::OK;
-}
+void StreamStub::shutdown() {}
 
 // static
 ndk::ScopedAStatus StreamInStub::createInstance(const SinkMetadata& sinkMetadata,
@@ -97,7 +94,7 @@
                                                 std::shared_ptr<StreamIn>* result) {
     std::shared_ptr<StreamIn> stream =
             ndk::SharedRefBase::make<StreamInStub>(sinkMetadata, std::move(context), microphones);
-    if (auto status = initInstance(stream); !status.isOk()) {
+    if (auto status = stream->initInstance(stream); !status.isOk()) {
         return status;
     }
     *result = std::move(stream);
@@ -106,16 +103,7 @@
 
 StreamInStub::StreamInStub(const SinkMetadata& sinkMetadata, StreamContext&& context,
                            const std::vector<MicrophoneInfo>& microphones)
-    : StreamIn(
-              sinkMetadata, std::move(context),
-              [](const StreamContext& ctx) -> DriverInterface* {
-                  return new DriverStub(ctx, true /*isInput*/);
-              },
-              [](const StreamContext& ctx, DriverInterface* driver) -> StreamWorkerInterface* {
-                  // The default worker implementation is used.
-                  return new StreamInWorker(ctx, driver);
-              },
-              microphones) {}
+    : StreamStub(sinkMetadata, std::move(context)), StreamIn(microphones) {}
 
 // static
 ndk::ScopedAStatus StreamOutStub::createInstance(const SourceMetadata& sourceMetadata,
@@ -124,7 +112,7 @@
                                                  std::shared_ptr<StreamOut>* result) {
     std::shared_ptr<StreamOut> stream = ndk::SharedRefBase::make<StreamOutStub>(
             sourceMetadata, std::move(context), offloadInfo);
-    if (auto status = initInstance(stream); !status.isOk()) {
+    if (auto status = stream->initInstance(stream); !status.isOk()) {
         return status;
     }
     *result = std::move(stream);
@@ -133,15 +121,6 @@
 
 StreamOutStub::StreamOutStub(const SourceMetadata& sourceMetadata, StreamContext&& context,
                              const std::optional<AudioOffloadInfo>& offloadInfo)
-    : StreamOut(
-              sourceMetadata, std::move(context),
-              [](const StreamContext& ctx) -> DriverInterface* {
-                  return new DriverStub(ctx, false /*isInput*/);
-              },
-              [](const StreamContext& ctx, DriverInterface* driver) -> StreamWorkerInterface* {
-                  // The default worker implementation is used.
-                  return new StreamOutWorker(ctx, driver);
-              },
-              offloadInfo) {}
+    : StreamStub(sourceMetadata, std::move(context)), StreamOut(offloadInfo) {}
 
 }  // namespace aidl::android::hardware::audio::core