Add audio configurations API to audio control HAL

The API will be used to obtain the car audio configuration:
- Audio device configurations
- Audio mirroring devices
- Audio zone information
- - Audio zone fade configuration
- - Audio zone configurations
- - Input audio devices
- - Audio zone info

Bug: 359686069
Test: m -j, presubmit
Flag: EXEMPT HAL interface
Change-Id: I32cd7fc351c58e7816a9187d70e5e9c790163dcc
diff --git a/automotive/audiocontrol/aidl/default/AudioControl.cpp b/automotive/audiocontrol/aidl/default/AudioControl.cpp
index 7e7e145..730aee8 100644
--- a/automotive/audiocontrol/aidl/default/AudioControl.cpp
+++ b/automotive/audiocontrol/aidl/default/AudioControl.cpp
@@ -19,6 +19,7 @@
 
 #include "AudioControl.h"
 
+#include <aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.h>
 #include <aidl/android/hardware/automotive/audiocontrol/AudioFocusChange.h>
 #include <aidl/android/hardware/automotive/audiocontrol/DuckingInfo.h>
 #include <aidl/android/hardware/automotive/audiocontrol/IFocusListener.h>
@@ -256,6 +257,15 @@
                            });
 }
 
+template <typename aidl_type>
+static inline std::string toString(const std::vector<std::optional<aidl_type>>& in_values) {
+    return std::accumulate(std::begin(in_values), std::end(in_values), std::string{},
+                           [](const std::string& ls, const std::optional<aidl_type>& rs) {
+                               return ls + (ls.empty() ? "" : ",") +
+                                      (rs.has_value() ? rs.value().toString() : "empty");
+                           });
+}
+
 ndk::ScopedAStatus AudioControl::onAudioFocusChangeWithMetaData(
         const audiohalcommon::PlaybackTrackMetadata& in_playbackMetaData, int32_t in_zoneId,
         AudioFocusChange in_focusChange) {
@@ -309,6 +319,27 @@
     return ndk::ScopedAStatus::ok();
 }
 
+ndk::ScopedAStatus AudioControl::getAudioDeviceConfiguration(
+        AudioDeviceConfiguration* audioDeviceConfig) {
+    LOG(DEBUG) << ":" << __func__ << "audioDeviceConfig" << audioDeviceConfig->toString();
+    return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus AudioControl::getOutputMirroringDevices(
+        std::vector<AudioPort>* mirroringDevices) {
+    for (const auto& mirroringDevice : *mirroringDevices) {
+        LOG(DEBUG) << ":" << __func__ << "Mirror device: " << mirroringDevice.toString().c_str();
+    }
+    return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus AudioControl::getCarAudioZones(std::vector<AudioZone>* audioZones) {
+    for (const auto& audioZone : *audioZones) {
+        LOG(DEBUG) << ":" << __func__ << "Audio zone: " << audioZone.toString().c_str();
+    }
+    return ndk::ScopedAStatus::ok();
+}
+
 binder_status_t AudioControl::dump(int fd, const char** args, uint32_t numArgs) {
     if (numArgs == 0) {
         return dumpsys(fd);