1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ST_ROUTER_BASE_H 17 #define ST_ROUTER_BASE_H 18 19 #include "audio_system_manager.h" 20 #include "audio_device_manager.h" 21 #include "audio_policy_manager_factory.h" 22 #include "audio_policy_log.h" 23 24 namespace OHOS { 25 namespace AudioStandard { 26 class RouterBase { 27 public: 28 std::string name_; 29 IAudioPolicyInterface& audioPolicyManager_; RouterBase()30 RouterBase() : audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()) {} ~RouterBase()31 virtual ~RouterBase() {}; 32 33 virtual std::unique_ptr<AudioDeviceDescriptor> GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID) = 0; 34 virtual std::unique_ptr<AudioDeviceDescriptor> GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID) = 0; 35 virtual std::unique_ptr<AudioDeviceDescriptor> GetCallCaptureDevice(SourceType sourceType, int32_t clientUID) = 0; 36 virtual vector<std::unique_ptr<AudioDeviceDescriptor>> GetRingRenderDevices(StreamUsage streamUsage, 37 int32_t clientUID) = 0; 38 virtual std::unique_ptr<AudioDeviceDescriptor> GetRecordCaptureDevice(SourceType sourceType, int32_t clientUID) = 0; 39 virtual std::unique_ptr<AudioDeviceDescriptor> GetToneRenderDevice(StreamUsage streamUsage, int32_t clientUID) = 0; 40 virtual RouterType GetRouterType() = 0; 41 GetClassName()42 virtual std::string GetClassName() 43 { 44 return name_; 45 } GetLatestConnectDeivce(std::vector<std::unique_ptr<AudioDeviceDescriptor>> & descs)46 std::unique_ptr<AudioDeviceDescriptor> GetLatestConnectDeivce( 47 std::vector<std::unique_ptr<AudioDeviceDescriptor>> &descs) 48 { 49 // remove abnormal device 50 for (size_t i = 0; i < descs.size(); i++) { 51 if (descs[i]->exceptionFlag_ || !descs[i]->isEnable_ || 52 (descs[i]->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && descs[i]->connectState_ == SUSPEND_CONNECTED)) { 53 descs.erase(descs.begin() + i); 54 i--; 55 } 56 } 57 if (descs.size() > 0) { 58 auto compare = [&] (std::unique_ptr<AudioDeviceDescriptor> &desc1, 59 std::unique_ptr<AudioDeviceDescriptor> &desc2) { 60 return desc1->connectTimeStamp_ < desc2->connectTimeStamp_; 61 }; 62 sort(descs.begin(), descs.end(), compare); 63 return std::move(descs.back()); 64 } 65 return std::make_unique<AudioDeviceDescriptor>(); 66 } 67 GetPairCaptureDevice(std::unique_ptr<AudioDeviceDescriptor> & desc,std::vector<std::unique_ptr<AudioDeviceDescriptor>> & captureDescs)68 std::unique_ptr<AudioDeviceDescriptor> GetPairCaptureDevice(std::unique_ptr<AudioDeviceDescriptor> &desc, 69 std::vector<std::unique_ptr<AudioDeviceDescriptor>> &captureDescs) 70 { 71 for (auto &captureDesc : captureDescs) { 72 if (captureDesc->deviceRole_ != desc->deviceRole_ 73 || captureDesc->deviceType_ != desc->deviceType_ 74 || captureDesc->networkId_ != desc->networkId_ 75 || captureDesc->macAddress_ != desc->macAddress_) { 76 continue; 77 } 78 if (!captureDesc->exceptionFlag_ && captureDesc->isEnable_ && 79 (captureDesc->deviceType_ != DEVICE_TYPE_BLUETOOTH_SCO || 80 captureDesc->connectState_ != SUSPEND_CONNECTED)) { 81 return std::move(captureDesc); 82 } 83 AUDIO_WARNING_LOG("unavailable device state, type[%{public}d] connectState[%{public}d] " \ 84 "isEnable[%{public}d] exceptionFlag[%{public}d]", captureDesc->deviceType_, 85 captureDesc->connectState_, captureDesc->isEnable_, captureDesc->exceptionFlag_); 86 } 87 return std::make_unique<AudioDeviceDescriptor>(); 88 } 89 }; 90 } // namespace AudioStandard 91 } // namespace OHOS 92 93 #endif // ST_ROUTER_BASE_H