DeviceDescriptorBase parcels to media::AudioPort

It has been determined that all of the subclasses of AudioPort need to
be parceled into media::AudioPort rather than having their own type,
similar to how they correspond to the audio_port_v7 struct.

Test: Audio-related CTS tests from CtsMediaTestCases
Change-Id: I971d9dec990ae7d065a74952f63fa9cb7fed236c
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 6d175d5..fa67898 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -314,7 +314,6 @@
         "aidl/android/media/AudioUniqueIdUse.aidl",
         "aidl/android/media/AudioUsage.aidl",
         "aidl/android/media/AudioUuid.aidl",
-        "aidl/android/media/DeviceDescriptorBase.aidl",
         "aidl/android/media/EffectDescriptor.aidl",
     ],
     imports: [
diff --git a/media/libaudioclient/aidl/android/media/DeviceDescriptorBase.aidl b/media/libaudioclient/aidl/android/media/DeviceDescriptorBase.aidl
deleted file mode 100644
index aa0f149..0000000
--- a/media/libaudioclient/aidl/android/media/DeviceDescriptorBase.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.media.AudioPort;
-import android.media.AudioPortConfig;
-import android.media.AudioDevice;
-
-/**
- * {@hide}
- */
-parcelable DeviceDescriptorBase {
-    AudioPort port;
-    AudioPortConfig portConfig;
-    AudioDevice device;
-    /** Bitmask, indexed by AudioEncapsulationMode. */
-    int encapsulationModes;
-    /** Bitmask, indexed by AudioEncapsulationMetadataType. */
-    int encapsulationMetadataTypes;
-}
diff --git a/media/libaudioclient/aidl/android/media/OpenOutputRequest.aidl b/media/libaudioclient/aidl/android/media/OpenOutputRequest.aidl
index 4518adb..06b12e9 100644
--- a/media/libaudioclient/aidl/android/media/OpenOutputRequest.aidl
+++ b/media/libaudioclient/aidl/android/media/OpenOutputRequest.aidl
@@ -17,7 +17,7 @@
 package android.media;
 
 import android.media.AudioConfig;
-import android.media.DeviceDescriptorBase;
+import android.media.AudioPort;
 
 /**
  * {@hide}
@@ -26,7 +26,8 @@
     /** Interpreted as audio_module_handle_t. */
     int module;
     AudioConfig config;
-    DeviceDescriptorBase device;
+    /** Type must be DEVICE. */
+    AudioPort device;
     /** Bitmask, indexed by AudioOutputFlag. */
     int flags;
 }
diff --git a/media/libaudiofoundation/DeviceDescriptorBase.cpp b/media/libaudiofoundation/DeviceDescriptorBase.cpp
index 6261559..a3e9589 100644
--- a/media/libaudiofoundation/DeviceDescriptorBase.cpp
+++ b/media/libaudiofoundation/DeviceDescriptorBase.cpp
@@ -159,41 +159,49 @@
 
 status_t DeviceDescriptorBase::writeToParcel(Parcel *parcel) const
 {
-    media::DeviceDescriptorBase parcelable;
+    media::AudioPort parcelable;
     return writeToParcelable(&parcelable)
         ?: parcelable.writeToParcel(parcel);
 }
 
