Merge "Break cyclic binder dependency"
diff --git a/media/libaudiohal/impl/DeviceHalAidl.cpp b/media/libaudiohal/impl/DeviceHalAidl.cpp
index 22bdc23..e55ad14 100644
--- a/media/libaudiohal/impl/DeviceHalAidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalAidl.cpp
@@ -32,6 +32,7 @@
 #include <utils/Log.h>
 
 #include "DeviceHalAidl.h"
+#include "EffectHalAidl.h"
 #include "StreamHalAidl.h"
 
 using aidl::android::aidl_utils::statusTFromBinderStatus;
@@ -882,25 +883,64 @@
     return OK;
 }
 
-status_t DeviceHalAidl::addDeviceEffect(const struct audio_port_config *device __unused,
-        sp<EffectHalInterface> effect) {
+status_t DeviceHalAidl::addDeviceEffect(
+        const struct audio_port_config *device, sp<EffectHalInterface> effect) {
+    TIME_CHECK();
+    if (!mModule) return NO_INIT;
     if (!effect) {
         return BAD_VALUE;
     }
-    TIME_CHECK();
-    if (!mModule) return NO_INIT;
-    ALOGE("%s not implemented yet", __func__);
+    bool isInput = VALUE_OR_RETURN_STATUS(::aidl::android::portDirection(
+                    device->role, device->type)) == ::aidl::android::AudioPortDirection::INPUT;
+    auto requestedPortConfig = VALUE_OR_RETURN_STATUS(
+            ::aidl::android::legacy2aidl_audio_port_config_AudioPortConfig(
+                    *device, isInput, 0));
+    if (requestedPortConfig.ext.getTag() != AudioPortExt::Tag::device) {
+        ALOGE("%s: provided port config is not a device port config: %s",
+                __func__, requestedPortConfig.toString().c_str());
+        return BAD_VALUE;
+    }
+    AudioPortConfig devicePortConfig;
+    bool created;
+    RETURN_STATUS_IF_ERROR(findOrCreatePortConfig(
+                    requestedPortConfig, {} /*destinationPortIds*/, &devicePortConfig, &created));
+    Cleanups cleanups;
+    if (created) {
+        cleanups.emplace_front(this, &DeviceHalAidl::resetPortConfig, devicePortConfig.id);
+    }
+    auto aidlEffect = sp<effect::EffectHalAidl>::cast(effect);
+    RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->addDeviceEffect(
+                            devicePortConfig.id, aidlEffect->getIEffect())));
+    cleanups.disarmAll();
     return OK;
 }
