1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <memory> 20*ec779b8eSAndroid Build Coastguard Worker #include <map> 21*ec779b8eSAndroid Build Coastguard Worker #include <set> 22*ec779b8eSAndroid Build Coastguard Worker #include <utility> 23*ec779b8eSAndroid Build Coastguard Worker #include <vector> 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/core/IModule.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionUtil.h> 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker #include "Cleanups.h" 29*ec779b8eSAndroid Build Coastguard Worker #include "ConversionHelperAidl.h" 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace android { 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker class Hal2AidlMapper; 34*ec779b8eSAndroid Build Coastguard Worker class StreamHalInterface; 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker // The mapper class is needed because the framework was not yet updated to operate on AIDL-based 37*ec779b8eSAndroid Build Coastguard Worker // structures directly. Mapper does the job of translating the "legacy" way of identifying ports 38*ec779b8eSAndroid Build Coastguard Worker // and port configs (by device addresses and I/O handles) into AIDL IDs. Once the framework will 39*ec779b8eSAndroid Build Coastguard Worker // be updated to provide these IDs directly to libaudiohal, the need for the mapper will cease. 40*ec779b8eSAndroid Build Coastguard Worker // 41*ec779b8eSAndroid Build Coastguard Worker // Note that unlike DeviceHalInterface, which sometimes allows a method to return an error, 42*ec779b8eSAndroid Build Coastguard Worker // but still consider some of the outputs to be valid (for example, in 'open{Input|Output}Stream'), 43*ec779b8eSAndroid Build Coastguard Worker // 'Hal2AidlMapper' follows the Binder convention. It means that if a method returns an error, 44*ec779b8eSAndroid Build Coastguard Worker // the outputs may not be initialized at all and should not be considered by the caller. 45*ec779b8eSAndroid Build Coastguard Worker class Hal2AidlMapper : public ConversionHelperAidl { 46*ec779b8eSAndroid Build Coastguard Worker public: 47*ec779b8eSAndroid Build Coastguard Worker using Cleanups = Cleanups<Hal2AidlMapper>; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker Hal2AidlMapper( 50*ec779b8eSAndroid Build Coastguard Worker const std::string& instance, 51*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IModule>& module); 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker void addStream(const sp<StreamHalInterface>& stream, int32_t mixPortConfigId, int32_t patchId); 54*ec779b8eSAndroid Build Coastguard Worker status_t createOrUpdatePatch( 55*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::media::audio::common::AudioPortConfig>& sources, 56*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::media::audio::common::AudioPortConfig>& sinks, 57*ec779b8eSAndroid Build Coastguard Worker int32_t* patchId, Cleanups* cleanups); 58*ec779b8eSAndroid Build Coastguard Worker status_t findPortConfig( 59*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioDevice& device, 60*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* portConfig); 61*ec779b8eSAndroid Build Coastguard Worker status_t getAudioMixPort( 62*ec779b8eSAndroid Build Coastguard Worker int32_t ioHandle, ::aidl::android::media::audio::common::AudioPort* port); 63*ec779b8eSAndroid Build Coastguard Worker status_t getAudioPortCached( 64*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioDevice& device, 65*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPort* port); 66*ec779b8eSAndroid Build Coastguard Worker template<typename OutputContainer, typename Func> getAudioPorts(OutputContainer * ports,Func converter)67*ec779b8eSAndroid Build Coastguard Worker status_t getAudioPorts(OutputContainer* ports, Func converter) { 68*ec779b8eSAndroid Build Coastguard Worker return ::aidl::android::convertContainer(mPorts, ports, 69*ec779b8eSAndroid Build Coastguard Worker [&converter](const auto& pair) { return converter(pair.second); }); 70*ec779b8eSAndroid Build Coastguard Worker } 71*ec779b8eSAndroid Build Coastguard Worker template<typename OutputContainer, typename Func> getAudioRoutes(OutputContainer * routes,Func converter)72*ec779b8eSAndroid Build Coastguard Worker status_t getAudioRoutes(OutputContainer* routes, Func converter) { 73*ec779b8eSAndroid Build Coastguard Worker return ::aidl::android::convertContainer(mRoutes, routes, converter); 74*ec779b8eSAndroid Build Coastguard Worker } 75*ec779b8eSAndroid Build Coastguard Worker status_t initialize(); 76*ec779b8eSAndroid Build Coastguard Worker status_t prepareToDisconnectExternalDevice( 77*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPort& devicePort); 78*ec779b8eSAndroid Build Coastguard Worker // If the resulting 'mixPortConfig->id' is 0, that means the stream was not created, 79*ec779b8eSAndroid Build Coastguard Worker // and 'config' is a suggested config. 80*ec779b8eSAndroid Build Coastguard Worker status_t prepareToOpenStream( 81*ec779b8eSAndroid Build Coastguard Worker int32_t ioHandle, 82*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioDevice& device, 83*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioIoFlags& flags, 84*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioSource source, 85*ec779b8eSAndroid Build Coastguard Worker Cleanups* cleanups, 86*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioConfig* config, 87*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* mixPortConfig, 88*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::AudioPatch* patch); 89*ec779b8eSAndroid Build Coastguard Worker status_t setPortConfig( 90*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig, 91*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& destinationPortIds, 92*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* portConfig, 93*ec779b8eSAndroid Build Coastguard Worker Cleanups* cleanups = nullptr); 94*ec779b8eSAndroid Build Coastguard Worker status_t releaseAudioPatch(int32_t patchId); 95*ec779b8eSAndroid Build Coastguard Worker void resetUnusedPatchesAndPortConfigs(); 96*ec779b8eSAndroid Build Coastguard Worker status_t setDevicePortConnectedState( 97*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPort& devicePort, bool connected); 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker // Methods to work with FwkPatches. eraseFwkPatch(int32_t fwkPatchId)100*ec779b8eSAndroid Build Coastguard Worker void eraseFwkPatch(int32_t fwkPatchId) { mFwkPatches.erase(fwkPatchId); } findFwkPatch(int32_t fwkPatchId)101*ec779b8eSAndroid Build Coastguard Worker int32_t findFwkPatch(int32_t fwkPatchId) { 102*ec779b8eSAndroid Build Coastguard Worker const auto it = mFwkPatches.find(fwkPatchId); 103*ec779b8eSAndroid Build Coastguard Worker return it != mFwkPatches.end() ? it->second : 0; 104*ec779b8eSAndroid Build Coastguard Worker } updateFwkPatch(int32_t fwkPatchId,int32_t halPatchId)105*ec779b8eSAndroid Build Coastguard Worker void updateFwkPatch(int32_t fwkPatchId, int32_t halPatchId) { 106*ec779b8eSAndroid Build Coastguard Worker mFwkPatches[fwkPatchId] = halPatchId; 107*ec779b8eSAndroid Build Coastguard Worker } 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker private: 110*ec779b8eSAndroid Build Coastguard Worker // 'FwkPatches' is used to store patches that diverge from the framework's state. 111*ec779b8eSAndroid Build Coastguard Worker // Uses framework patch ID (aka audio_patch_handle_t) values for indexing. 112*ec779b8eSAndroid Build Coastguard Worker // When the 'key == value', that means Hal2AidlMapper has removed this patch, and it is absent 113*ec779b8eSAndroid Build Coastguard Worker // from 'mPatches', but it still "exists" for the framework. It will either remove it or 114*ec779b8eSAndroid Build Coastguard Worker // re-patch. If the framework re-patches, it will continue to use the same patch handle, 115*ec779b8eSAndroid Build Coastguard Worker // but the HAL will use the new one (since the old patch was reset), thus 'key != value' 116*ec779b8eSAndroid Build Coastguard Worker // for such patches. Since they "exist" both for the framework and the HAL, 'mPatches' 117*ec779b8eSAndroid Build Coastguard Worker // contains their data under HAL patch ID ('value' of 'FwkPatches'). 118*ec779b8eSAndroid Build Coastguard Worker // To avoid confusion, all patchIDs used by Hal2AidlMapper are HAL IDs. Mapping between 119*ec779b8eSAndroid Build Coastguard Worker // framework patch IDs and HAL patch IDs is done by DeviceHalAidl. 120*ec779b8eSAndroid Build Coastguard Worker using FwkPatches = std::map<int32_t /*audio_patch_handle_t*/, int32_t /*patch ID*/>; 121*ec779b8eSAndroid Build Coastguard Worker using Patches = std::map<int32_t /*patch ID*/, 122*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::AudioPatch>; 123*ec779b8eSAndroid Build Coastguard Worker using PortConfigs = std::map<int32_t /*port config ID*/, 124*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig>; 125*ec779b8eSAndroid Build Coastguard Worker using Ports = std::map<int32_t /*port ID*/, ::aidl::android::media::audio::common::AudioPort>; 126*ec779b8eSAndroid Build Coastguard Worker using Routes = std::vector<::aidl::android::hardware::audio::core::AudioRoute>; 127*ec779b8eSAndroid Build Coastguard Worker // Answers the question "whether portID 'first' is reachable from portID 'second'?" 128*ec779b8eSAndroid Build Coastguard Worker // It's not a map because both portIDs are known. The matrix is symmetric. 129*ec779b8eSAndroid Build Coastguard Worker using RoutingMatrix = std::set<std::pair<int32_t, int32_t>>; 130*ec779b8eSAndroid Build Coastguard Worker // There is always a mix port config ID set. The patch ID is set after stream 131*ec779b8eSAndroid Build Coastguard Worker // creation, and can be set to '-1' later if the framework happens to create 132*ec779b8eSAndroid Build Coastguard Worker // a patch between the same endpoints. In that case, the ownership of the patch 133*ec779b8eSAndroid Build Coastguard Worker // is on the framework. 134*ec779b8eSAndroid Build Coastguard Worker using Streams = std::map<wp<StreamHalInterface>, 135*ec779b8eSAndroid Build Coastguard Worker std::pair<int32_t /*mix port config ID*/, int32_t /*patch ID*/>>; 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker enum PatchMatch { MATCH_SOURCES, MATCH_SINKS, MATCH_BOTH }; 138*ec779b8eSAndroid Build Coastguard Worker 139*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IModule> mModule; 140*ec779b8eSAndroid Build Coastguard Worker 141*ec779b8eSAndroid Build Coastguard Worker bool audioDeviceMatches(const ::aidl::android::media::audio::common::AudioDevice& device, 142*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPort& p); 143*ec779b8eSAndroid Build Coastguard Worker bool audioDeviceMatches(const ::aidl::android::media::audio::common::AudioDevice& device, 144*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPortConfig& p); 145*ec779b8eSAndroid Build Coastguard Worker // If the 'result->id' is 0, that means, the config was not created/updated, 146*ec779b8eSAndroid Build Coastguard Worker // and the 'result' is a suggestion from the HAL. 147*ec779b8eSAndroid Build Coastguard Worker status_t createOrUpdatePortConfig( 148*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig, 149*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* result, bool *created); 150*ec779b8eSAndroid Build Coastguard Worker status_t createOrUpdatePortConfigRetry( 151*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig, 152*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* result, bool *created); 153*ec779b8eSAndroid Build Coastguard Worker void eraseConnectedPort(int32_t portId); 154*ec779b8eSAndroid Build Coastguard Worker status_t findOrCreatePatch( 155*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& sourcePortConfigIds, 156*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& sinkPortConfigIds, 157*ec779b8eSAndroid Build Coastguard Worker PatchMatch match, 158*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::AudioPatch* patch, bool* created); 159*ec779b8eSAndroid Build Coastguard Worker status_t findOrCreatePatch( 160*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::AudioPatch& requestedPatch, 161*ec779b8eSAndroid Build Coastguard Worker PatchMatch match, 162*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::AudioPatch* patch, bool* created); 163*ec779b8eSAndroid Build Coastguard Worker status_t findOrCreateDevicePortConfig( 164*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioDevice& device, 165*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioConfig* config, 166*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioGainConfig* gainConfig, 167*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* portConfig, 168*ec779b8eSAndroid Build Coastguard Worker bool* created); 169*ec779b8eSAndroid Build Coastguard Worker // If the resulting 'portConfig->id' is 0, that means the config was not created, 170*ec779b8eSAndroid Build Coastguard Worker // and 'portConfig' is a suggested config. 171*ec779b8eSAndroid Build Coastguard Worker status_t findOrCreateMixPortConfig( 172*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioConfig& config, 173*ec779b8eSAndroid Build Coastguard Worker const std::optional<::aidl::android::media::audio::common::AudioIoFlags>& flags, 174*ec779b8eSAndroid Build Coastguard Worker int32_t ioHandle, 175*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioSource source, 176*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& destinationPortIds, 177*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* portConfig, bool* created); 178*ec779b8eSAndroid Build Coastguard Worker status_t findOrCreatePortConfig( 179*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioPortConfig& requestedPortConfig, 180*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& destinationPortIds, 181*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* portConfig, bool* created); 182*ec779b8eSAndroid Build Coastguard Worker Patches::iterator findPatch(const std::set<int32_t>& sourcePortConfigIds, 183*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& sinkPortConfigIds, PatchMatch match); 184*ec779b8eSAndroid Build Coastguard Worker Ports::iterator findPort(const ::aidl::android::media::audio::common::AudioDevice& device); 185*ec779b8eSAndroid Build Coastguard Worker Ports::iterator findPort( 186*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioConfig& config, 187*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioIoFlags& flags, 188*ec779b8eSAndroid Build Coastguard Worker const std::set<int32_t>& destinationPortIds); 189*ec779b8eSAndroid Build Coastguard Worker PortConfigs::iterator findPortConfig( 190*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioDevice& device); 191*ec779b8eSAndroid Build Coastguard Worker PortConfigs::iterator findPortConfig( 192*ec779b8eSAndroid Build Coastguard Worker const std::optional<::aidl::android::media::audio::common::AudioConfig>& config, 193*ec779b8eSAndroid Build Coastguard Worker const std::optional<::aidl::android::media::audio::common::AudioIoFlags>& flags, 194*ec779b8eSAndroid Build Coastguard Worker int32_t ioHandle); 195*ec779b8eSAndroid Build Coastguard Worker std::set<int32_t> getPatchIdsByPortId(int32_t portId); 196*ec779b8eSAndroid Build Coastguard Worker status_t prepareToOpenStreamHelper( 197*ec779b8eSAndroid Build Coastguard Worker int32_t ioHandle, int32_t devicePortId, int32_t devicePortConfigId, 198*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioIoFlags& flags, 199*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioSource source, 200*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::media::audio::common::AudioConfig& initialConfig, 201*ec779b8eSAndroid Build Coastguard Worker Cleanups* cleanups, ::aidl::android::media::audio::common::AudioConfig* config, 202*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::media::audio::common::AudioPortConfig* mixPortConfig, 203*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::AudioPatch* patch); portConfigBelongsToPort(int32_t portConfigId,int32_t portId)204*ec779b8eSAndroid Build Coastguard Worker bool portConfigBelongsToPort(int32_t portConfigId, int32_t portId) { 205*ec779b8eSAndroid Build Coastguard Worker auto it = mPortConfigs.find(portConfigId); 206*ec779b8eSAndroid Build Coastguard Worker return it != mPortConfigs.end() && it->second.portId == portId; 207*ec779b8eSAndroid Build Coastguard Worker } 208*ec779b8eSAndroid Build Coastguard Worker status_t releaseAudioPatch(Patches::iterator it); 209*ec779b8eSAndroid Build Coastguard Worker status_t releaseAudioPatches(const std::set<int32_t>& patchIds); resetPatch(int32_t patchId)210*ec779b8eSAndroid Build Coastguard Worker void resetPatch(int32_t patchId) { (void)releaseAudioPatch(patchId); } 211*ec779b8eSAndroid Build Coastguard Worker void resetPortConfig(int32_t portConfigId); 212*ec779b8eSAndroid Build Coastguard Worker void resetUnusedPortConfigs(); 213*ec779b8eSAndroid Build Coastguard Worker status_t updateAudioPort( 214*ec779b8eSAndroid Build Coastguard Worker int32_t portId, ::aidl::android::media::audio::common::AudioPort* port); 215*ec779b8eSAndroid Build Coastguard Worker status_t updateRoutes(); 216*ec779b8eSAndroid Build Coastguard Worker void updateDynamicMixPorts(); 217*ec779b8eSAndroid Build Coastguard Worker 218*ec779b8eSAndroid Build Coastguard Worker Ports mPorts; 219*ec779b8eSAndroid Build Coastguard Worker // Remote submix "template" ports (no address specified, no profiles). 220*ec779b8eSAndroid Build Coastguard Worker // They are excluded from `mPorts` as their presence confuses the framework code. 221*ec779b8eSAndroid Build Coastguard Worker std::optional<::aidl::android::media::audio::common::AudioPort> mRemoteSubmixIn; 222*ec779b8eSAndroid Build Coastguard Worker std::optional<::aidl::android::media::audio::common::AudioPort> mRemoteSubmixOut; 223*ec779b8eSAndroid Build Coastguard Worker int32_t mDefaultInputPortId = -1; 224*ec779b8eSAndroid Build Coastguard Worker int32_t mDefaultOutputPortId = -1; 225*ec779b8eSAndroid Build Coastguard Worker FwkPatches mFwkPatches; 226*ec779b8eSAndroid Build Coastguard Worker PortConfigs mPortConfigs; 227*ec779b8eSAndroid Build Coastguard Worker std::set<int32_t> mInitialPortConfigIds; 228*ec779b8eSAndroid Build Coastguard Worker Patches mPatches; 229*ec779b8eSAndroid Build Coastguard Worker Routes mRoutes; 230*ec779b8eSAndroid Build Coastguard Worker RoutingMatrix mRoutingMatrix; 231*ec779b8eSAndroid Build Coastguard Worker Streams mStreams; 232*ec779b8eSAndroid Build Coastguard Worker std::set<int32_t> mConnectedPorts; 233*ec779b8eSAndroid Build Coastguard Worker std::pair<int32_t, ::aidl::android::media::audio::common::AudioPort> 234*ec779b8eSAndroid Build Coastguard Worker mDisconnectedPortReplacement; 235*ec779b8eSAndroid Build Coastguard Worker std::set<int32_t> mDynamicMixPortIds; 236*ec779b8eSAndroid Build Coastguard Worker }; 237*ec779b8eSAndroid Build Coastguard Worker 238*ec779b8eSAndroid Build Coastguard Worker } // namespace android 239