libaudiohal: Implement stream opening

Implement DeviceHalAidl::open{Input|Output}Stream,
DeviceHalAidl::{create|release}AudioPatch,
StreamHalAidl::getAudioProperties.

Bug: 205884982
Test: boot cuttlefish with AIDL enabled
Change-Id: I535c302dd791d4c002883ac73efc71ad0f39a83f
diff --git a/media/libaudiohal/impl/StreamHalAidl.cpp b/media/libaudiohal/impl/StreamHalAidl.cpp
index 1c6a014..2b7856b 100644
--- a/media/libaudiohal/impl/StreamHalAidl.cpp
+++ b/media/libaudiohal/impl/StreamHalAidl.cpp
@@ -46,10 +46,11 @@
 }
 
 StreamHalAidl::StreamHalAidl(
-        std::string_view className, bool isInput, const StreamDescriptor& descriptor,
-        const std::shared_ptr<IStreamCommon>& stream)
+        std::string_view className, bool isInput, const audio_config& config,
+        const StreamDescriptor& descriptor, const std::shared_ptr<IStreamCommon>& stream)
         : ConversionHelperAidl(className),
           mIsInput(isInput),
+          mConfig(configToBase(config)),
           mFrameSizeBytes(descriptor.frameSizeBytes),
           mBufferSizeFrames(descriptor.bufferSizeFrames),
           mCommandMQ(new CommandMQ(descriptor.command)),
@@ -76,7 +77,7 @@
     if (size == nullptr) {
         return BAD_VALUE;
     }
-    if (mFrameSizeBytes == 0 || mBufferSizeFrames == 0) {
+    if (mFrameSizeBytes == 0 || mBufferSizeFrames == 0 || !mStream) {
         return NO_INIT;
     }
     *size = mFrameSizeBytes * mBufferSizeFrames;
@@ -87,13 +88,8 @@
     if (configBase == nullptr) {
         return BAD_VALUE;
     }
-    TIME_CHECK();
-    *configBase = AUDIO_CONFIG_BASE_INITIALIZER;
-    configBase->sample_rate = 48000;
-    configBase->format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
-    configBase->channel_mask = mIsInput ? AUDIO_CHANNEL_IN_STEREO : AUDIO_CHANNEL_OUT_STEREO;
-    // if (!mStream) return NO_INIT;
-    ALOGE("%s not implemented yet", __func__);
+    if (!mStream) return NO_INIT;
+    *configBase = mConfig;
     return OK;
 }
 
@@ -116,7 +112,7 @@
     if (size == nullptr) {
         return BAD_VALUE;
     }
-    if (mFrameSizeBytes == 0) {
+    if (mFrameSizeBytes == 0 || !mStream) {
         return NO_INIT;
     }
     *size = mFrameSizeBytes;
@@ -140,6 +136,9 @@
 status_t StreamHalAidl::standby() {
     TIME_CHECK();
     if (!mStream) return NO_INIT;
+    if (mState == StreamDescriptor::State::STANDBY) {
+        return OK;
+    }
     ALOGE("%s not implemented yet", __func__);
     return OK;
 }
@@ -180,7 +179,7 @@
 }
 
 status_t StreamHalAidl::setHalThreadPriority(int priority __unused) {
-    mHalThreadPriority = priority;
+    // Obsolete, must be done by the HAL module.
     return OK;
 }
 
@@ -192,12 +191,8 @@
 }
 
 bool StreamHalAidl::requestHalThreadPriority(pid_t threadPid __unused, pid_t threadId __unused) {
-    if (mHalThreadPriority == HAL_THREAD_PRIORITY_DEFAULT) {
-        return true;
-    }
-    if (!mStream) return NO_INIT;
-    ALOGE("%s not implemented yet", __func__);
-    return OK;
+    // Obsolete, must be done by the HAL module.
+    return true;
 }
 
 status_t StreamHalAidl::legacyCreateAudioPatch(const struct audio_port_config& port __unused,
@@ -244,8 +239,10 @@
 }  // namespace
 
 StreamOutHalAidl::StreamOutHalAidl(
+        const audio_config& config,
         const StreamDescriptor& descriptor, const std::shared_ptr<IStreamOut>& stream)
-        : StreamHalAidl("StreamOutHalAidl", false /*isInput*/, descriptor, getStreamCommon(stream)),
+        : StreamHalAidl("StreamOutHalAidl", false /*isInput*/, config,
+                descriptor, getStreamCommon(stream)),
           mStream(stream) {}
 
 status_t StreamOutHalAidl::getLatency(uint32_t *latency) {
@@ -360,34 +357,55 @@
 }
 
 status_t StreamOutHalAidl::getDualMonoMode(audio_dual_mono_mode_t* mode __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamOutHalAidl::setDualMonoMode(audio_dual_mono_mode_t mode __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamOutHalAidl::getAudioDescriptionMixLevel(float* leveldB __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamOutHalAidl::setAudioDescriptionMixLevel(float leveldB __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamOutHalAidl::getPlaybackRateParameters(
         audio_playback_rate_t* playbackRate __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamOutHalAidl::setPlaybackRateParameters(
         const audio_playback_rate_t& playbackRate __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamOutHalAidl::setEventCallback(
         const sp<StreamOutHalInterfaceEventCallback>& callback __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 namespace {
@@ -401,17 +419,26 @@
 }  // namespace
 
 status_t StreamOutHalAidl::setLatencyMode(audio_latency_mode_t mode __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 };
 
 status_t StreamOutHalAidl::getRecommendedLatencyModes(
         std::vector<audio_latency_mode_t> *modes __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 };
 
 status_t StreamOutHalAidl::setLatencyModeCallback(
         const sp<StreamOutHalInterfaceLatencyModeCallback>& callback __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 };
 
 void StreamOutHalAidl::onWriteReady() {
@@ -458,8 +485,10 @@
 }
 
 StreamInHalAidl::StreamInHalAidl(
+        const audio_config& config,
         const StreamDescriptor& descriptor, const std::shared_ptr<IStreamIn>& stream)
-        : StreamHalAidl("StreamInHalAidl", true /*isInput*/, descriptor, getStreamCommon(stream)),
+        : StreamHalAidl("StreamInHalAidl", true /*isInput*/, config,
+                descriptor, getStreamCommon(stream)),
           mStream(stream) {}
 
 status_t StreamInHalAidl::setGain(float gain __unused) {
@@ -494,24 +523,33 @@
 
 status_t StreamInHalAidl::getActiveMicrophones(
         std::vector<media::MicrophoneInfo> *microphones __unused) {
-    if (mStream == 0) return NO_INIT;
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamInHalAidl::updateSinkMetadata(
         const StreamInHalInterface::SinkMetadata& sinkMetadata  __unused) {
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamInHalAidl::setPreferredMicrophoneDirection(
             audio_microphone_direction_t direction __unused) {
-    if (mStream == 0) return NO_INIT;
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 status_t StreamInHalAidl::setPreferredMicrophoneFieldDimension(float zoom __unused) {
-    if (mStream == 0) return NO_INIT;
-    return INVALID_OPERATION;
+    TIME_CHECK();
+    if (!mStream) return NO_INIT;
+    ALOGE("%s not implemented yet", __func__);
+    return OK;
 }
 
 } // namespace android