-status_t DeviceDescriptorBase::writeToParcelable(media::DeviceDescriptorBase* parcelable) const {
-    AudioPort::writeToParcelable(&parcelable->port);
-    AudioPortConfig::writeToParcelable(&parcelable->portConfig);
-    parcelable->device = VALUE_OR_RETURN_STATUS(
-            legacy2aidl_AudioDeviceTypeAddress(mDeviceTypeAddr));
-    parcelable->encapsulationModes = VALUE_OR_RETURN_STATUS(
+status_t DeviceDescriptorBase::writeToParcelable(media::AudioPort* parcelable) const {
+    AudioPort::writeToParcelable(parcelable);
+    AudioPortConfig::writeToParcelable(&parcelable->activeConfig);
+    parcelable->id = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(mId));
+
+    media::AudioPortDeviceExt ext;
+    ext.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(mDeviceTypeAddr));
+    ext.encapsulationModes = VALUE_OR_RETURN_STATUS(
             legacy2aidl_AudioEncapsulationMode_mask(mEncapsulationModes));
-    parcelable->encapsulationMetadataTypes = VALUE_OR_RETURN_STATUS(
+    ext.encapsulationMetadataTypes = VALUE_OR_RETURN_STATUS(
             legacy2aidl_AudioEncapsulationMetadataType_mask(mEncapsulationMetadataTypes));
+    UNION_SET(parcelable->ext, device, std::move(ext));
     return OK;
 }
 
 status_t DeviceDescriptorBase::readFromParcel(const Parcel *parcel) {
-    media::DeviceDescriptorBase parcelable;
+    media::AudioPort parcelable;
     return parcelable.readFromParcel(parcel)
         ?: readFromParcelable(parcelable);
 }
 
-status_t DeviceDescriptorBase::readFromParcelable(const media::DeviceDescriptorBase& parcelable) {
-    status_t status = AudioPort::readFromParcelable(parcelable.port)
-                      ?: AudioPortConfig::readFromParcelable(parcelable.portConfig);
+status_t DeviceDescriptorBase::readFromParcelable(const media::AudioPort& parcelable) {
+    if (parcelable.type != media::AudioPortType::DEVICE) {
+        return BAD_VALUE;
+    }
+    status_t status = AudioPort::readFromParcelable(parcelable)
+                      ?: AudioPortConfig::readFromParcelable(parcelable.activeConfig);
     if (status != OK) {
         return status;
     }
+
+    media::AudioPortDeviceExt ext = VALUE_OR_RETURN_STATUS(UNION_GET(parcelable.ext, device));
     mDeviceTypeAddr = VALUE_OR_RETURN_STATUS(
-            aidl2legacy_AudioDeviceTypeAddress(parcelable.device));
+            aidl2legacy_AudioDeviceTypeAddress(ext.device));
     mEncapsulationModes = VALUE_OR_RETURN_STATUS(
-            aidl2legacy_AudioEncapsulationMode_mask(parcelable.encapsulationModes));
+            aidl2legacy_AudioEncapsulationMode_mask(ext.encapsulationModes));
     mEncapsulationMetadataTypes = VALUE_OR_RETURN_STATUS(
-            aidl2legacy_AudioEncapsulationMetadataType_mask(parcelable.encapsulationMetadataTypes));
+            aidl2legacy_AudioEncapsulationMetadataType_mask(ext.encapsulationMetadataTypes));
     return OK;
 }
 
@@ -219,7 +227,7 @@
 }
 
 ConversionResult<sp<DeviceDescriptorBase>>
-aidl2legacy_DeviceDescriptorBase(const media::DeviceDescriptorBase& aidl) {
+aidl2legacy_DeviceDescriptorBase(const media::AudioPort& aidl) {
     sp<DeviceDescriptorBase> result = new DeviceDescriptorBase(AUDIO_DEVICE_NONE);
     status_t status = result->readFromParcelable(aidl);
     if (status != OK) {
@@ -228,9 +236,9 @@
     return result;
 }
 
-ConversionResult<media::DeviceDescriptorBase>
+ConversionResult<media::AudioPort>
 legacy2aidl_DeviceDescriptorBase(const sp<DeviceDescriptorBase>& legacy) {
-    media::DeviceDescriptorBase aidl;
+    media::AudioPort aidl;
     status_t status = legacy->writeToParcelable(&aidl);
     if (status != OK) {
         return base::unexpected(status);
diff --git a/media/libaudiofoundation/include/media/DeviceDescriptorBase.h b/media/libaudiofoundation/include/media/DeviceDescriptorBase.h
index 8a920b7..140ce36 100644
--- a/media/libaudiofoundation/include/media/DeviceDescriptorBase.h
+++ b/media/libaudiofoundation/include/media/DeviceDescriptorBase.h
@@ -18,7 +18,7 @@
 
 #include <vector>
 
-#include <android/media/DeviceDescriptorBase.h>
+#include <android/media/AudioPort.h>
 #include <binder/Parcel.h>
 #include <binder/Parcelable.h>
 #include <media/AudioContainers.h>
@@ -77,8 +77,8 @@
     status_t writeToParcel(Parcel* parcel) const override;
     status_t readFromParcel(const Parcel* parcel) override;
 
-    status_t writeToParcelable(media::DeviceDescriptorBase* parcelable) const;
-    status_t readFromParcelable(const media::DeviceDescriptorBase& parcelable);
+    status_t writeToParcelable(media::AudioPort* parcelable) const;
+    status_t readFromParcelable(const media::AudioPort& parcelable);
 
 protected:
     AudioDeviceTypeAddr mDeviceTypeAddr;
@@ -113,8 +113,8 @@
 
 // Conversion routines, according to AidlConversion.h conventions.
 ConversionResult<sp<DeviceDescriptorBase>>
-aidl2legacy_DeviceDescriptorBase(const media::DeviceDescriptorBase& aidl);
-ConversionResult<media::DeviceDescriptorBase>
+aidl2legacy_DeviceDescriptorBase(const media::AudioPort& aidl);
+ConversionResult<media::AudioPort>
 legacy2aidl_DeviceDescriptorBase(const sp<DeviceDescriptorBase>& legacy);
 
 } // namespace android