-status_t DeviceHalAidl::removeDeviceEffect(const struct audio_port_config *device __unused,
-                            sp<EffectHalInterface> effect) {
+status_t DeviceHalAidl::removeDeviceEffect(
+        const struct audio_port_config *device, sp<EffectHalInterface> effect) {
+    TIME_CHECK();
+    if (!mModule) return NO_INIT;
     if (!effect) {
         return BAD_VALUE;
     }
-    TIME_CHECK();
-    if (!mModule) return NO_INIT;
-    ALOGE("%s not implemented yet", __func__);
-    return OK;
+    bool isInput = VALUE_OR_RETURN_STATUS(::aidl::android::portDirection(
+                    device->role, device->type)) == ::aidl::android::AudioPortDirection::INPUT;
+    auto requestedPortConfig = VALUE_OR_RETURN_STATUS(
+            ::aidl::android::legacy2aidl_audio_port_config_AudioPortConfig(
+                    *device, isInput, 0));
+    if (requestedPortConfig.ext.getTag() != AudioPortExt::Tag::device) {
+        ALOGE("%s: provided port config is not a device port config: %s",
+                __func__, requestedPortConfig.toString().c_str());
+        return BAD_VALUE;
+    }
+    auto existingPortConfigIt = findPortConfig(
+            requestedPortConfig.ext.get<AudioPortExt::Tag::device>().device);
+    if (existingPortConfigIt == mPortConfigs.end()) {
+        ALOGE("%s: could not find a configured device port for the config %s",
+                __func__, requestedPortConfig.toString().c_str());
+        return BAD_VALUE;
+    }
+    auto aidlEffect = sp<effect::EffectHalAidl>::cast(effect);
+    return statusTFromBinderStatus(mModule->removeDeviceEffect(
+                    existingPortConfigIt->first, aidlEffect->getIEffect()));
 }
 
 status_t DeviceHalAidl::getMmapPolicyInfos(
diff --git a/media/libaudiohal/impl/StreamHalAidl.cpp b/media/libaudiohal/impl/StreamHalAidl.cpp
index c84f80f..80e19a0 100644
--- a/media/libaudiohal/impl/StreamHalAidl.cpp
+++ b/media/libaudiohal/impl/StreamHalAidl.cpp
@@ -32,6 +32,7 @@
 #include <utils/Log.h>
 
 #include "DeviceHalAidl.h"
+#include "EffectHalAidl.h"
 #include "StreamHalAidl.h"
 
 using ::aidl::android::aidl_utils::statusTFromBinderStatus;
@@ -162,20 +163,26 @@
     return OK;
 }
 
-status_t StreamHalAidl::addEffect(sp<EffectHalInterface> effect __unused) {
+status_t StreamHalAidl::addEffect(sp<EffectHalInterface> effect) {
     ALOGD("%p %s::%s", this, getClassName().c_str(), __func__);
     TIME_CHECK();
     if (!mStream) return NO_INIT;
-    ALOGE("%s not implemented yet", __func__);
-    return OK;
+    if (effect == nullptr) {
+        return BAD_VALUE;
+    }
+    auto aidlEffect = sp<effect::EffectHalAidl>::cast(effect);
+    return statusTFromBinderStatus(mStream->addEffect(aidlEffect->getIEffect()));
 }
 
-status_t StreamHalAidl::removeEffect(sp<EffectHalInterface> effect __unused) {
+status_t StreamHalAidl::removeEffect(sp<EffectHalInterface> effect) {
     ALOGD("%p %s::%s", this, getClassName().c_str(), __func__);
     TIME_CHECK();
     if (!mStream) return NO_INIT;
-    ALOGE("%s not implemented yet", __func__);
-    return OK;
+    if (effect == nullptr) {
+        return BAD_VALUE;
+    }
+    auto aidlEffect = sp<effect::EffectHalAidl>::cast(effect);
+    return statusTFromBinderStatus(mStream->removeEffect(aidlEffect->getIEffect()));
 }
 
 status_t StreamHalAidl::standby() {
diff --git a/services/audioflinger/Android.bp b/services/audioflinger/Android.bp
index 39a4b9e..73c2ff4 100644
--- a/services/audioflinger/Android.bp
+++ b/services/audioflinger/Android.bp
@@ -148,13 +148,10 @@
 
     srcs: [
         "AudioFlinger.cpp",
-        "AudioHwDevice.cpp",
-        "AudioStreamOut.cpp",
         "DeviceEffectManager.cpp",
         "Effects.cpp",
         "PatchPanel.cpp",
         "PropertyUtils.cpp",
-        "SpdifStreamOut.cpp",
         "Threads.cpp",
         "Tracks.cpp",
     ],
@@ -170,6 +167,7 @@
         "av-types-aidl-cpp",
         "effect-aidl-cpp",
         "libaudioclient_aidl_conversion",
+        "libaudioflinger_datapath",
         "libaudioflinger_fastpath",
         "libaudioflinger_timing",
         "libaudioflinger_utils",
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index e4e39c6..8fb8ea8 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -91,14 +91,15 @@
 #include <timing/SyncEvent.h>
 #include <timing/SynchronizedRecordState.h>
 
+#include <datapath/AudioHwDevice.h>
+#include <datapath/AudioStreamOut.h>
+#include <datapath/SpdifStreamOut.h>
+#include <datapath/ThreadMetrics.h>
+#include <datapath/TrackMetrics.h>
 #include <fastpath/FastCapture.h>
 #include <fastpath/FastMixer.h>
 #include <media/nbaio/NBAIO.h>
-#include "AudioStreamOut.h"
-#include "SpdifStreamOut.h"
-#include "AudioHwDevice.h"
-#include "ThreadMetrics.h"
-#include "TrackMetrics.h"
+
 
 #include <android/os/IPowerManager.h>
 
diff --git a/services/audioflinger/datapath/Android.bp b/services/audioflinger/datapath/Android.bp
new file mode 100644
index 0000000..58f0422
--- /dev/null
+++ b/services/audioflinger/datapath/Android.bp
@@ -0,0 +1,64 @@
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_av_services_audioflinger_license"],
+}
+
+audioflinger_datapath_tidy_errors = audioflinger_base_tidy_errors + [
+    "modernize-avoid-c-arrays",
+    "modernize-deprecated-headers",
+    "modernize-pass-by-value",
+    "modernize-use-auto",
+    "modernize-use-nodiscard",
+
+    // TODO(b/275642749) Reenable these warnings
+    "-misc-non-private-member-variables-in-classes",
+]
+
+// Eventually use common tidy defaults
+cc_defaults {
+    name: "audioflinger_datapath_flags_defaults",
+    // https://clang.llvm.org/docs/UsersManual.html#command-line-options
+    // https://clang.llvm.org/docs/DiagnosticsReference.html
+    cflags: audioflinger_base_cflags,
+    // https://clang.llvm.org/extra/clang-tidy/
+    tidy: true,
+    tidy_checks: audioflinger_datapath_tidy_errors,
+    tidy_checks_as_errors: audioflinger_datapath_tidy_errors,
+    tidy_flags: [
+      "-format-style=file",
+    ],
+}
+
+cc_library {
+    name: "libaudioflinger_datapath",
+
+    defaults: [
+        "audioflinger_datapath_flags_defaults",
+        "latest_android_media_audio_common_types_cpp_shared",
+    ],
+
+    srcs: [
+        "AudioHwDevice.cpp",
+        "AudioStreamOut.cpp",
+        "SpdifStreamOut.cpp",
+    ],
+
+    header_libs: [
+        "libaudiohal_headers",
+        "liberror_headers",
+    ],
+
+    shared_libs: [
+        "audioclient-types-aidl-cpp",
+        "av-types-aidl-cpp",
+        "libaudiospdif",
+        "libaudioutils",
+        "libbase",
+        "liblog",
+        "libutils", // refbase
+    ],
+}
diff --git a/services/audioflinger/AudioHwDevice.cpp b/services/audioflinger/datapath/AudioHwDevice.cpp
similarity index 94%
rename from services/audioflinger/AudioHwDevice.cpp
rename to services/audioflinger/datapath/AudioHwDevice.cpp
index dee6161..9ff316c 100644
--- a/services/audioflinger/AudioHwDevice.cpp
+++ b/services/audioflinger/datapath/AudioHwDevice.cpp
@@ -44,7 +44,7 @@
 {
 
     struct audio_config originalConfig = *config;
-    AudioStreamOut *outputStream = new AudioStreamOut(this, flags);
+    auto outputStream = new AudioStreamOut(this, flags);
 
     // Try to open the HAL first using the current format.
     ALOGV("openOutputStream(), try "
@@ -57,7 +57,7 @@
 
     if (status != NO_ERROR) {
         delete outputStream;
-        outputStream = NULL;
+        outputStream = nullptr;
 
         // FIXME Look at any modification to the config.
         // The HAL might modify the config to suggest a wrapped format.
@@ -71,7 +71,7 @@
             status);
 
         // If the data is encoded then try again using wrapped PCM.
-        bool wrapperNeeded = !audio_has_proportional_frames(originalConfig.format)
+        const bool wrapperNeeded = !audio_has_proportional_frames(originalConfig.format)
                 && ((flags & AUDIO_OUTPUT_FLAG_DIRECT) != 0)
                 && ((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) == 0);
 
@@ -83,7 +83,7 @@
                     ALOGE("ERROR - openOutputStream(), SPDIF open returned %d",
                         status);
                     delete outputStream;
-                    outputStream = NULL;
+                    outputStream = nullptr;
                 }
             } else {
                 ALOGE("ERROR - openOutputStream(), SPDIFEncoder does not support format 0x%08x",
diff --git a/services/audioflinger/AudioHwDevice.h b/services/audioflinger/datapath/AudioHwDevice.h
similarity index 81%
rename from services/audioflinger/AudioHwDevice.h
rename to services/audioflinger/datapath/AudioHwDevice.h
index d071922..f9cb80e 100644
--- a/services/audioflinger/AudioHwDevice.h
+++ b/services/audioflinger/datapath/AudioHwDevice.h
@@ -54,25 +54,25 @@
         , mFlags(flags) { }
     virtual ~AudioHwDevice() { free((void *)mModuleName); }
 
-    bool canSetMasterVolume() const {
+    [[nodiscard]] bool canSetMasterVolume() const {
         return (0 != (mFlags & AHWD_CAN_SET_MASTER_VOLUME));
     }
 
-    bool canSetMasterMute() const {
+    [[nodiscard]] bool canSetMasterMute() const {
         return (0 != (mFlags & AHWD_CAN_SET_MASTER_MUTE));
     }
 
-    bool isInsert() const {
+    [[nodiscard]] bool isInsert() const {
         return (0 != (mFlags & AHWD_IS_INSERT));
     }
 
-    bool supportsBluetoothVariableLatency() const {
+    [[nodiscard]] bool supportsBluetoothVariableLatency() const {
         return (0 != (mFlags & AHWD_SUPPORTS_BT_LATENCY_MODES));
     }
 
-    audio_module_handle_t handle() const { return mHandle; }
-    const char *moduleName() const { return mModuleName; }
-    sp<DeviceHalInterface> hwDevice() const { return mHwDevice; }
+   [[nodiscard]] audio_module_handle_t handle() const { return mHandle; }
+   [[nodiscard]] const char *moduleName() const { return mModuleName; }
+   [[nodiscard]] sp<DeviceHalInterface> hwDevice() const { return mHwDevice; }
 
     /** This method creates and opens the audio hardware output stream.
      * The "address" parameter qualifies the "devices" audio device type if needed.
@@ -89,17 +89,17 @@
             struct audio_config *config,
             const char *address);
 
-    bool supportsAudioPatches() const;
+    [[nodiscard]] bool supportsAudioPatches() const;
 
-    status_t getAudioPort(struct audio_port_v7 *port) const;
+    [[nodiscard]] status_t getAudioPort(struct audio_port_v7 *port) const;
 
-    status_t getMmapPolicyInfos(
+    [[nodiscard]] status_t getMmapPolicyInfos(
             media::audio::common::AudioMMapPolicyType policyType,
             std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos) const;
 
-    int32_t getAAudioMixerBurstCount() const;
+    [[nodiscard]] int32_t getAAudioMixerBurstCount() const;
 
-    int32_t getAAudioHardwareBurstMinUsec() const;
+    [[nodiscard]] int32_t getAAudioHardwareBurstMinUsec() const;
 
 private:
     const audio_module_handle_t mHandle;
diff --git a/services/audioflinger/AudioStreamOut.cpp b/services/audioflinger/datapath/AudioStreamOut.cpp
similarity index 86%
rename from services/audioflinger/AudioStreamOut.cpp
rename to services/audioflinger/datapath/AudioStreamOut.cpp
index 65ec0e8..6fa82e5 100644
--- a/services/audioflinger/AudioStreamOut.cpp
+++ b/services/audioflinger/datapath/AudioStreamOut.cpp
@@ -31,21 +31,13 @@
 // ----------------------------------------------------------------------------
 AudioStreamOut::AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags)
         : audioHwDev(dev)
-        , stream(NULL)
         , flags(flags)
-        , mFramesWritten(0)
-        , mFramesWrittenAtStandby(0)
-        , mRenderPosition(0)
-        , mRateMultiplier(1)
-        , mHalFormatHasProportionalFrames(false)
-        , mHalFrameSize(0)
-        , mExpectRetrograde(false)
 {
 }
 
-AudioStreamOut::~AudioStreamOut()
-{
-}
+// This must be defined here together with the HAL includes above and
+// not solely in the header.
+AudioStreamOut::~AudioStreamOut() = default;
 
 sp<DeviceHalInterface> AudioStreamOut::hwDev() const
 {
@@ -54,12 +46,12 @@
 
 status_t AudioStreamOut::getRenderPosition(uint64_t *frames)
 {
-    if (stream == 0) {
+    if (stream == nullptr) {
         return NO_INIT;
     }
 
     uint32_t halPosition = 0;
-    status_t status = stream->getRenderPosition(&halPosition);
+    const status_t status = stream->getRenderPosition(&halPosition);
     if (status != NO_ERROR) {
         return status;
     }
@@ -67,7 +59,7 @@
     // Maintain a 64-bit render position using the 32-bit result from the HAL.
     // This delta calculation relies on the arithmetic overflow behavior
     // of integers. For example (100 - 0xFFFFFFF0) = 116.
-    const uint32_t truncatedPosition = (uint32_t)mRenderPosition;
+    const auto truncatedPosition = (uint32_t)mRenderPosition;
     int32_t deltaHalPosition; // initialization not needed, overwitten by __builtin_sub_overflow()
     (void) __builtin_sub_overflow(halPosition, truncatedPosition, &deltaHalPosition);
 
@@ -87,7 +79,7 @@
 status_t AudioStreamOut::getRenderPosition(uint32_t *frames)
 {
     uint64_t position64 = 0;
-    status_t status = getRenderPosition(&position64);
+    const status_t status = getRenderPosition(&position64);
     if (status == NO_ERROR) {
         *frames = (uint32_t)position64;
     }
@@ -96,12 +88,12 @@
 
 status_t AudioStreamOut::getPresentationPosition(uint64_t *frames, struct timespec *timestamp)
 {
-    if (stream == 0) {
+    if (stream == nullptr) {
         return NO_INIT;
     }
 
     uint64_t halPosition = 0;
-    status_t status = stream->getPresentationPosition(&halPosition, timestamp);
+    const status_t status = stream->getPresentationPosition(&halPosition, timestamp);
     if (status != NO_ERROR) {
         return status;
     }
@@ -109,7 +101,7 @@
     // Adjust for standby using HAL rate frames.
     // Only apply this correction if the HAL is getting PCM frames.
     if (mHalFormatHasProportionalFrames) {
-        uint64_t adjustedPosition = (halPosition <= mFramesWrittenAtStandby) ?
+        const uint64_t adjustedPosition = (halPosition <= mFramesWrittenAtStandby) ?
                 0 : (halPosition - mFramesWrittenAtStandby);
         // Scale from HAL sample rate to application rate.
         *frames = adjustedPosition / mRateMultiplier;
@@ -129,7 +121,7 @@
 {
     sp<StreamOutHalInterface> outStream;
 
-    audio_output_flags_t customFlags = (config->format == AUDIO_FORMAT_IEC61937)
+    const audio_output_flags_t customFlags = (config->format == AUDIO_FORMAT_IEC61937)
                 ? (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO)
                 : flags;
 
@@ -195,7 +187,7 @@
     mExpectRetrograde = false;
     mFramesWritten = 0;
     mFramesWrittenAtStandby = 0;
-    status_t result = stream->flush();
+    const status_t result = stream->flush();
     return result != INVALID_OPERATION ? result : NO_ERROR;
 }
 
@@ -210,7 +202,7 @@
 ssize_t AudioStreamOut::write(const void *buffer, size_t numBytes)
 {
     size_t bytesWritten;
-    status_t result = stream->write(buffer, numBytes, &bytesWritten);
+    const status_t result = stream->write(buffer, numBytes, &bytesWritten);
     if (result == OK && bytesWritten > 0 && mHalFrameSize > 0) {
         mFramesWritten += bytesWritten / mHalFrameSize;
     }
diff --git a/services/audioflinger/AudioStreamOut.h b/services/audioflinger/datapath/AudioStreamOut.h
similarity index 84%
rename from services/audioflinger/AudioStreamOut.h
rename to services/audioflinger/datapath/AudioStreamOut.h
index 82fe238..ce00f8c 100644
--- a/services/audioflinger/AudioStreamOut.h
+++ b/services/audioflinger/datapath/AudioStreamOut.h
@@ -41,7 +41,7 @@
     sp<StreamOutHalInterface> stream;
     const audio_output_flags_t flags;
 
-    sp<DeviceHalInterface> hwDev() const;
+    [[nodiscard]] sp<DeviceHalInterface> hwDev() const;
 
     AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags);
 
@@ -78,7 +78,7 @@
     /**
      * @return frame size from the perspective of the application and the AudioFlinger.
      */
-    virtual size_t getFrameSize() const { return mHalFrameSize; }
+    [[nodiscard]] virtual size_t getFrameSize() const { return mHalFrameSize; }
 
     /**
      * @return audio stream configuration: channel mask, format, sample rate:
@@ -88,7 +88,7 @@
      *   - sample rate from the perspective of the application and the AudioFlinger,
      *     The HAL may be running at a higher sample rate if, for example, playing wrapped EAC3.
      */
-    virtual audio_config_base_t getAudioProperties() const;
+    [[nodiscard]] virtual audio_config_base_t getAudioProperties() const;
 
     virtual status_t flush();
     virtual status_t standby();
@@ -101,13 +101,13 @@
     virtual void presentationComplete() { mExpectRetrograde = true; }
 
 protected:
-    uint64_t             mFramesWritten; // reset by flush
-    uint64_t             mFramesWrittenAtStandby;
-    uint64_t             mRenderPosition; // reset by flush, standby, or presentation complete
-    int                  mRateMultiplier;
-    bool                 mHalFormatHasProportionalFrames;
-    size_t               mHalFrameSize;
-    bool                 mExpectRetrograde; // see presentationComplete
+    uint64_t             mFramesWritten = 0; // reset by flush
+    uint64_t             mFramesWrittenAtStandby = 0;
+    uint64_t             mRenderPosition = 0; // reset by flush, standby, or presentation complete
+    int                  mRateMultiplier = 1;
+    bool                 mHalFormatHasProportionalFrames = false;
+    size_t               mHalFrameSize = 0;
+    bool                 mExpectRetrograde = false; // see presentationComplete
 };
 
 } // namespace android
diff --git a/services/audioflinger/SpdifStreamOut.cpp b/services/audioflinger/datapath/SpdifStreamOut.cpp
similarity index 95%
rename from services/audioflinger/SpdifStreamOut.cpp
rename to services/audioflinger/datapath/SpdifStreamOut.cpp
index 0ce5681..43e9c0c 100644
--- a/services/audioflinger/SpdifStreamOut.cpp
+++ b/services/audioflinger/datapath/SpdifStreamOut.cpp
@@ -37,9 +37,6 @@
         // Tell the HAL that the data will be compressed audio wrapped in a data burst.
         : AudioStreamOut(dev, (audio_output_flags_t) (flags | AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO))
         , mSpdifEncoder(this, format)
-        , mApplicationFormat(AUDIO_FORMAT_DEFAULT)
-        , mApplicationSampleRate(0)
-        , mApplicationChannelMask(AUDIO_CHANNEL_NONE)
 {
 }
 
@@ -91,7 +88,7 @@
             customConfig.format,
             customConfig.channel_mask);
 
-    status_t status = AudioStreamOut::open(
+    const status_t status = AudioStreamOut::open(
             handle,
             devices,
             &customConfig,
diff --git a/services/audioflinger/SpdifStreamOut.h b/services/audioflinger/datapath/SpdifStreamOut.h
similarity index 78%
rename from services/audioflinger/SpdifStreamOut.h
rename to services/audioflinger/datapath/SpdifStreamOut.h
index fc9bb6e..c8dc89f 100644
--- a/services/audioflinger/SpdifStreamOut.h
+++ b/services/audioflinger/datapath/SpdifStreamOut.h
@@ -39,13 +39,13 @@
     SpdifStreamOut(AudioHwDevice *dev, audio_output_flags_t flags,
             audio_format_t format);
 
-    virtual ~SpdifStreamOut() { }
+    ~SpdifStreamOut() override = default;
 
-    virtual status_t open(
+    status_t open(
             audio_io_handle_t handle,
             audio_devices_t devices,
             struct audio_config *config,
-            const char *address);
+            const char *address) override;
 
     /**
     * Write audio buffer to driver. Returns number of bytes written, or a
@@ -60,32 +60,34 @@
     * callback function must be called when more space is available in the
     * driver/hardware buffer.
     */
-    virtual ssize_t write(const void* buffer, size_t bytes);
+    ssize_t write(const void* buffer, size_t bytes) override;
 
     /**
      * @return frame size from the perspective of the application and the AudioFlinger.
      */
-    virtual size_t getFrameSize() const { return sizeof(int8_t); }
+    [[nodiscard]] size_t getFrameSize() const override { return sizeof(int8_t); }
 
     /**
      * @return format from the perspective of the application and the AudioFlinger.
      */
-    virtual audio_format_t getFormat() const { return mApplicationFormat; }
+    [[nodiscard]] virtual audio_format_t getFormat() const { return mApplicationFormat; }
 
     /**
      * The HAL may be running at a higher sample rate if, for example, playing wrapped EAC3.
      * @return sample rate from the perspective of the application and the AudioFlinger.
      */
-    virtual uint32_t getSampleRate() const { return mApplicationSampleRate; }
+    [[nodiscard]] virtual uint32_t getSampleRate() const { return mApplicationSampleRate; }
 
     /**
      * The HAL is in stereo mode when playing multi-channel compressed audio over HDMI.
      * @return channel mask from the perspective of the application and the AudioFlinger.
      */
-    virtual audio_channel_mask_t getChannelMask() const { return mApplicationChannelMask; }
+    [[nodiscard]] virtual audio_channel_mask_t getChannelMask() const {
+        return mApplicationChannelMask;
+    }
 
-    virtual status_t flush();
-    virtual status_t standby();
+    status_t flush() override;
+    status_t standby() override;
 
 private:
 
@@ -98,7 +100,7 @@
         {
         }
 
-        virtual ssize_t writeOutput(const void* buffer, size_t bytes)
+        ssize_t writeOutput(const void* buffer, size_t bytes) override
         {
             return mSpdifStreamOut->writeDataBurst(buffer, bytes);
         }
@@ -107,9 +109,9 @@
     };
 
     MySPDIFEncoder       mSpdifEncoder;
-    audio_format_t       mApplicationFormat;
-    uint32_t             mApplicationSampleRate;
-    audio_channel_mask_t mApplicationChannelMask;
+    audio_format_t       mApplicationFormat = AUDIO_FORMAT_DEFAULT;
+    uint32_t             mApplicationSampleRate = 0;
+    audio_channel_mask_t mApplicationChannelMask = AUDIO_CHANNEL_NONE;
 
     ssize_t  writeDataBurst(const void* data, size_t bytes);
     ssize_t  writeInternal(const void* buffer, size_t bytes);
diff --git a/services/audioflinger/ThreadMetrics.h b/services/audioflinger/datapath/ThreadMetrics.h
similarity index 100%
rename from services/audioflinger/ThreadMetrics.h
rename to services/audioflinger/datapath/ThreadMetrics.h
diff --git a/services/audioflinger/TrackMetrics.h b/services/audioflinger/datapath/TrackMetrics.h
similarity index 100%
rename from services/audioflinger/TrackMetrics.h
rename to services/audioflinger/datapath/TrackMetrics.h