audiolfinger: implement latency mode control in spatializer mixer

Add audio HAL stream latency mode control logic to
Spatialier mixer thread:
- Query supported latency modes from HAL stream and register mode
change callback: when mode changes either from callback or routing
change, notify Spatializer effect client via IAudioFlingerClient
interface.
- Compute requested latency mode based on the requested mode and
active spatialized tracks and request it from HAL stream.

Bug: 218273231
Test: make
Change-Id: Ifc4445e1ce554631dbcffaf478fbe8a33ec1b5ab
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 01ba2df..8ae06d0 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1587,21 +1587,29 @@
 }
 
 status_t AudioFlinger::setRequestedLatencyMode(
-        audio_io_handle_t output, audio_latency_mode_t mode __unused) {
+        audio_io_handle_t output, audio_latency_mode_t mode) {
     if (output == AUDIO_IO_HANDLE_NONE) {
         return BAD_VALUE;
     }
-    //TODO b/218273231: implement
-    return INVALID_OPERATION;
+    AutoMutex lock(mLock);
+    PlaybackThread *thread = checkPlaybackThread_l(output);
+    if (thread == nullptr) {
+        return BAD_VALUE;
+    }
+    return thread->setRequestedLatencyMode(mode);
 }
 
 status_t AudioFlinger::getSupportedLatencyModes(audio_io_handle_t output,
-            std::vector<audio_latency_mode_t>* modes __unused) {
+            std::vector<audio_latency_mode_t>* modes) {
     if (output == AUDIO_IO_HANDLE_NONE) {
         return BAD_VALUE;
     }
-    //TODO b/218273231: implement
-    return INVALID_OPERATION;
+    AutoMutex lock(mLock);
+    PlaybackThread *thread = checkPlaybackThread_l(output);
+    if (thread == nullptr) {
+        return BAD_VALUE;
+    }
+    return thread->getSupportedLatencyModes(modes);
 }
 
 status_t AudioFlinger::setStreamMute(audio_stream_type_t stream, bool muted)