• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioDeviceCommon"
17 #endif
18 
19 #include "audio_device_common.h"
20 #include "parameter.h"
21 #include "parameters.h"
22 #include "audio_inner_call.h"
23 #include "media_monitor_manager.h"
24 #include "audio_spatialization_manager.h"
25 #include "audio_spatialization_service.h"
26 #include "common/hdi_adapter_info.h"
27 
28 #include "audio_server_proxy.h"
29 #include "audio_policy_utils.h"
30 #include "audio_recovery_device.h"
31 
32 namespace OHOS {
33 namespace AudioStandard {
34 
35 static const int64_t WAIT_MODEM_CALL_SET_VOLUME_TIME_US = 120000; // 120ms
36 static const int64_t OLD_DEVICE_UNAVALIABLE_MUTE_MS = 1000000; // 1s
37 static const int64_t NEW_DEVICE_AVALIABLE_MUTE_MS = 400000; // 400ms
38 static const int64_t NEW_DEVICE_AVALIABLE_OFFLOAD_MUTE_MS = 1000000; // 1s
39 static const int64_t NEW_DEVICE_REMOTE_CAST_AVALIABLE_MUTE_MS = 300000; // 300ms
40 static const int64_t SELECT_DEVICE_MUTE_MS = 200000; // 200ms
41 static const int64_t SELECT_OFFLOAD_DEVICE_MUTE_MS = 400000; // 400ms
42 static const int64_t OLD_DEVICE_UNAVALIABLE_MUTE_SLEEP_MS = 150000; // 150ms
43 static const int64_t OLD_DEVICE_UNAVALIABLE_EXT_MUTE_MS = 300000; // 300ms
44 static const int64_t DISTRIBUTED_DEVICE_UNAVALIABLE_MUTE_MS = 1500000;  // 1.5s
45 static const uint32_t BT_BUFFER_ADJUSTMENT_FACTOR = 50;
46 static const int VOLUME_LEVEL_DEFAULT_SIZE = 3;
47 static const int32_t DISTRIBUTED_DEVICE = 1003;
48 
GetEncryptAddr(const std::string & addr)49 static std::string GetEncryptAddr(const std::string &addr)
50 {
51     const int32_t START_POS = 6;
52     const int32_t END_POS = 13;
53     const int32_t ADDRESS_STR_LEN = 17;
54     if (addr.empty() || addr.length() != ADDRESS_STR_LEN) {
55         return std::string("");
56     }
57     std::string tmp = "**:**:**:**:**:**";
58     std::string out = addr;
59     for (int i = START_POS; i <= END_POS; i++) {
60         out[i] = tmp[i];
61     }
62     return out;
63 }
64 
PrintSourceOutput(SourceOutput sourceOutput)65 inline std::string PrintSourceOutput(SourceOutput sourceOutput)
66 {
67     std::stringstream value;
68     value << "streamId:[" << sourceOutput.streamId << "] ";
69     value << "streamType:[" << sourceOutput.streamType << "] ";
70     value << "uid:[" << sourceOutput.uid << "] ";
71     value << "pid:[" << sourceOutput.pid << "] ";
72     value << "statusMark:[" << sourceOutput.statusMark << "] ";
73     value << "deviceSourceId:[" << sourceOutput.deviceSourceId << "] ";
74     value << "startTime:[" << sourceOutput.startTime << "]";
75     return value.str();
76 }
77 
78 static const std::vector<std::string> SourceNames = {
79     std::string(PRIMARY_MIC),
80     std::string(BLUETOOTH_MIC),
81     std::string(USB_MIC),
82     std::string(PRIMARY_WAKEUP),
83     std::string(FILE_SOURCE)
84 };
85 
Init(std::shared_ptr<AudioPolicyServerHandler> handler)86 void AudioDeviceCommon::Init(std::shared_ptr<AudioPolicyServerHandler> handler)
87 {
88     audioPolicyServerHandler_ = handler;
89 }
90 
DeInit()91 void AudioDeviceCommon::DeInit()
92 {
93     audioPolicyServerHandler_ = nullptr;
94 }
95 
IsRingerOrAlarmerDualDevicesRange(const InternalDeviceType & deviceType)96 bool AudioDeviceCommon::IsRingerOrAlarmerDualDevicesRange(const InternalDeviceType &deviceType)
97 {
98     switch (deviceType) {
99         case DEVICE_TYPE_SPEAKER:
100         case DEVICE_TYPE_WIRED_HEADSET:
101         case DEVICE_TYPE_WIRED_HEADPHONES:
102         case DEVICE_TYPE_BLUETOOTH_SCO:
103         case DEVICE_TYPE_BLUETOOTH_A2DP:
104         case DEVICE_TYPE_USB_HEADSET:
105         case DEVICE_TYPE_USB_ARM_HEADSET:
106         case DEVICE_TYPE_REMOTE_CAST:
107             return true;
108         default:
109             return false;
110     }
111 }
112 
OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptor & deviceDescriptor)113 void AudioDeviceCommon::OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptor& deviceDescriptor)
114 {
115     Trace trace("AudioDeviceCommon::OnPreferredOutputDeviceUpdated:" + std::to_string(deviceDescriptor.deviceType_));
116     AUDIO_INFO_LOG("Start");
117 
118     if (audioPolicyServerHandler_ != nullptr) {
119         audioPolicyServerHandler_->SendPreferredOutputDeviceUpdated();
120     }
121     spatialDeviceMap_.insert(make_pair(deviceDescriptor.macAddress_, deviceDescriptor.deviceType_));
122 
123     if (deviceDescriptor.macAddress_ !=
124         AudioSpatializationService::GetAudioSpatializationService().GetCurrentDeviceAddress()) {
125         AudioServerProxy::GetInstance().UpdateEffectBtOffloadSupportedProxy(false);
126     }
127     AudioPolicyUtils::GetInstance().UpdateEffectDefaultSink(deviceDescriptor.deviceType_);
128     AudioSpatializationService::GetAudioSpatializationService().UpdateCurrentDevice(deviceDescriptor.macAddress_);
129 }
130 
OnAudioSceneChange(const AudioScene & audioScene)131 void AudioDeviceCommon::OnAudioSceneChange(const AudioScene& audioScene)
132 {
133     Trace trace("AudioDeviceCommon::OnAudioSceneChange:" + std::to_string(audioScene));
134     AUDIO_INFO_LOG("Start");
135     if (audioPolicyServerHandler_ != nullptr) {
136         audioPolicyServerHandler_->SendAudioSceneChangeEvent(audioScene);
137     }
138 }
139 
OnPreferredInputDeviceUpdated(DeviceType deviceType,std::string networkId)140 void AudioDeviceCommon::OnPreferredInputDeviceUpdated(DeviceType deviceType, std::string networkId)
141 {
142     AUDIO_INFO_LOG("Start");
143 
144     if (audioPolicyServerHandler_ != nullptr) {
145         audioPolicyServerHandler_->SendPreferredInputDeviceUpdated();
146     }
147 }
148 
GetPreferredOutputDeviceDescInner(AudioRendererInfo & rendererInfo,std::string networkId)149 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioDeviceCommon::GetPreferredOutputDeviceDescInner(
150     AudioRendererInfo &rendererInfo, std::string networkId)
151 {
152     std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceList = {};
153     if (rendererInfo.streamUsage <= STREAM_USAGE_UNKNOWN ||
154         rendererInfo.streamUsage > STREAM_USAGE_MAX) {
155         AUDIO_WARNING_LOG("Invalid usage[%{public}d], return current device.", rendererInfo.streamUsage);
156         std::shared_ptr<AudioDeviceDescriptor> devDesc =
157             std::make_shared<AudioDeviceDescriptor>(audioActiveDevice_.GetCurrentOutputDevice());
158         deviceList.push_back(devDesc);
159         return deviceList;
160     }
161     if (networkId == LOCAL_NETWORK_ID) {
162         vector<std::shared_ptr<AudioDeviceDescriptor>> descs =
163             audioRouterCenter_.FetchOutputDevices(rendererInfo.streamUsage, -1);
164         for (size_t i = 0; i < descs.size(); i++) {
165             std::shared_ptr<AudioDeviceDescriptor> devDesc = std::make_shared<AudioDeviceDescriptor>(*descs[i]);
166             deviceList.push_back(devDesc);
167         }
168     } else {
169         vector<shared_ptr<AudioDeviceDescriptor>> descs = audioDeviceManager_.GetRemoteRenderDevices();
170         for (const auto &desc : descs) {
171             std::shared_ptr<AudioDeviceDescriptor> devDesc = std::make_shared<AudioDeviceDescriptor>(*desc);
172             deviceList.push_back(devDesc);
173         }
174     }
175 
176     return deviceList;
177 }
178 
GetPreferredInputDeviceDescInner(AudioCapturerInfo & captureInfo,std::string networkId)179 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioDeviceCommon::GetPreferredInputDeviceDescInner(
180     AudioCapturerInfo &captureInfo, std::string networkId)
181 {
182     std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceList = {};
183     if (captureInfo.sourceType <= SOURCE_TYPE_INVALID ||
184         captureInfo.sourceType > SOURCE_TYPE_MAX) {
185         std::shared_ptr<AudioDeviceDescriptor> devDesc =
186             std::make_shared<AudioDeviceDescriptor>(audioActiveDevice_.GetCurrentInputDevice());
187         deviceList.push_back(devDesc);
188         return deviceList;
189     }
190 
191     if (captureInfo.sourceType == SOURCE_TYPE_WAKEUP) {
192         std::shared_ptr<AudioDeviceDescriptor> devDesc =
193             std::make_shared<AudioDeviceDescriptor>(DEVICE_TYPE_MIC, INPUT_DEVICE);
194         devDesc->networkId_ = LOCAL_NETWORK_ID;
195         deviceList.push_back(devDesc);
196         return deviceList;
197     }
198 
199     if (networkId == LOCAL_NETWORK_ID) {
200         std::shared_ptr<AudioDeviceDescriptor> desc = audioRouterCenter_.FetchInputDevice(captureInfo.sourceType, -1);
201         if (desc->deviceType_ == DEVICE_TYPE_NONE && (captureInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE ||
202             captureInfo.sourceType == SOURCE_TYPE_REMOTE_CAST)) {
203             desc->deviceType_ = DEVICE_TYPE_INVALID;
204             desc->deviceRole_ = INPUT_DEVICE;
205         }
206         std::shared_ptr<AudioDeviceDescriptor> devDesc = std::make_shared<AudioDeviceDescriptor>(*desc);
207         deviceList.push_back(devDesc);
208     } else {
209         vector<shared_ptr<AudioDeviceDescriptor>> descs = audioDeviceManager_.GetRemoteCaptureDevices();
210         for (const auto &desc : descs) {
211             std::shared_ptr<AudioDeviceDescriptor> devDesc = std::make_shared<AudioDeviceDescriptor>(*desc);
212             deviceList.push_back(devDesc);
213         }
214     }
215 
216     return deviceList;
217 }
218 
GetPreferredOutputStreamTypeInner(StreamUsage streamUsage,DeviceType deviceType,int32_t flags,std::string & networkId,AudioSamplingRate & samplingRate)219 int32_t AudioDeviceCommon::GetPreferredOutputStreamTypeInner(StreamUsage streamUsage, DeviceType deviceType,
220     int32_t flags, std::string &networkId, AudioSamplingRate &samplingRate)
221 {
222     AUDIO_INFO_LOG("Device type: %{public}d, stream usage: %{public}d, flag: %{public}d",
223         deviceType, streamUsage, flags);
224     std::string sinkPortName = AudioPolicyUtils::GetInstance().GetSinkPortName(deviceType);
225     if (streamUsage == STREAM_USAGE_VOICE_COMMUNICATION || streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION) {
226         // Avoid two voip stream existing
227         if (streamCollector_.HasVoipRendererStream()) {
228             AUDIO_WARNING_LOG("Voip Change To Normal");
229             return AUDIO_FLAG_NORMAL;
230         }
231 
232         // VoIP stream. Need to judge whether it is fast or direct mode.
233         int32_t flag = audioConfigManager_.GetVoipRendererFlag(sinkPortName, networkId, samplingRate);
234         if (flag == AUDIO_FLAG_VOIP_FAST || flag == AUDIO_FLAG_VOIP_DIRECT) {
235             return flag;
236         }
237     }
238     if (!audioConfigManager_.GetAdapterInfoFlag()) {
239         return AUDIO_FLAG_NORMAL;
240     }
241     AudioAdapterInfo adapterInfo;
242     bool ret = audioConfigManager_.GetAdapterInfoByType(static_cast<AdaptersType>(
243         AudioPolicyUtils::portStrToEnum[sinkPortName]), adapterInfo);
244     if (!ret) {
245         AUDIO_ERR_LOG("Invalid adapter");
246         return AUDIO_FLAG_NORMAL;
247     }
248 
249     AudioPipeDeviceInfo* deviceInfo = adapterInfo.GetDeviceInfoByDeviceType(deviceType);
250     CHECK_AND_RETURN_RET_LOG(deviceInfo != nullptr, AUDIO_FLAG_NORMAL, "Device type is not supported");
251     for (auto &supportPipe : deviceInfo->supportPipes_) {
252         PipeInfo* pipeInfo = adapterInfo.GetPipeByName(supportPipe);
253         if (pipeInfo == nullptr) {
254             continue;
255         }
256         if (flags == AUDIO_FLAG_MMAP && pipeInfo->audioFlag_ == AUDIO_FLAG_MMAP) {
257             return AUDIO_FLAG_MMAP;
258         }
259         if (flags == AUDIO_FLAG_VOIP_FAST && pipeInfo->audioUsage_ == AUDIO_USAGE_VOIP &&
260             pipeInfo->audioFlag_ == AUDIO_FLAG_MMAP) {
261             return AUDIO_FLAG_VOIP_FAST;
262         }
263     }
264     return AUDIO_FLAG_NORMAL;
265 }
266 
GetPreferredInputStreamTypeInner(SourceType sourceType,DeviceType deviceType,int32_t flags,const std::string & networkId,const AudioSamplingRate & samplingRate)267 int32_t AudioDeviceCommon::GetPreferredInputStreamTypeInner(SourceType sourceType, DeviceType deviceType,
268     int32_t flags, const std::string &networkId, const AudioSamplingRate &samplingRate)
269 {
270     AUDIO_INFO_LOG("Device type: %{public}d, source type: %{public}d, flag: %{public}d",
271         deviceType, sourceType, flags);
272 
273     std::string sourcePortName = AudioPolicyUtils::GetInstance().GetSourcePortName(deviceType);
274     if (sourceType == SOURCE_TYPE_VOICE_COMMUNICATION &&
275         (sourcePortName == PRIMARY_MIC && networkId == LOCAL_NETWORK_ID)) {
276         if (audioConfigManager_.GetVoipConfig() && (samplingRate == SAMPLE_RATE_48000
277             || samplingRate == SAMPLE_RATE_16000)) {
278             // Avoid voip stream existing with other
279             if (streamCollector_.ChangeVoipCapturerStreamToNormal()) {
280                 AUDIO_WARNING_LOG("Voip Change To Normal");
281                 return AUDIO_FLAG_NORMAL;
282             }
283             return AUDIO_FLAG_VOIP_FAST;
284         }
285         return AUDIO_FLAG_NORMAL;
286     }
287     if (!audioConfigManager_.GetAdapterInfoFlag()) {
288         return AUDIO_FLAG_NORMAL;
289     }
290     AudioAdapterInfo adapterInfo;
291     bool ret = audioConfigManager_.GetAdapterInfoByType(static_cast<AdaptersType>(
292         AudioPolicyUtils::portStrToEnum[sourcePortName]), adapterInfo);
293     if (!ret) {
294         AUDIO_ERR_LOG("Invalid adapter");
295         return AUDIO_FLAG_NORMAL;
296     }
297 
298     AudioPipeDeviceInfo* deviceInfo = adapterInfo.GetDeviceInfoByDeviceType(deviceType);
299     CHECK_AND_RETURN_RET_LOG(deviceInfo != nullptr, AUDIO_FLAG_NORMAL, "Device type is not supported");
300     for (auto &supportPipe : deviceInfo->supportPipes_) {
301         PipeInfo* pipeInfo = adapterInfo.GetPipeByName(supportPipe);
302         if (pipeInfo == nullptr) {
303             continue;
304         }
305         if (flags == AUDIO_FLAG_MMAP && pipeInfo->audioFlag_ == AUDIO_FLAG_MMAP) {
306             return AUDIO_FLAG_MMAP;
307         }
308         if (flags == AUDIO_FLAG_VOIP_FAST && pipeInfo->audioUsage_ == AUDIO_USAGE_VOIP &&
309             pipeInfo->audioFlag_ == AUDIO_FLAG_MMAP) {
310             // Avoid voip stream existing with other
311             if (streamCollector_.ChangeVoipCapturerStreamToNormal()) {
312                 AUDIO_WARNING_LOG("Voip Change To Normal By DeviceInfo");
313                 return AUDIO_FLAG_NORMAL;
314             }
315             return AUDIO_FLAG_VOIP_FAST;
316         }
317     }
318     return AUDIO_FLAG_NORMAL;
319 }
320 
UpdateDeviceInfo(AudioDeviceDescriptor & deviceInfo,const std::shared_ptr<AudioDeviceDescriptor> & desc,bool hasBTPermission,bool hasSystemPermission)321 void AudioDeviceCommon::UpdateDeviceInfo(AudioDeviceDescriptor &deviceInfo,
322     const std::shared_ptr<AudioDeviceDescriptor> &desc,
323     bool hasBTPermission, bool hasSystemPermission)
324 {
325     deviceInfo.deviceType_ = desc->deviceType_;
326     deviceInfo.deviceRole_ = desc->deviceRole_;
327     deviceInfo.deviceId_ = desc->deviceId_;
328     deviceInfo.channelMasks_ = desc->channelMasks_;
329     deviceInfo.channelIndexMasks_ = desc->channelIndexMasks_;
330     deviceInfo.displayName_ = desc->displayName_;
331     deviceInfo.connectState_ = desc->connectState_;
332 
333     if (deviceInfo.deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP) {
334         deviceInfo.a2dpOffloadFlag_ = audioA2dpOffloadFlag_.GetA2dpOffloadFlag();
335     }
336 
337     if (hasBTPermission) {
338         deviceInfo.deviceName_ = desc->deviceName_;
339         deviceInfo.macAddress_ = desc->macAddress_;
340         deviceInfo.deviceCategory_ = desc->deviceCategory_;
341     } else {
342         deviceInfo.deviceName_ = "";
343         deviceInfo.macAddress_ = "";
344         deviceInfo.deviceCategory_ = CATEGORY_DEFAULT;
345     }
346 
347     deviceInfo.isLowLatencyDevice_ = HasLowLatencyCapability(deviceInfo.deviceType_,
348         desc->networkId_ != LOCAL_NETWORK_ID);
349 
350     if (hasSystemPermission) {
351         deviceInfo.networkId_ = desc->networkId_;
352         deviceInfo.volumeGroupId_ = desc->volumeGroupId_;
353         deviceInfo.interruptGroupId_ = desc->interruptGroupId_;
354     } else {
355         deviceInfo.networkId_ = "";
356         deviceInfo.volumeGroupId_ = GROUP_ID_NONE;
357         deviceInfo.interruptGroupId_ = GROUP_ID_NONE;
358     }
359     deviceInfo.audioStreamInfo_.samplingRate = desc->audioStreamInfo_.samplingRate;
360     deviceInfo.audioStreamInfo_.encoding = desc->audioStreamInfo_.encoding;
361     deviceInfo.audioStreamInfo_.format = desc->audioStreamInfo_.format;
362     deviceInfo.audioStreamInfo_.channels = desc->audioStreamInfo_.channels;
363 }
364 
DeviceParamsCheck(DeviceRole targetRole,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors) const365 int32_t AudioDeviceCommon::DeviceParamsCheck(DeviceRole targetRole,
366     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors) const
367 {
368     size_t targetSize = audioDeviceDescriptors.size();
369     CHECK_AND_RETURN_RET_LOG(targetSize == 1, ERR_INVALID_OPERATION,
370         "Device error: size[%{public}zu]", targetSize);
371 
372     bool isDeviceTypeCorrect = false;
373     if (targetRole == DeviceRole::OUTPUT_DEVICE) {
374         isDeviceTypeCorrect = IsOutputDevice(audioDeviceDescriptors[0]->deviceType_,
375             audioDeviceDescriptors[0]->deviceRole_) && IsDeviceConnected(audioDeviceDescriptors[0]);
376     } else if (targetRole == DeviceRole::INPUT_DEVICE) {
377         isDeviceTypeCorrect = IsInputDevice(audioDeviceDescriptors[0]->deviceType_,
378             audioDeviceDescriptors[0]->deviceRole_) && IsDeviceConnected(audioDeviceDescriptors[0]);
379     }
380 
381     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->deviceRole_ == targetRole && isDeviceTypeCorrect,
382         ERR_INVALID_OPERATION, "Device error: size[%{public}zu] deviceRole[%{public}d] isDeviceCorrect[%{public}d]",
383         targetSize, static_cast<int32_t>(audioDeviceDescriptors[0]->deviceRole_), isDeviceTypeCorrect);
384     return SUCCESS;
385 }
386 
UpdateConnectedDevicesWhenConnecting(const AudioDeviceDescriptor & updatedDesc,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descForCb)387 void AudioDeviceCommon::UpdateConnectedDevicesWhenConnecting(const AudioDeviceDescriptor &updatedDesc,
388     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descForCb)
389 {
390     AUDIO_INFO_LOG("UpdateConnectedDevicesWhenConnecting In, deviceType: %{public}d", updatedDesc.deviceType_);
391     if (IsOutputDevice(updatedDesc.deviceType_, updatedDesc.deviceRole_)) {
392         UpdateConnectedDevicesWhenConnectingForOutputDevice(updatedDesc, descForCb);
393     }
394     if (IsInputDevice(updatedDesc.deviceType_, updatedDesc.deviceRole_)) {
395         UpdateConnectedDevicesWhenConnectingForInputDevice(updatedDesc, descForCb);
396     }
397 }
398 
RemoveOfflineDevice(const AudioDeviceDescriptor & updatedDesc)399 void AudioDeviceCommon::RemoveOfflineDevice(const AudioDeviceDescriptor& updatedDesc)
400 {
401     if (IsOutputDevice(updatedDesc.deviceType_, updatedDesc.deviceRole_)) {
402         audioAffinityManager_.RemoveOfflineRendererDevice(updatedDesc);
403     }
404     if (IsInputDevice(updatedDesc.deviceType_, updatedDesc.deviceRole_)) {
405         audioAffinityManager_.RemoveOfflineCapturerDevice(updatedDesc);
406     }
407 }
408 
UpdateConnectedDevicesWhenDisconnecting(const AudioDeviceDescriptor & updatedDesc,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descForCb)409 void AudioDeviceCommon::UpdateConnectedDevicesWhenDisconnecting(const AudioDeviceDescriptor& updatedDesc,
410     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descForCb)
411 {
412     RemoveOfflineDevice(updatedDesc);
413     AUDIO_INFO_LOG("[%{public}s], devType:[%{public}d]", __func__, updatedDesc.deviceType_);
414 
415     // Remember the disconnected device descriptor and remove it
416     audioDeviceManager_.GetAllConnectedDeviceByType(updatedDesc.networkId_, updatedDesc.deviceType_,
417         updatedDesc.macAddress_, updatedDesc.deviceRole_, descForCb);
418     for (const auto& desc : descForCb) {
419         if (desc->deviceType_ == DEVICE_TYPE_DP) { hasDpDevice_ = false; }
420         if (audioStateManager_.GetPreferredMediaRenderDevice() != nullptr &&
421             desc->IsSameDeviceDesc(*audioStateManager_.GetPreferredMediaRenderDevice())) {
422             AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_MEDIA_RENDER,
423                 std::make_shared<AudioDeviceDescriptor>());
424         }
425         if (audioStateManager_.GetPreferredCallRenderDevice() != nullptr &&
426             desc->IsSameDeviceDesc(*audioStateManager_.GetPreferredCallRenderDevice())) {
427             AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_CALL_RENDER,
428                 std::make_shared<AudioDeviceDescriptor>(), CLEAR_UID, "UpdateConnectedDevicesWhenDisconnecting");
429         }
430         if (audioStateManager_.GetPreferredCallCaptureDevice() != nullptr &&
431             desc->IsSameDeviceDesc(*audioStateManager_.GetPreferredCallCaptureDevice())) {
432             AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_CALL_CAPTURE,
433                 std::make_shared<AudioDeviceDescriptor>());
434         }
435         if (audioStateManager_.GetPreferredRecordCaptureDevice() != nullptr &&
436             desc->IsSameDeviceDesc(*audioStateManager_.GetPreferredRecordCaptureDevice())) {
437             AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_RECORD_CAPTURE,
438                 std::make_shared<AudioDeviceDescriptor>());
439         }
440     }
441 
442     AudioPolicyUtils::GetInstance().UnexcludeOutputDevices(descForCb);
443 
444     audioConnectedDevice_.DelConnectedDevice(updatedDesc.networkId_, updatedDesc.deviceType_,
445         updatedDesc.macAddress_, updatedDesc.deviceRole_);
446 
447     // reset disconnected device info in stream
448     if (IsOutputDevice(updatedDesc.deviceType_, updatedDesc.deviceRole_)) {
449         streamCollector_.ResetRendererStreamDeviceInfo(updatedDesc);
450     }
451     if (IsInputDevice(updatedDesc.deviceType_, updatedDesc.deviceRole_)) {
452         streamCollector_.ResetCapturerStreamDeviceInfo(updatedDesc);
453     }
454 
455     std::shared_ptr<AudioDeviceDescriptor> devDesc = std::make_shared<AudioDeviceDescriptor>(updatedDesc);
456     CHECK_AND_RETURN_LOG(devDesc != nullptr, "Create device descriptor failed");
457     audioDeviceManager_.RemoveNewDevice(devDesc);
458     audioMicrophoneDescriptor_.RemoveMicrophoneDescriptor(devDesc);
459     if (updatedDesc.deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP &&
460         audioActiveDevice_.GetCurrentOutputDeviceMacAddr() == updatedDesc.macAddress_) {
461         audioA2dpOffloadFlag_.SetA2dpOffloadFlag(NO_A2DP_DEVICE);
462     }
463 }
464 
UpdateConnectedDevicesWhenConnectingForOutputDevice(const AudioDeviceDescriptor & updatedDesc,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descForCb)465 void AudioDeviceCommon::UpdateConnectedDevicesWhenConnectingForOutputDevice(
466     const AudioDeviceDescriptor &updatedDesc, std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descForCb)
467 {
468     std::shared_ptr<AudioDeviceDescriptor> audioDescriptor = std::make_shared<AudioDeviceDescriptor>(updatedDesc);
469     audioDescriptor->deviceRole_ = OUTPUT_DEVICE;
470     // Use speaker streaminfo for all output devices cap
471     auto itr = audioConnectedDevice_.GetConnectedDeviceByType(DEVICE_TYPE_SPEAKER);
472     if (itr != nullptr) {
473         audioDescriptor->SetDeviceCapability(itr->audioStreamInfo_, 0);
474     }
475     bool wasVirtualConnected = audioDeviceManager_.IsVirtualConnectedDevice(audioDescriptor);
476     if (!wasVirtualConnected) {
477         audioDescriptor->deviceId_ = AudioPolicyUtils::startDeviceId++;
478     } else {
479         audioDeviceManager_.UpdateDeviceDescDeviceId(audioDescriptor);
480         CheckAndNotifyUserSelectedDevice(audioDescriptor);
481         audioDeviceManager_.UpdateVirtualDevices(audioDescriptor, true);
482     }
483     descForCb.push_back(audioDescriptor);
484     AudioPolicyUtils::GetInstance().UpdateDisplayName(audioDescriptor);
485     audioConnectedDevice_.AddConnectedDevice(audioDescriptor);
486     audioDeviceManager_.AddNewDevice(audioDescriptor);
487 
488     if (updatedDesc.connectState_ == VIRTUAL_CONNECTED) {
489         AUDIO_INFO_LOG("The device is virtual device, no need to update preferred device");
490         return; // No need to update preferred device for virtual device
491     }
492     DeviceUsage usage = audioDeviceManager_.GetDeviceUsage(updatedDesc);
493     if (audioDescriptor->networkId_ == LOCAL_NETWORK_ID && audioDescriptor->IsSameDeviceDesc(
494         audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_MEDIA, -1,
495         ROUTER_TYPE_USER_SELECT).front()) && (usage & MEDIA) == MEDIA) {
496         AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_MEDIA_RENDER,
497             std::make_shared<AudioDeviceDescriptor>());
498     }
499     if (audioDescriptor->networkId_ == LOCAL_NETWORK_ID && audioDescriptor->IsSameDeviceDesc(
500         audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_VOICE_COMMUNICATION, -1,
501         ROUTER_TYPE_USER_SELECT).front()) && (usage & VOICE) == VOICE) {
502         AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_CALL_RENDER,
503             std::make_shared<AudioDeviceDescriptor>(), CLEAR_UID,
504             "UpdateConnectedDevicesWhenConnectingForOutputDevice");
505     }
506     AudioPolicyUtils::GetInstance().UnexcludeOutputDevices(descForCb);
507 }
508 
UpdateConnectedDevicesWhenConnectingForInputDevice(const AudioDeviceDescriptor & updatedDesc,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descForCb)509 void AudioDeviceCommon::UpdateConnectedDevicesWhenConnectingForInputDevice(
510     const AudioDeviceDescriptor &updatedDesc, std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descForCb)
511 {
512     std::shared_ptr<AudioDeviceDescriptor> audioDescriptor = std::make_shared<AudioDeviceDescriptor>(updatedDesc);
513     audioDescriptor->deviceRole_ = INPUT_DEVICE;
514     // Use mic streaminfo for all input devices cap
515     auto itr = audioConnectedDevice_.GetConnectedDeviceByType(DEVICE_TYPE_MIC);
516     if (itr != nullptr) {
517         audioDescriptor->SetDeviceCapability(itr->audioStreamInfo_, 0);
518     }
519     bool wasVirtualConnected = audioDeviceManager_.IsVirtualConnectedDevice(audioDescriptor);
520     if (!wasVirtualConnected) {
521         audioDescriptor->deviceId_ = AudioPolicyUtils::startDeviceId++;
522     } else {
523         audioDeviceManager_.UpdateDeviceDescDeviceId(audioDescriptor);
524         audioDeviceManager_.UpdateVirtualDevices(audioDescriptor, true);
525     }
526     descForCb.push_back(audioDescriptor);
527     AudioPolicyUtils::GetInstance().UpdateDisplayName(audioDescriptor);
528     audioConnectedDevice_.AddConnectedDevice(audioDescriptor);
529     audioMicrophoneDescriptor_.AddMicrophoneDescriptor(audioDescriptor);
530     audioDeviceManager_.AddNewDevice(audioDescriptor);
531     if (updatedDesc.connectState_ == VIRTUAL_CONNECTED) {
532         return;
533     }
534     if (audioDescriptor->deviceCategory_ != BT_UNWEAR_HEADPHONE && audioDescriptor->deviceCategory_ != BT_WATCH) {
535         AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_CALL_CAPTURE,
536             std::make_shared<AudioDeviceDescriptor>());
537         AudioPolicyUtils::GetInstance().SetPreferredDevice(AUDIO_RECORD_CAPTURE,
538             std::make_shared<AudioDeviceDescriptor>());
539     }
540 }
541 
UpdateDualToneState(const bool & enable,const int32_t & sessionId)542 void AudioDeviceCommon::UpdateDualToneState(const bool &enable, const int32_t &sessionId)
543 {
544     AUDIO_INFO_LOG("update dual tone state, enable:%{public}d, sessionId:%{public}d", enable, sessionId);
545     enableDualHalToneState_ = enable;
546     if (enableDualHalToneState_) {
547         enableDualHalToneSessionId_ = sessionId;
548     }
549     Trace trace("AudioDeviceCommon::UpdateDualToneState sessionId:" + std::to_string(sessionId));
550     auto ret = AudioServerProxy::GetInstance().UpdateDualToneStateProxy(enable, sessionId);
551     CHECK_AND_RETURN_LOG(ret == SUCCESS, "Failed to update the dual tone state for sessionId:%{public}d", sessionId);
552 }
553 
FetchDevice(bool isOutputDevice,const AudioStreamDeviceChangeReasonExt reason)554 void AudioDeviceCommon::FetchDevice(bool isOutputDevice, const AudioStreamDeviceChangeReasonExt reason)
555 {
556     Trace trace("AudioDeviceCommon::FetchDevice reason:" + std::to_string(static_cast<int>(reason)));
557     AUDIO_DEBUG_LOG("FetchDevice start");
558 
559     if (isOutputDevice) {
560         vector<shared_ptr<AudioRendererChangeInfo>> rendererChangeInfos;
561         streamCollector_.GetCurrentRendererChangeInfos(rendererChangeInfos);
562         FetchOutputDevice(rendererChangeInfos, reason);
563     } else {
564         vector<shared_ptr<AudioCapturerChangeInfo>> capturerChangeInfos;
565         streamCollector_.GetCurrentCapturerChangeInfos(capturerChangeInfos);
566         FetchInputDevice(capturerChangeInfos, reason);
567     }
568 }
569 
IsFastFromA2dpToA2dp(const std::shared_ptr<AudioDeviceDescriptor> & desc,const std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,const AudioStreamDeviceChangeReasonExt reason)570 bool AudioDeviceCommon::IsFastFromA2dpToA2dp(const std::shared_ptr<AudioDeviceDescriptor> &desc,
571     const std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo, const AudioStreamDeviceChangeReasonExt reason)
572 {
573     if (rendererChangeInfo->outputDeviceInfo.deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP &&
574         rendererChangeInfo->rendererInfo.originalFlag == AUDIO_FLAG_MMAP &&
575         rendererChangeInfo->outputDeviceInfo.deviceId_ != desc->deviceId_) {
576         TriggerRecreateRendererStreamCallback(rendererChangeInfo->callerPid, rendererChangeInfo->sessionId,
577             AUDIO_FLAG_MMAP, reason);
578         AUDIO_INFO_LOG("Switch fast stream from a2dp to a2dp");
579         return true;
580     }
581     return false;
582 }
583 
NotifyRecreateDirectStream(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,const AudioStreamDeviceChangeReasonExt reason)584 bool AudioDeviceCommon::NotifyRecreateDirectStream(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo,
585     const AudioStreamDeviceChangeReasonExt reason)
586 {
587     AUDIO_INFO_LOG("current pipe type is:%{public}d", rendererChangeInfo->rendererInfo.pipeType);
588     if (!audioActiveDevice_.IsDirectSupportedDevice() &&
589         rendererChangeInfo->rendererInfo.pipeType == PIPE_TYPE_DIRECT_MUSIC) {
590         if (rendererChangeInfo->outputDeviceInfo.deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) {
591             AUDIO_INFO_LOG("old device is arm usb");
592             return false;
593         }
594         AUDIO_DEBUG_LOG("direct stream changed to normal.");
595         TriggerRecreateRendererStreamCallback(rendererChangeInfo->callerPid, rendererChangeInfo->sessionId,
596             AUDIO_FLAG_DIRECT, reason);
597         return true;
598     } else if (audioActiveDevice_.IsDirectSupportedDevice() &&
599         rendererChangeInfo->rendererInfo.pipeType != PIPE_TYPE_DIRECT_MUSIC) {
600         AudioRendererInfo info = rendererChangeInfo->rendererInfo;
601         if (info.streamUsage == STREAM_USAGE_MUSIC && info.rendererFlags == AUDIO_FLAG_NORMAL &&
602             info.samplingRate >= SAMPLE_RATE_48000 && info.format >= SAMPLE_S24LE) {
603             AUDIO_DEBUG_LOG("stream change to direct.");
604             TriggerRecreateRendererStreamCallback(rendererChangeInfo->callerPid, rendererChangeInfo->sessionId,
605                 AUDIO_FLAG_DIRECT, reason);
606             return true;
607         }
608     }
609     return false;
610 }
611 
SetDeviceConnectedFlagWhenFetchOutputDevice()612 void AudioDeviceCommon::SetDeviceConnectedFlagWhenFetchOutputDevice()
613 {
614     AudioDeviceDescriptor currentActiveDevice = audioActiveDevice_.GetCurrentOutputDevice();
615     if (currentActiveDevice.deviceType_ == DEVICE_TYPE_USB_HEADSET ||
616         currentActiveDevice.deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) {
617         AudioServerProxy::GetInstance().SetDeviceConnectedFlag(false);
618     }
619 }
620 
FetchOutputDevice(std::vector<std::shared_ptr<AudioRendererChangeInfo>> & rendererChangeInfos,const AudioStreamDeviceChangeReasonExt reason)621 void AudioDeviceCommon::FetchOutputDevice(std::vector<std::shared_ptr<AudioRendererChangeInfo>> &rendererChangeInfos,
622     const AudioStreamDeviceChangeReasonExt reason)
623 {
624     Trace trace("AudioDeviceCommon::FetchOutputDevice");
625     AUDIO_PRERELEASE_LOGI("Start for %{public}zu stream, connected %{public}s",
626         rendererChangeInfos.size(), audioDeviceManager_.GetConnDevicesStr().c_str());
627     bool needUpdateActiveDevice = true;
628     bool isUpdateActiveDevice = false;
629     int32_t runningStreamCount = 0;
630     bool hasDirectChangeDevice = false;
631     std::vector<SinkInput> sinkInputs;
632     audioPolicyManager_.GetAllSinkInputs(sinkInputs);
633     for (auto &rendererChangeInfo : rendererChangeInfos) {
634         if (!IsRendererStreamRunning(rendererChangeInfo) ||
635             (audioSceneManager_.GetAudioScene(true) == AUDIO_SCENE_DEFAULT &&
636             audioRouterCenter_.isCallRenderRouter(rendererChangeInfo->rendererInfo.streamUsage))) {
637             AUDIO_WARNING_LOG("stream %{public}d not running, no need fetch device", rendererChangeInfo->sessionId);
638             continue;
639         }
640         runningStreamCount++;
641         SetDeviceConnectedFlagWhenFetchOutputDevice();
642         vector<std::shared_ptr<AudioDeviceDescriptor>> descs = GetDeviceDescriptorInner(rendererChangeInfo);
643         if (HandleDeviceChangeForFetchOutputDevice(descs.front(), rendererChangeInfo) == ERR_NEED_NOT_SWITCH_DEVICE &&
644             !Util::IsRingerOrAlarmerStreamUsage(rendererChangeInfo->rendererInfo.streamUsage)) {
645             continue;
646         }
647         MuteSinkForSwitchBluetoothDevice(rendererChangeInfo, descs, reason);
648         MuteSinkForSwitchDistributedDevice(rendererChangeInfo, descs, reason);
649         std::string encryptMacAddr = GetEncryptAddr(descs.front()->macAddress_);
650         if (descs.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP) {
651             if (IsFastFromA2dpToA2dp(descs.front(), rendererChangeInfo, reason)) { continue; }
652             int32_t ret = ActivateA2dpDeviceWhenDescEnabled(descs.front(), rendererChangeInfos, reason);
653             CHECK_AND_RETURN_LOG(ret == SUCCESS, "activate a2dp [%{public}s] failed", encryptMacAddr.c_str());
654         } else if (descs.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
655             int32_t ret = HandleScoOutputDeviceFetched(descs.front(), rendererChangeInfos, reason);
656             CHECK_AND_RETURN_LOG(ret == SUCCESS, "sco [%{public}s] is not connected yet", encryptMacAddr.c_str());
657         } else if (descs.front()->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) {
658             audioEcManager_.ActivateArmDevice(descs.front()->macAddress_, descs.front()->deviceRole_);
659         }
660         if (needUpdateActiveDevice) {
661             isUpdateActiveDevice = audioActiveDevice_.UpdateDevice(descs.front(), reason, rendererChangeInfo);
662             needUpdateActiveDevice = !isUpdateActiveDevice;
663         }
664         if (!hasDirectChangeDevice && !IsSameDevice(descs.front(), rendererChangeInfo->outputDeviceInfo)
665             && NotifyRecreateDirectStream(rendererChangeInfo, reason)) {
666             hasDirectChangeDevice = true;
667         }
668         NotifyRecreateRendererStream(descs.front(), rendererChangeInfo, reason);
669         MoveToNewOutputDevice(rendererChangeInfo, descs, sinkInputs, reason);
670     }
671     FetchOutputEnd(isUpdateActiveDevice, runningStreamCount);
672 }
673 
GetDeviceDescriptorInner(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo)674 vector<std::shared_ptr<AudioDeviceDescriptor>> AudioDeviceCommon::GetDeviceDescriptorInner(
675     std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo)
676 {
677     vector<std::shared_ptr<AudioDeviceDescriptor>> descs;
678     if (VolumeUtils::IsPCVolumeEnable() && !isFirstScreenOn_) {
679         descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
680     } else {
681         descs = audioRouterCenter_.FetchOutputDevices(rendererChangeInfo->rendererInfo.streamUsage,
682             rendererChangeInfo->clientUID);
683     }
684     return descs;
685 }
686 
FetchOutputEnd(const bool isUpdateActiveDevice,const int32_t runningStreamCount)687 void AudioDeviceCommon::FetchOutputEnd(const bool isUpdateActiveDevice, const int32_t runningStreamCount)
688 {
689     if (isUpdateActiveDevice) {
690         OnPreferredOutputDeviceUpdated(audioActiveDevice_.GetCurrentOutputDevice());
691     }
692     if (runningStreamCount == 0) {
693         FetchOutputDeviceWhenNoRunningStream();
694     }
695 }
696 
FetchOutputDeviceWhenNoRunningStream()697 void AudioDeviceCommon::FetchOutputDeviceWhenNoRunningStream()
698 {
699     vector<std::shared_ptr<AudioDeviceDescriptor>> descs =
700         audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_MEDIA, -1);
701     CHECK_AND_RETURN_LOG(!descs.empty(), "descs is empty");
702     AudioDeviceDescriptor tmpOutputDeviceDesc = audioActiveDevice_.GetCurrentOutputDevice();
703     if (descs.front()->deviceType_ == DEVICE_TYPE_NONE || IsSameDevice(descs.front(), tmpOutputDeviceDesc)) {
704         AUDIO_DEBUG_LOG("output device is not change");
705         return;
706     }
707     audioActiveDevice_.SetCurrentOutputDevice(*descs.front());
708     AUDIO_DEBUG_LOG("currentActiveDevice update %{public}d", audioActiveDevice_.GetCurrentOutputDeviceType());
709     audioVolumeManager_.SetVolumeForSwitchDevice(descs.front()->deviceType_);
710     if (descs.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP) {
711         SwitchActiveA2dpDevice(std::make_shared<AudioDeviceDescriptor>(*descs.front()));
712     }
713     OnPreferredOutputDeviceUpdated(audioActiveDevice_.GetCurrentOutputDevice());
714 }
715 
HandleDeviceChangeForFetchOutputDevice(std::shared_ptr<AudioDeviceDescriptor> & desc,std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo)716 int32_t AudioDeviceCommon::HandleDeviceChangeForFetchOutputDevice(std::shared_ptr<AudioDeviceDescriptor> &desc,
717     std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo)
718 {
719     if (desc->deviceType_ == DEVICE_TYPE_NONE || (IsSameDevice(desc, rendererChangeInfo->outputDeviceInfo) &&
720         !NeedRehandleA2DPDevice(desc) && desc->connectState_ != DEACTIVE_CONNECTED &&
721         audioSceneManager_.IsSameAudioScene() && !shouldUpdateDeviceDueToDualTone_)) {
722         AUDIO_WARNING_LOG("stream %{public}d device not change, no need move device", rendererChangeInfo->sessionId);
723         AudioDeviceDescriptor tmpOutputDeviceDesc = audioActiveDevice_.GetCurrentOutputDevice();
724         std::shared_ptr<AudioDeviceDescriptor> preferredDesc =
725             audioAffinityManager_.GetRendererDevice(rendererChangeInfo->clientUID);
726         if (((preferredDesc->deviceType_ != DEVICE_TYPE_NONE) && !IsSameDevice(desc, tmpOutputDeviceDesc)
727             && desc->deviceType_ != preferredDesc->deviceType_)
728             || ((preferredDesc->deviceType_ == DEVICE_TYPE_NONE) && !IsSameDevice(desc, tmpOutputDeviceDesc))) {
729             audioActiveDevice_.SetCurrentOutputDevice(*desc);
730             DeviceType curOutputDeviceType = audioActiveDevice_.GetCurrentOutputDeviceType();
731             audioVolumeManager_.SetVolumeForSwitchDevice(curOutputDeviceType);
732             audioActiveDevice_.UpdateActiveDeviceRoute(curOutputDeviceType, DeviceFlag::OUTPUT_DEVICES_FLAG);
733             OnPreferredOutputDeviceUpdated(audioActiveDevice_.GetCurrentOutputDevice());
734         }
735         return ERR_NEED_NOT_SWITCH_DEVICE;
736     }
737     return SUCCESS;
738 }
739 
MuteSinkPortForSwitchDevice(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices,const AudioStreamDeviceChangeReasonExt reason)740 void AudioDeviceCommon::MuteSinkPortForSwitchDevice(std::shared_ptr<AudioRendererChangeInfo>& rendererChangeInfo,
741     std::vector<std::shared_ptr<AudioDeviceDescriptor>>& outputDevices, const AudioStreamDeviceChangeReasonExt reason)
742 {
743     Trace trace("AudioDeviceCommon::MuteSinkPortForSwitchDevice");
744     if (outputDevices.front()->IsSameDeviceDesc(rendererChangeInfo->outputDeviceInfo)) return;
745 
746     audioIOHandleMap_.SetMoveFinish(false);
747 
748     if (audioSceneManager_.GetAudioScene(true) == AUDIO_SCENE_PHONE_CALL &&
749         rendererChangeInfo->rendererInfo.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
750         return SetVoiceCallMuteForSwitchDevice();
751     }
752 
753     std::string oldSinkName = AudioPolicyUtils::GetInstance().GetSinkName(rendererChangeInfo->outputDeviceInfo,
754         rendererChangeInfo->sessionId);
755     std::string newSinkName = AudioPolicyUtils::GetInstance().GetSinkName(*outputDevices.front(),
756         rendererChangeInfo->sessionId);
757     if (rendererChangeInfo->rendererInfo.originalFlag == AUDIO_FLAG_VOIP_FAST) {
758         oldSinkName = (oldSinkName == PRIMARY_DIRECT_VOIP ? PRIMARY_MMAP_VOIP : oldSinkName);
759         newSinkName = (newSinkName == PRIMARY_DIRECT_VOIP ? PRIMARY_MMAP_VOIP : newSinkName);
760     }
761     AUDIO_INFO_LOG("mute sink old:[%{public}s] new:[%{public}s]", oldSinkName.c_str(), newSinkName.c_str());
762     MuteSinkPort(oldSinkName, newSinkName, reason);
763 }
764 
MuteSinkForSwitchGeneralDevice(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices,const AudioStreamDeviceChangeReasonExt reason)765 void AudioDeviceCommon::MuteSinkForSwitchGeneralDevice(std::shared_ptr<AudioRendererChangeInfo>& rendererChangeInfo,
766     std::vector<std::shared_ptr<AudioDeviceDescriptor>>& outputDevices, const AudioStreamDeviceChangeReasonExt reason)
767 {
768     if (outputDevices.front() != nullptr && (outputDevices.front()->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP &&
769         outputDevices.front()->deviceType_ != DEVICE_TYPE_BLUETOOTH_SCO)) {
770         MuteSinkPortForSwitchDevice(rendererChangeInfo, outputDevices, reason);
771     }
772 }
773 
MuteSinkForSwitchBluetoothDevice(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices,const AudioStreamDeviceChangeReasonExt reason)774 void AudioDeviceCommon::MuteSinkForSwitchBluetoothDevice(std::shared_ptr<AudioRendererChangeInfo>& rendererChangeInfo,
775     std::vector<std::shared_ptr<AudioDeviceDescriptor>>& outputDevices, const AudioStreamDeviceChangeReasonExt reason)
776 {
777     if (outputDevices.front() != nullptr && (outputDevices.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP ||
778         outputDevices.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO)) {
779         MuteSinkPortForSwitchDevice(rendererChangeInfo, outputDevices, reason);
780     }
781 }
782 
MuteSinkForSwitchDistributedDevice(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices,const AudioStreamDeviceChangeReasonExt reason)783 void AudioDeviceCommon::MuteSinkForSwitchDistributedDevice(std::shared_ptr<AudioRendererChangeInfo>& rendererChangeInfo,
784     std::vector<std::shared_ptr<AudioDeviceDescriptor>>& outputDevices, const AudioStreamDeviceChangeReasonExt reason)
785 {
786     if (outputDevices.front() != nullptr &&
787         outputDevices.front()->deviceType_ == DEVICE_TYPE_SPEAKER && reason == DISTRIBUTED_DEVICE) {
788         MuteSinkPortForSwitchDevice(rendererChangeInfo, outputDevices, reason);
789     }
790 }
791 
SetVoiceCallMuteForSwitchDevice()792 void AudioDeviceCommon::SetVoiceCallMuteForSwitchDevice()
793 {
794     Trace trace("SetVoiceMuteForSwitchDevice");
795     AudioServerProxy::GetInstance().SetVoiceVolumeProxy(0);
796 
797     AUDIO_INFO_LOG("%{public}" PRId64" us for modem call update route", WAIT_MODEM_CALL_SET_VOLUME_TIME_US);
798     usleep(WAIT_MODEM_CALL_SET_VOLUME_TIME_US);
799     // Unmute in SetVolumeForSwitchDevice after update route.
800 }
801 
IsRendererStreamRunning(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo)802 bool AudioDeviceCommon::IsRendererStreamRunning(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo)
803 {
804     StreamUsage usage = rendererChangeInfo->rendererInfo.streamUsage;
805     RendererState rendererState = rendererChangeInfo->rendererState;
806     if ((usage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION &&
807         audioSceneManager_.GetAudioScene(true) != AUDIO_SCENE_PHONE_CALL) ||
808         (usage != STREAM_USAGE_VOICE_MODEM_COMMUNICATION &&
809             (rendererState != RENDERER_RUNNING && !rendererChangeInfo->prerunningState))) {
810         return false;
811     }
812     return true;
813 }
814 
ActivateA2dpDeviceWhenDescEnabled(std::shared_ptr<AudioDeviceDescriptor> & desc,std::vector<std::shared_ptr<AudioRendererChangeInfo>> & rendererChangeInfos,const AudioStreamDeviceChangeReasonExt reason)815 int32_t AudioDeviceCommon::ActivateA2dpDeviceWhenDescEnabled(std::shared_ptr<AudioDeviceDescriptor> &desc,
816     std::vector<std::shared_ptr<AudioRendererChangeInfo>> &rendererChangeInfos,
817     const AudioStreamDeviceChangeReasonExt reason)
818 {
819     if (desc->isEnable_) {
820         AUDIO_INFO_LOG("descs front is enabled");
821         return ActivateA2dpDevice(desc, rendererChangeInfos, reason);
822     }
823     return SUCCESS;
824 }
825 
ActivateA2dpDevice(std::shared_ptr<AudioDeviceDescriptor> & desc,std::vector<std::shared_ptr<AudioRendererChangeInfo>> & rendererChangeInfos,const AudioStreamDeviceChangeReasonExt reason)826 int32_t AudioDeviceCommon::ActivateA2dpDevice(std::shared_ptr<AudioDeviceDescriptor> &desc,
827     std::vector<std::shared_ptr<AudioRendererChangeInfo>> &rendererChangeInfos,
828     const AudioStreamDeviceChangeReasonExt reason)
829 {
830     Trace trace("AudioDeviceCommon::ActivateA2dpDevice");
831     std::shared_ptr<AudioDeviceDescriptor> deviceDesc = std::make_shared<AudioDeviceDescriptor>(*desc);
832     int32_t ret = SwitchActiveA2dpDevice(deviceDesc);
833     if (ret != SUCCESS) {
834         AUDIO_ERR_LOG("Active A2DP device failed, retrigger fetch output device");
835         deviceDesc->exceptionFlag_ = true;
836         audioDeviceManager_.UpdateDevicesListInfo(deviceDesc, EXCEPTION_FLAG_UPDATE);
837         audioIOHandleMap_.NotifyUnmutePort();
838         FetchOutputDevice(rendererChangeInfos, reason);
839         return ERROR;
840     }
841     return SUCCESS;
842 }
843 
HandleScoOutputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> & desc,std::vector<std::shared_ptr<AudioRendererChangeInfo>> & rendererChangeInfos,const AudioStreamDeviceChangeReasonExt reason)844 int32_t AudioDeviceCommon::HandleScoOutputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> &desc,
845     std::vector<std::shared_ptr<AudioRendererChangeInfo>> &rendererChangeInfos,
846     const AudioStreamDeviceChangeReasonExt reason)
847 {
848     Trace trace("AudioDeviceCommon::HandleScoOutputDeviceFetched");
849 #ifdef BLUETOOTH_ENABLE
850         int32_t ret = Bluetooth::AudioHfpManager::SetActiveHfpDevice(desc->macAddress_);
851         if (ret != SUCCESS) {
852             AUDIO_ERR_LOG("Active hfp device failed, retrigger fetch output device.");
853             desc->exceptionFlag_ = true;
854             audioDeviceManager_.UpdateDevicesListInfo(
855                 std::make_shared<AudioDeviceDescriptor>(*desc), EXCEPTION_FLAG_UPDATE);
856             FetchOutputDevice(rendererChangeInfos, reason);
857             return ERROR;
858         }
859         if (desc->connectState_ == DEACTIVE_CONNECTED || !audioSceneManager_.IsSameAudioScene()) {
860             Bluetooth::AudioHfpManager::ConnectScoWithAudioScene(audioSceneManager_.GetAudioScene(true));
861             return SUCCESS;
862         }
863 #endif
864     return SUCCESS;
865 }
866 
NotifyRecreateRendererStream(std::shared_ptr<AudioDeviceDescriptor> & desc,const std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,const AudioStreamDeviceChangeReasonExt reason)867 bool AudioDeviceCommon::NotifyRecreateRendererStream(std::shared_ptr<AudioDeviceDescriptor> &desc,
868     const std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo, const AudioStreamDeviceChangeReasonExt reason)
869 {
870     AUDIO_INFO_LOG("New device type: %{public}d, current rendererFlag: %{public}d, origianl flag: %{public}d",
871         desc->deviceType_, rendererChangeInfo->rendererInfo.rendererFlags,
872         rendererChangeInfo->rendererInfo.originalFlag);
873     CHECK_AND_RETURN_RET_LOG((rendererChangeInfo->outputDeviceInfo.deviceType_ != DEVICE_TYPE_INVALID &&
874         desc->deviceType_ != DEVICE_TYPE_INVALID) || desc->deviceType_ == DEVICE_TYPE_REMOTE_CAST,
875         false, "isUpdateActiveDevice is false");
876     CHECK_AND_RETURN_RET_LOG(desc->deviceType_ != DEVICE_TYPE_REMOTE_CAST ||
877         (desc->deviceType_ == DEVICE_TYPE_REMOTE_CAST &&
878         rendererChangeInfo->rendererInfo.rendererFlags != AUDIO_FLAG_NORMAL),
879         false, "new device is remote cast and current renderer flag is normal");
880     // Switch between old and new stream as they have different hals
881     std::string oldDevicePortName
882         = AudioPolicyUtils::GetInstance().GetSinkPortName(rendererChangeInfo->outputDeviceInfo.deviceType_);
883     bool isOldDeviceLocal = rendererChangeInfo->outputDeviceInfo.networkId_ == "" ||
884         rendererChangeInfo->outputDeviceInfo.networkId_ == LOCAL_NETWORK_ID;
885     bool isNewDeviceLocal = desc->networkId_ == "" || desc->networkId_ == LOCAL_NETWORK_ID;
886     AudioScene scene = audioSceneManager_.GetAudioScene(true);
887     if (!(isOldDeviceLocal ^ isNewDeviceLocal) || scene == AUDIO_SCENE_PHONE_CALL) {
888         CHECK_AND_RETURN_RET_LOG(rendererChangeInfo->rendererInfo.originalFlag != AUDIO_FLAG_NORMAL &&
889             rendererChangeInfo->rendererInfo.originalFlag != AUDIO_FLAG_FORCED_NORMAL, false,
890             "original flag is normal");
891     }
892     if ((strcmp(oldDevicePortName.c_str(),
893         AudioPolicyUtils::GetInstance().GetSinkPortName(desc->deviceType_).c_str())) ||
894         (isOldDeviceLocal ^ isNewDeviceLocal)) {
895         int32_t streamClass = GetPreferredOutputStreamTypeInner(rendererChangeInfo->rendererInfo.streamUsage,
896             desc->deviceType_, rendererChangeInfo->rendererInfo.originalFlag, desc->networkId_,
897             rendererChangeInfo->rendererInfo.samplingRate);
898         TriggerRecreateRendererStreamCallback(rendererChangeInfo->callerPid,
899             rendererChangeInfo->sessionId, streamClass, reason);
900         return true;
901     }
902     return false;
903 }
904 
NeedRehandleA2DPDevice(std::shared_ptr<AudioDeviceDescriptor> & desc)905 bool AudioDeviceCommon::NeedRehandleA2DPDevice(std::shared_ptr<AudioDeviceDescriptor> &desc)
906 {
907     if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP
908         && audioIOHandleMap_.CheckIOHandleExist(BLUETOOTH_SPEAKER) == false) {
909         AUDIO_WARNING_LOG("A2DP module is not loaded, need rehandle");
910         return true;
911     }
912     return false;
913 }
914 
MoveToNewOutputDevice(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices,std::vector<SinkInput> sinkInputs,const AudioStreamDeviceChangeReasonExt reason)915 void AudioDeviceCommon::MoveToNewOutputDevice(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo,
916     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &outputDevices, std::vector<SinkInput> sinkInputs,
917     const AudioStreamDeviceChangeReasonExt reason)
918 {
919     Trace trace("AudioDeviceCommon::MoveToNewOutputDevice");
920     std::vector<SinkInput> targetSinkInputs = audioOffloadStream_.FilterSinkInputs(rendererChangeInfo->sessionId,
921         sinkInputs);
922 
923     bool needTriggerCallback = true;
924     if (outputDevices.front()->IsSameDeviceDesc(rendererChangeInfo->outputDeviceInfo)) {
925         needTriggerCallback = false;
926     }
927 
928     AUDIO_WARNING_LOG("move session %{public}d [%{public}d][%{public}s]-->[%{public}d][%{public}s], reason %{public}d",
929         rendererChangeInfo->sessionId, rendererChangeInfo->outputDeviceInfo.deviceType_,
930         GetEncryptAddr(rendererChangeInfo->outputDeviceInfo.macAddress_).c_str(),
931         outputDevices.front()->deviceType_, GetEncryptAddr(outputDevices.front()->macAddress_).c_str(),
932         static_cast<int>(reason));
933 
934     DeviceType oldDevice = rendererChangeInfo->outputDeviceInfo.deviceType_;
935     auto oldRendererChangeInfo = std::make_shared<AudioRendererChangeInfo>(*rendererChangeInfo.get());
936 
937     UpdateDeviceInfo(rendererChangeInfo->outputDeviceInfo,
938         std::make_shared<AudioDeviceDescriptor>(*outputDevices.front()), true, true);
939 
940     if (needTriggerCallback && audioPolicyServerHandler_) {
941         audioPolicyServerHandler_->SendRendererDeviceChangeEvent(rendererChangeInfo->callerPid,
942             rendererChangeInfo->sessionId, rendererChangeInfo->outputDeviceInfo, reason);
943     }
944     MuteSinkForSwitchGeneralDevice(oldRendererChangeInfo, outputDevices, reason);
945 
946     AudioPolicyUtils::GetInstance().UpdateEffectDefaultSink(outputDevices.front()->deviceType_);
947     // MoveSinkInputByIndexOrName
948     auto ret = (outputDevices.front()->networkId_ == LOCAL_NETWORK_ID)
949         ? MoveToLocalOutputDevice(targetSinkInputs, std::make_shared<AudioDeviceDescriptor>(*outputDevices.front()))
950         : MoveToRemoteOutputDevice(targetSinkInputs, std::make_shared<AudioDeviceDescriptor>(*outputDevices.front()));
951     if (ret != SUCCESS) {
952         AudioPolicyUtils::GetInstance().UpdateEffectDefaultSink(oldDevice);
953         AUDIO_ERR_LOG("Move sink input %{public}d to device %{public}d failed!",
954             rendererChangeInfo->sessionId, outputDevices.front()->deviceType_);
955         audioIOHandleMap_.NotifyUnmutePort();
956         return;
957     }
958 
959     if (audioConfigManager_.GetUpdateRouteSupport() && !reason.isSetAudioScene()) {
960         UpdateRoute(oldRendererChangeInfo, outputDevices);
961     }
962 
963     std::string newSinkName = AudioPolicyUtils::GetInstance().GetSinkName(*outputDevices.front(),
964         rendererChangeInfo->sessionId);
965     audioVolumeManager_.SetVolumeForSwitchDevice(outputDevices.front()->deviceType_, newSinkName);
966 
967     streamCollector_.UpdateRendererDeviceInfo(rendererChangeInfo->clientUID, rendererChangeInfo->sessionId,
968         rendererChangeInfo->outputDeviceInfo);
969     ResetOffloadAndMchMode(rendererChangeInfo, outputDevices);
970     audioIOHandleMap_.NotifyUnmutePort();
971 }
972 
MutePrimaryOrOffloadSink(const std::string & sinkName,int64_t muteTime)973 void AudioDeviceCommon::MutePrimaryOrOffloadSink(const std::string &sinkName, int64_t muteTime)
974 {
975     // fix pop when switching devices during multiple concurrent streams
976     if (sinkName == OFFLOAD_PRIMARY_SPEAKER) {
977         audioIOHandleMap_.MuteSinkPort(PRIMARY_SPEAKER, muteTime, true);
978     } else if (sinkName == PRIMARY_SPEAKER) {
979         audioIOHandleMap_.MuteSinkPort(OFFLOAD_PRIMARY_SPEAKER, muteTime, true);
980     }
981 }
982 
MuteSinkPort(const std::string & oldSinkName,const std::string & newSinkName,AudioStreamDeviceChangeReasonExt reason)983 void AudioDeviceCommon::MuteSinkPort(const std::string &oldSinkName, const std::string &newSinkName,
984     AudioStreamDeviceChangeReasonExt reason)
985 {
986     if (reason.isOverride() || reason.isSetDefaultOutputDevice()) {
987         int64_t muteTime = SELECT_DEVICE_MUTE_MS;
988         if (newSinkName == OFFLOAD_PRIMARY_SPEAKER || oldSinkName == OFFLOAD_PRIMARY_SPEAKER) {
989             muteTime = SELECT_OFFLOAD_DEVICE_MUTE_MS;
990         }
991         MutePrimaryOrOffloadSink(newSinkName, muteTime);
992         audioIOHandleMap_.MuteSinkPort(newSinkName, SELECT_DEVICE_MUTE_MS, true);
993         audioIOHandleMap_.MuteSinkPort(oldSinkName, muteTime, true);
994     } else if (reason == AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE) {
995         int64_t muteTime = NEW_DEVICE_AVALIABLE_MUTE_MS;
996         if (newSinkName == OFFLOAD_PRIMARY_SPEAKER || oldSinkName == OFFLOAD_PRIMARY_SPEAKER) {
997             muteTime = NEW_DEVICE_AVALIABLE_OFFLOAD_MUTE_MS;
998         }
999         MutePrimaryOrOffloadSink(oldSinkName, muteTime);
1000         audioIOHandleMap_.MuteSinkPort(newSinkName, NEW_DEVICE_AVALIABLE_MUTE_MS, true);
1001         audioIOHandleMap_.MuteSinkPort(oldSinkName, muteTime, true);
1002     }
1003     MuteSinkPortLogic(oldSinkName, newSinkName, reason);
1004 }
1005 
MuteSinkPortLogic(const std::string & oldSinkName,const std::string & newSinkName,AudioStreamDeviceChangeReasonExt reason)1006 void AudioDeviceCommon::MuteSinkPortLogic(const std::string &oldSinkName, const std::string &newSinkName,
1007     AudioStreamDeviceChangeReasonExt reason)
1008 {
1009     auto ringermode = audioPolicyManager_.GetRingerMode();
1010     AudioScene scene = audioSceneManager_.GetAudioScene(true);
1011     if (reason == DISTRIBUTED_DEVICE) {
1012         AUDIO_INFO_LOG("distribute device mute, reason: %{public}d", static_cast<int>(reason));
1013         int64_t muteTime = DISTRIBUTED_DEVICE_UNAVALIABLE_MUTE_MS;
1014         audioIOHandleMap_.MuteSinkPort(newSinkName, DISTRIBUTED_DEVICE_UNAVALIABLE_MUTE_MS, true);
1015         audioIOHandleMap_.MuteSinkPort(oldSinkName, muteTime, true);
1016     } else if (reason.IsOldDeviceUnavaliable() && ((scene == AUDIO_SCENE_DEFAULT) ||
1017         ((scene == AUDIO_SCENE_RINGING || scene == AUDIO_SCENE_VOICE_RINGING) &&
1018         ringermode != RINGER_MODE_NORMAL) || (scene == AUDIO_SCENE_PHONE_CHAT))) {
1019         MutePrimaryOrOffloadSink(newSinkName, OLD_DEVICE_UNAVALIABLE_MUTE_MS);
1020         audioIOHandleMap_.MuteSinkPort(newSinkName, OLD_DEVICE_UNAVALIABLE_MUTE_MS, true);
1021         usleep(OLD_DEVICE_UNAVALIABLE_MUTE_SLEEP_MS); // sleep fix data cache pop.
1022     } else if (reason.IsOldDeviceUnavaliableExt() && ((scene == AUDIO_SCENE_DEFAULT) ||
1023         ((scene == AUDIO_SCENE_RINGING || scene == AUDIO_SCENE_VOICE_RINGING) &&
1024         ringermode != RINGER_MODE_NORMAL) || (scene == AUDIO_SCENE_PHONE_CHAT))) {
1025         audioIOHandleMap_.MuteSinkPort(newSinkName, OLD_DEVICE_UNAVALIABLE_EXT_MUTE_MS, true);
1026         usleep(OLD_DEVICE_UNAVALIABLE_MUTE_SLEEP_MS); // sleep fix data cache pop.
1027     } else if (reason == AudioStreamDeviceChangeReason::UNKNOWN &&
1028         oldSinkName == REMOTE_CAST_INNER_CAPTURER_SINK_NAME) {
1029         // remote cast -> earpiece 300ms fix sound leak
1030         audioIOHandleMap_.MuteSinkPort(newSinkName, NEW_DEVICE_REMOTE_CAST_AVALIABLE_MUTE_MS, true);
1031     }
1032 }
1033 
TriggerRecreateRendererStreamCallback(int32_t callerPid,int32_t sessionId,int32_t streamFlag,const AudioStreamDeviceChangeReasonExt reason)1034 void AudioDeviceCommon::TriggerRecreateRendererStreamCallback(int32_t callerPid, int32_t sessionId,
1035     int32_t streamFlag, const AudioStreamDeviceChangeReasonExt reason)
1036 {
1037     Trace trace("AudioDeviceCommon::TriggerRecreateRendererStreamCallback");
1038     AUDIO_INFO_LOG("Trigger recreate renderer stream, pid: %{public}d, sessionId: %{public}d, flag: %{public}d",
1039         callerPid, sessionId, streamFlag);
1040     if (audioPolicyServerHandler_ != nullptr) {
1041         audioPolicyServerHandler_->SendRecreateRendererStreamEvent(callerPid, sessionId, streamFlag, reason);
1042     } else {
1043         AUDIO_WARNING_LOG("No audio policy server handler");
1044     }
1045 }
1046 
IsDualStreamWhenRingDual(AudioStreamType streamType)1047 bool AudioDeviceCommon::IsDualStreamWhenRingDual(AudioStreamType streamType)
1048 {
1049     AudioStreamType volumeType = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
1050     if (volumeType == STREAM_RING || volumeType == STREAM_ALARM || volumeType == STREAM_ACCESSIBILITY) {
1051         return true;
1052     }
1053     return false;
1054 }
1055 
UpdateRoute(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices)1056 void AudioDeviceCommon::UpdateRoute(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo,
1057     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &outputDevices)
1058 {
1059     StreamUsage streamUsage = rendererChangeInfo->rendererInfo.streamUsage;
1060     InternalDeviceType deviceType = outputDevices.front()->deviceType_;
1061     AUDIO_INFO_LOG("update route, streamUsage:%{public}d, 1st devicetype:%{public}d", streamUsage, deviceType);
1062     if (Util::IsRingerOrAlarmerStreamUsage(streamUsage) && IsRingerOrAlarmerDualDevicesRange(deviceType) &&
1063         !VolumeUtils::IsPCVolumeEnable()) {
1064         bool skipSelectRingerOrAlarmDevices = IsSameDevice(outputDevices.front(), rendererChangeInfo->outputDeviceInfo);
1065         if (Util::IsRingerOrAlarmerStreamUsage(streamUsage)) {
1066             skipSelectRingerOrAlarmDevices = false;
1067         }
1068         if (!skipSelectRingerOrAlarmDevices &&
1069             !SelectRingerOrAlarmDevices(outputDevices, rendererChangeInfo)) {
1070             audioActiveDevice_.UpdateActiveDeviceRoute(deviceType, DeviceFlag::OUTPUT_DEVICES_FLAG);
1071         }
1072 
1073         AudioRingerMode ringerMode = audioPolicyManager_.GetRingerMode();
1074         if (ringerMode != RINGER_MODE_NORMAL && IsRingerOrAlarmerDualDevicesRange(outputDevices.front()->getType()) &&
1075              outputDevices.front()->getType() != DEVICE_TYPE_SPEAKER) {
1076             audioPolicyManager_.SetStreamMute(STREAM_RING, false, streamUsage);
1077             audioVolumeManager_.SetRingerModeMute(false);
1078             if (audioPolicyManager_.GetSystemVolumeLevel(STREAM_RING) <
1079                 audioPolicyManager_.GetMaxVolumeLevel(STREAM_RING) / VOLUME_LEVEL_DEFAULT_SIZE) {
1080                 audioPolicyManager_.SetDoubleRingVolumeDb(STREAM_RING,
1081                     audioPolicyManager_.GetMaxVolumeLevel(STREAM_RING) / VOLUME_LEVEL_DEFAULT_SIZE);
1082             }
1083         } else {
1084             audioVolumeManager_.SetRingerModeMute(true);
1085         }
1086         shouldUpdateDeviceDueToDualTone_ = true;
1087     } else {
1088         audioVolumeManager_.SetRingerModeMute(true);
1089         if (isRingDualToneOnPrimarySpeaker_ && streamUsage != STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
1090             std::vector<std::pair<InternalDeviceType, DeviceFlag>> activeDevices;
1091             activeDevices.push_back(make_pair(deviceType, DeviceFlag::OUTPUT_DEVICES_FLAG));
1092             activeDevices.push_back(make_pair(DEVICE_TYPE_SPEAKER, DeviceFlag::OUTPUT_DEVICES_FLAG));
1093             audioActiveDevice_.UpdateActiveDevicesRoute(activeDevices);
1094             AUDIO_INFO_LOG("update desc [%{public}d] with speaker on session [%{public}d]",
1095                 deviceType, rendererChangeInfo->sessionId);
1096             AudioStreamType streamType = streamCollector_.GetStreamType(rendererChangeInfo->sessionId);
1097             if (!IsDualStreamWhenRingDual(streamType)) {
1098                 streamsWhenRingDualOnPrimarySpeaker_.push_back(make_pair(streamType, streamUsage));
1099                 audioPolicyManager_.SetStreamMute(streamType, true, streamUsage);
1100             }
1101         } else {
1102             audioActiveDevice_.UpdateActiveDeviceRoute(deviceType, DeviceFlag::OUTPUT_DEVICES_FLAG);
1103         }
1104         shouldUpdateDeviceDueToDualTone_ = false;
1105     }
1106 }
1107 
ResetOffloadAndMchMode(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,vector<std::shared_ptr<AudioDeviceDescriptor>> & outputDevices)1108 void AudioDeviceCommon::ResetOffloadAndMchMode(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo,
1109     vector<std::shared_ptr<AudioDeviceDescriptor>> &outputDevices)
1110 {
1111     if (outputDevices.front()->networkId_ != LOCAL_NETWORK_ID
1112         || outputDevices.front()->deviceType_ == DEVICE_TYPE_REMOTE_CAST) {
1113         audioOffloadStream_.RemoteOffloadStreamRelease(rendererChangeInfo->sessionId);
1114     } else {
1115         FetchStreamForSpkMchStream(rendererChangeInfo, outputDevices);
1116     }
1117 }
1118 
JudgeIfLoadMchModule()1119 void AudioDeviceCommon::JudgeIfLoadMchModule()
1120 {
1121     bool isNeedLoadMchModule = false;
1122     {
1123         if (audioIOHandleMap_.CheckIOHandleExist(MCH_PRIMARY_SPEAKER) == false) {
1124             isNeedLoadMchModule = true;
1125         }
1126     }
1127     if (isNeedLoadMchModule) {
1128         audioOffloadStream_.LoadMchModule();
1129     }
1130 }
1131 
FetchStreamForA2dpMchStream(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,vector<std::shared_ptr<AudioDeviceDescriptor>> & descs)1132 void AudioDeviceCommon::FetchStreamForA2dpMchStream(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo,
1133     vector<std::shared_ptr<AudioDeviceDescriptor>> &descs)
1134 {
1135     if (audioOffloadStream_.CheckStreamMultichannelMode(rendererChangeInfo->sessionId)) {
1136         JudgeIfLoadMchModule();
1137         audioActiveDevice_.UpdateActiveDeviceRoute(DEVICE_TYPE_BLUETOOTH_A2DP, DeviceFlag::OUTPUT_DEVICES_FLAG);
1138         std::string portName = AudioPolicyUtils::GetInstance().GetSinkPortName(descs.front()->deviceType_,
1139             PIPE_TYPE_MULTICHANNEL);
1140         int32_t ret  = audioOffloadStream_.MoveToOutputDevice(rendererChangeInfo->sessionId, portName);
1141         if (ret == SUCCESS) {
1142             streamCollector_.UpdateRendererPipeInfo(rendererChangeInfo->sessionId, PIPE_TYPE_MULTICHANNEL);
1143         }
1144     } else {
1145         AudioPipeType pipeType = PIPE_TYPE_UNKNOWN;
1146         streamCollector_.GetPipeType(rendererChangeInfo->sessionId, pipeType);
1147         if (pipeType == PIPE_TYPE_MULTICHANNEL) {
1148             std::string currentActivePort = MCH_PRIMARY_SPEAKER;
1149             AudioIOHandle activateDeviceIOHandle;
1150             CHECK_AND_RETURN_LOG(audioIOHandleMap_.GetModuleIdByKey(currentActivePort, activateDeviceIOHandle),
1151                 "Can not find port MCH_PRIMARY_SPEAKER in io map");
1152             audioPolicyManager_.SuspendAudioDevice(currentActivePort, true);
1153             audioPolicyManager_.CloseAudioPort(activateDeviceIOHandle);
1154             audioIOHandleMap_.DelIOHandleInfo(currentActivePort);
1155             streamCollector_.UpdateRendererPipeInfo(rendererChangeInfo->sessionId, PIPE_TYPE_NORMAL_OUT);
1156         }
1157         audioOffloadStream_.ResetOffloadMode(rendererChangeInfo->sessionId);
1158         std::vector<SinkInput> sinkInputs;
1159         audioPolicyManager_.GetAllSinkInputs(sinkInputs);
1160         MoveToNewOutputDevice(rendererChangeInfo, descs, sinkInputs);
1161     }
1162 }
1163 
FetchStreamForSpkMchStream(std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo,vector<std::shared_ptr<AudioDeviceDescriptor>> & descs)1164 void AudioDeviceCommon::FetchStreamForSpkMchStream(std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo,
1165     vector<std::shared_ptr<AudioDeviceDescriptor>> &descs)
1166 {
1167     if (audioOffloadStream_.CheckStreamMultichannelMode(rendererChangeInfo->sessionId)) {
1168         JudgeIfLoadMchModule();
1169         std::string oldSinkName = AudioPolicyUtils::GetInstance().GetSinkName(rendererChangeInfo->outputDeviceInfo,
1170             rendererChangeInfo->sessionId);
1171         std::string newSinkName = AudioPolicyUtils::GetInstance().GetSinkPortName(descs.front()->deviceType_,
1172             PIPE_TYPE_MULTICHANNEL);
1173         AUDIO_INFO_LOG("mute sink old:[%{public}s] new:[%{public}s]", oldSinkName.c_str(), newSinkName.c_str());
1174         MuteSinkPort(oldSinkName, newSinkName, AudioStreamDeviceChangeReason::OVERRODE);
1175         int32_t ret  = audioOffloadStream_.MoveToOutputDevice(rendererChangeInfo->sessionId, newSinkName);
1176         if (ret == SUCCESS) {
1177             streamCollector_.UpdateRendererPipeInfo(rendererChangeInfo->sessionId, PIPE_TYPE_MULTICHANNEL);
1178         }
1179     } else {
1180         AudioPipeType pipeType = PIPE_TYPE_UNKNOWN;
1181         streamCollector_.GetPipeType(rendererChangeInfo->sessionId, pipeType);
1182         if (pipeType == PIPE_TYPE_MULTICHANNEL) {
1183             {
1184                 AUDIO_INFO_LOG("unload multichannel module");
1185                 std::string currentActivePort = MCH_PRIMARY_SPEAKER;
1186                 AudioIOHandle activateDeviceIOHandle;
1187                 CHECK_AND_RETURN_LOG(audioIOHandleMap_.GetModuleIdByKey(currentActivePort, activateDeviceIOHandle),
1188                     "Can not find port MCH_PRIMARY_SPEAKER in io map");
1189                 audioPolicyManager_.SuspendAudioDevice(currentActivePort, true);
1190                 audioPolicyManager_.CloseAudioPort(activateDeviceIOHandle);
1191                 audioIOHandleMap_.DelIOHandleInfo(currentActivePort);
1192             }
1193         }
1194         audioOffloadStream_.ResetOffloadMode(rendererChangeInfo->sessionId);
1195     }
1196 }
1197 
IsRingDualToneOnPrimarySpeaker(const vector<std::shared_ptr<AudioDeviceDescriptor>> & descs,const int32_t sessionId)1198 bool AudioDeviceCommon::IsRingDualToneOnPrimarySpeaker(const vector<std::shared_ptr<AudioDeviceDescriptor>> &descs,
1199     const int32_t sessionId)
1200 {
1201     if (descs.size() !=  AUDIO_CONCURRENT_ACTIVE_DEVICES_LIMIT) {
1202         return false;
1203     }
1204     if (AudioPolicyUtils::GetInstance().GetSinkName(*descs.front(), sessionId) != PRIMARY_SPEAKER) {
1205         return false;
1206     }
1207     if (AudioPolicyUtils::GetInstance().GetSinkName(*descs.back(), sessionId) != PRIMARY_SPEAKER) {
1208         return false;
1209     }
1210     if (descs.back()->deviceType_ != DEVICE_TYPE_SPEAKER) {
1211         return false;
1212     }
1213     AUDIO_INFO_LOG("ring dual tone on primary speaker.");
1214     return true;
1215 }
1216 
SelectRingerOrAlarmDevices(const vector<std::shared_ptr<AudioDeviceDescriptor>> & descs,const std::shared_ptr<AudioRendererChangeInfo> & rendererChangeInfo)1217 bool AudioDeviceCommon::SelectRingerOrAlarmDevices(const vector<std::shared_ptr<AudioDeviceDescriptor>> &descs,
1218     const std::shared_ptr<AudioRendererChangeInfo> &rendererChangeInfo)
1219 {
1220     CHECK_AND_RETURN_RET_LOG(descs.size() > 0 && descs.size() <= AUDIO_CONCURRENT_ACTIVE_DEVICES_LIMIT, false,
1221         "audio devices not in range for ringer or alarmer.");
1222     const int32_t sessionId = rendererChangeInfo->sessionId;
1223     const StreamUsage streamUsage = rendererChangeInfo->rendererInfo.streamUsage;
1224     bool allDevicesInDualDevicesRange = true;
1225     std::vector<std::pair<InternalDeviceType, DeviceFlag>> activeDevices;
1226     for (size_t i = 0; i < descs.size(); i++) {
1227         if (IsRingerOrAlarmerDualDevicesRange(descs[i]->deviceType_)) {
1228             activeDevices.push_back(make_pair(descs[i]->deviceType_, DeviceFlag::OUTPUT_DEVICES_FLAG));
1229             AUDIO_INFO_LOG("select ringer/alarm devices devicetype[%{public}zu]:%{public}d", i, descs[i]->deviceType_);
1230         } else {
1231             allDevicesInDualDevicesRange = false;
1232             break;
1233         }
1234     }
1235 
1236     AUDIO_INFO_LOG("select ringer/alarm sessionId:%{public}d, streamUsage:%{public}d", sessionId, streamUsage);
1237     if (!descs.empty() && allDevicesInDualDevicesRange) {
1238         if (descs.size() == AUDIO_CONCURRENT_ACTIVE_DEVICES_LIMIT &&
1239             AudioPolicyUtils::GetInstance().GetSinkName(*descs.front(), sessionId) !=
1240             AudioPolicyUtils::GetInstance().GetSinkName(*descs.back(), sessionId)) {
1241             AUDIO_INFO_LOG("set dual hal tone, reset primary sink to default before.");
1242             audioActiveDevice_.UpdateActiveDeviceRoute(DEVICE_TYPE_SPEAKER, DeviceFlag::OUTPUT_DEVICES_FLAG);
1243             if (enableDualHalToneState_ && enableDualHalToneSessionId_ != sessionId) {
1244                 AUDIO_INFO_LOG("session changed, disable old dual hal tone.");
1245                 UpdateDualToneState(false, enableDualHalToneSessionId_);
1246             }
1247 
1248             if ((audioPolicyManager_.GetRingerMode() != RINGER_MODE_NORMAL && streamUsage != STREAM_USAGE_ALARM) ||
1249                 (VolumeUtils::IsPCVolumeEnable() && audioVolumeManager_.GetStreamMute(STREAM_MUSIC))) {
1250                 AUDIO_INFO_LOG("no normal ringer mode and no alarm, dont dual hal tone.");
1251                 return false;
1252             }
1253             UpdateDualToneState(true, sessionId);
1254         } else {
1255             if (enableDualHalToneState_ && enableDualHalToneSessionId_ == sessionId) {
1256                 AUDIO_INFO_LOG("device unavailable, disable dual hal tone.");
1257                 UpdateDualToneState(false, enableDualHalToneSessionId_);
1258             }
1259             isRingDualToneOnPrimarySpeaker_ = IsRingDualToneOnPrimarySpeaker(descs, sessionId);
1260             audioActiveDevice_.UpdateActiveDevicesRoute(activeDevices);
1261         }
1262         return true;
1263     }
1264     return false;
1265 }
1266 
HandleDeviceChangeForFetchInputDevice(std::shared_ptr<AudioDeviceDescriptor> & desc,std::shared_ptr<AudioCapturerChangeInfo> & capturerChangeInfo)1267 int32_t AudioDeviceCommon::HandleDeviceChangeForFetchInputDevice(std::shared_ptr<AudioDeviceDescriptor> &desc,
1268     std::shared_ptr<AudioCapturerChangeInfo> &capturerChangeInfo)
1269 {
1270     if (desc->deviceType_ == DEVICE_TYPE_NONE ||
1271         (IsSameDevice(desc, capturerChangeInfo->inputDeviceInfo) && desc->connectState_ != DEACTIVE_CONNECTED)) {
1272         AUDIO_WARNING_LOG("stream %{public}d device not change, no need move device", capturerChangeInfo->sessionId);
1273         std::shared_ptr<AudioDeviceDescriptor> preferredDesc =
1274             audioAffinityManager_.GetCapturerDevice(capturerChangeInfo->clientUID);
1275         if (!IsSameDevice(desc, audioActiveDevice_.GetCurrentInputDevice()) &&
1276             (((preferredDesc->deviceType_ != DEVICE_TYPE_NONE) && desc->deviceType_ != preferredDesc->deviceType_) ||
1277             IsSameDevice(desc, capturerChangeInfo->inputDeviceInfo))) {
1278             audioActiveDevice_.SetCurrentInputDevice(*desc);
1279             // networkId is not used.
1280             OnPreferredInputDeviceUpdated(audioActiveDevice_.GetCurrentInputDeviceType(), "");
1281             audioActiveDevice_.UpdateActiveDeviceRoute(audioActiveDevice_.GetCurrentInputDeviceType(),
1282                 DeviceFlag::INPUT_DEVICES_FLAG, audioActiveDevice_.GetCurrentInputDevice().deviceName_);
1283         }
1284         return ERR_NEED_NOT_SWITCH_DEVICE;
1285     }
1286     return SUCCESS;
1287 }
1288 
FetchInputDeviceInner(std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & capturerChangeInfos,const AudioStreamDeviceChangeReasonExt reason,bool & needUpdateActiveDevice,bool & isUpdateActiveDevice,int32_t & runningStreamCount)1289 void AudioDeviceCommon::FetchInputDeviceInner(
1290     std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos,
1291     const AudioStreamDeviceChangeReasonExt reason, bool& needUpdateActiveDevice, bool& isUpdateActiveDevice,
1292     int32_t& runningStreamCount)
1293 {
1294     for (auto &capturerChangeInfo : capturerChangeInfos) {
1295         SourceType sourceType = capturerChangeInfo->capturerInfo.sourceType;
1296         int32_t clientUID = capturerChangeInfo->clientUID;
1297         if ((sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE &&
1298             audioSceneManager_.GetAudioScene(true) != AUDIO_SCENE_PHONE_CALL) ||
1299             (sourceType != SOURCE_TYPE_VIRTUAL_CAPTURE && capturerChangeInfo->capturerState != CAPTURER_RUNNING)) {
1300             AUDIO_WARNING_LOG("stream %{public}d not running, no need fetch device", capturerChangeInfo->sessionId);
1301             continue;
1302         }
1303         runningStreamCount++;
1304         std::shared_ptr<AudioDeviceDescriptor> desc = audioRouterCenter_.FetchInputDevice(sourceType, clientUID);
1305         AudioDeviceDescriptor inputDeviceInfo = capturerChangeInfo->inputDeviceInfo;
1306         if (HandleDeviceChangeForFetchInputDevice(desc, capturerChangeInfo) == ERR_NEED_NOT_SWITCH_DEVICE) {
1307             continue;
1308         }
1309         HandleBluetoothInputDeviceFetched(desc, capturerChangeInfos, sourceType);
1310         if (desc->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) {
1311             audioEcManager_.ActivateArmDevice(desc->macAddress_, desc->deviceRole_);
1312         }
1313         if (needUpdateActiveDevice) {
1314             std::shared_ptr<AudioDeviceDescriptor> preferredDesc = audioAffinityManager_.GetCapturerDevice(clientUID);
1315             if (((preferredDesc->deviceType_ != DEVICE_TYPE_NONE) &&
1316                 !IsSameDevice(desc, audioActiveDevice_.GetCurrentInputDevice())
1317                 && desc->deviceType_ != preferredDesc->deviceType_)
1318                 || ((preferredDesc->deviceType_ == DEVICE_TYPE_NONE)
1319                 && !IsSameDevice(desc, audioActiveDevice_.GetCurrentInputDevice()))) {
1320                 WriteInputRouteChangeEvent(desc, reason);
1321                 audioActiveDevice_.SetCurrentInputDevice(*desc);
1322                 AUDIO_DEBUG_LOG("currentActiveInputDevice update %{public}d",
1323                     audioActiveDevice_.GetCurrentInputDeviceType());
1324                 isUpdateActiveDevice = true;
1325             }
1326             needUpdateActiveDevice = false;
1327         }
1328         if (NotifyRecreateCapturerStream(isUpdateActiveDevice, capturerChangeInfo, reason)) {continue;}
1329         // move sourceoutput to target device
1330         MoveToNewInputDevice(capturerChangeInfo, desc);
1331         audioMicrophoneDescriptor_.AddAudioCapturerMicrophoneDescriptor(capturerChangeInfo->sessionId,
1332             desc->deviceType_);
1333     }
1334 }
1335 
FetchInputDevice(std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & capturerChangeInfos,const AudioStreamDeviceChangeReasonExt reason)1336 void AudioDeviceCommon::FetchInputDevice(std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos,
1337     const AudioStreamDeviceChangeReasonExt reason)
1338 {
1339     Trace trace("AudioDeviceCommon::FetchInputDevice");
1340     AUDIO_PRERELEASE_LOGI("Start for %{public}zu stream, connected %{public}s",
1341         capturerChangeInfos.size(), audioDeviceManager_.GetConnDevicesStr().c_str());
1342     bool needUpdateActiveDevice = true;
1343     bool isUpdateActiveDevice = false;
1344     int32_t runningStreamCount = 0;
1345 
1346     FetchInputDeviceInner(capturerChangeInfos, reason, needUpdateActiveDevice, isUpdateActiveDevice,
1347         runningStreamCount);
1348 
1349     FetchInputEnd(isUpdateActiveDevice, runningStreamCount);
1350 }
1351 
FetchInputEnd(const bool isUpdateActiveDevice,const int32_t runningStreamCount)1352 void AudioDeviceCommon::FetchInputEnd(const bool isUpdateActiveDevice, const int32_t runningStreamCount)
1353 {
1354     if (isUpdateActiveDevice) {
1355         OnPreferredInputDeviceUpdated(audioActiveDevice_.GetCurrentInputDeviceType(), ""); // networkId is not used.
1356     }
1357     if (runningStreamCount == 0) {
1358         FetchInputDeviceWhenNoRunningStream();
1359     }
1360 }
1361 
HandleBluetoothInputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> & desc,std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & capturerChangeInfos,SourceType sourceType)1362 void AudioDeviceCommon::HandleBluetoothInputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> &desc,
1363     std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos, SourceType sourceType)
1364 {
1365     if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
1366         BluetoothScoFetch(desc, capturerChangeInfos, sourceType);
1367     } else if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP_IN) {
1368         HandleA2dpInputDeviceFetched(desc, sourceType);
1369     }
1370 }
1371 
WriteInputRouteChangeEvent(std::shared_ptr<AudioDeviceDescriptor> & desc,const AudioStreamDeviceChangeReason reason)1372 void AudioDeviceCommon::WriteInputRouteChangeEvent(std::shared_ptr<AudioDeviceDescriptor> &desc,
1373     const AudioStreamDeviceChangeReason reason)
1374 {
1375     int64_t timeStamp = AudioPolicyUtils::GetInstance().GetCurrentTimeMS();
1376     std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1377         Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_ROUTE_CHANGE,
1378         Media::MediaMonitor::BEHAVIOR_EVENT);
1379     bean->Add("REASON", static_cast<int32_t>(reason));
1380     bean->Add("TIMESTAMP", static_cast<uint64_t>(timeStamp));
1381     bean->Add("DEVICE_TYPE_BEFORE_CHANGE", audioActiveDevice_.GetCurrentInputDeviceType());
1382     bean->Add("DEVICE_TYPE_AFTER_CHANGE", desc->deviceType_);
1383     Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1384 }
1385 
NotifyRecreateCapturerStream(bool isUpdateActiveDevice,const std::shared_ptr<AudioCapturerChangeInfo> & capturerChangeInfo,const AudioStreamDeviceChangeReasonExt reason)1386 bool AudioDeviceCommon::NotifyRecreateCapturerStream(bool isUpdateActiveDevice,
1387     const std::shared_ptr<AudioCapturerChangeInfo> &capturerChangeInfo,
1388     const AudioStreamDeviceChangeReasonExt reason)
1389 {
1390     AUDIO_INFO_LOG("Is update active device: %{public}d, current capturerFlag: %{public}d, origianl flag: %{public}d",
1391         isUpdateActiveDevice, capturerChangeInfo->capturerInfo.capturerFlags,
1392         capturerChangeInfo->capturerInfo.originalFlag);
1393     CHECK_AND_RETURN_RET_LOG(isUpdateActiveDevice, false, "isUpdateActiveDevice is false");
1394     CHECK_AND_RETURN_RET_LOG(capturerChangeInfo->capturerInfo.originalFlag == AUDIO_FLAG_MMAP, false,
1395         "original flag is false");
1396     // Switch between old and new stream as they have different hals
1397     std::string oldDevicePortName = AudioPolicyUtils::GetInstance().GetSourcePortName(
1398         capturerChangeInfo->inputDeviceInfo.deviceType_);
1399     if ((strcmp(oldDevicePortName.c_str(),
1400         AudioPolicyUtils::GetInstance().GetSourcePortName(audioActiveDevice_.GetCurrentInputDeviceType()).c_str())) ||
1401         ((capturerChangeInfo->inputDeviceInfo.networkId_ == LOCAL_NETWORK_ID) ^
1402         (audioActiveDevice_.GetCurrentInputDevice().networkId_ == LOCAL_NETWORK_ID))) {
1403         int32_t streamClass = GetPreferredInputStreamTypeInner(capturerChangeInfo->capturerInfo.sourceType,
1404             audioActiveDevice_.GetCurrentInputDeviceType(), capturerChangeInfo->capturerInfo.originalFlag,
1405             audioActiveDevice_.GetCurrentInputDevice().networkId_, capturerChangeInfo->capturerInfo.samplingRate);
1406         TriggerRecreateCapturerStreamCallback(capturerChangeInfo, streamClass, reason);
1407         return true;
1408     }
1409     return false;
1410 }
1411 
MoveToNewInputDevice(std::shared_ptr<AudioCapturerChangeInfo> & capturerChangeInfo,std::shared_ptr<AudioDeviceDescriptor> & inputDevice)1412 void AudioDeviceCommon::MoveToNewInputDevice(std::shared_ptr<AudioCapturerChangeInfo> &capturerChangeInfo,
1413     std::shared_ptr<AudioDeviceDescriptor> &inputDevice)
1414 {
1415     std::vector<SourceOutput> targetSourceOutputs = FilterSourceOutputs(capturerChangeInfo->sessionId);
1416 
1417     // MoveSourceOuputByIndexName
1418     auto ret = (inputDevice->networkId_ == LOCAL_NETWORK_ID)
1419         ? MoveToLocalInputDevice(targetSourceOutputs, std::make_shared<AudioDeviceDescriptor>(*inputDevice))
1420         : MoveToRemoteInputDevice(targetSourceOutputs, std::make_shared<AudioDeviceDescriptor>(*inputDevice));
1421     CHECK_AND_RETURN_LOG((ret == SUCCESS), "Move source output %{public}d to device %{public}d failed!",
1422         capturerChangeInfo->sessionId, inputDevice->deviceType_);
1423     AUDIO_WARNING_LOG("move session %{public}d [%{public}d][%{public}s]-->[%{public}d][%{public}s]",
1424         capturerChangeInfo->sessionId, capturerChangeInfo->inputDeviceInfo.deviceType_,
1425         GetEncryptAddr(capturerChangeInfo->inputDeviceInfo.macAddress_).c_str(),
1426         inputDevice->deviceType_, GetEncryptAddr(inputDevice->macAddress_).c_str());
1427 
1428     if (audioConfigManager_.GetUpdateRouteSupport() && inputDevice->networkId_ == LOCAL_NETWORK_ID) {
1429         audioActiveDevice_.UpdateActiveDeviceRoute(inputDevice->deviceType_, DeviceFlag::INPUT_DEVICES_FLAG,
1430             inputDevice->deviceName_);
1431     }
1432     UpdateDeviceInfo(capturerChangeInfo->inputDeviceInfo, std::make_shared<AudioDeviceDescriptor>(*inputDevice),
1433         true, true);
1434     streamCollector_.UpdateCapturerDeviceInfo(capturerChangeInfo->clientUID, capturerChangeInfo->sessionId,
1435         capturerChangeInfo->inputDeviceInfo);
1436 }
1437 
FetchInputDeviceWhenNoRunningStream()1438 void AudioDeviceCommon::FetchInputDeviceWhenNoRunningStream()
1439 {
1440     std::shared_ptr<AudioDeviceDescriptor> desc;
1441     AudioDeviceDescriptor tempDesc = audioActiveDevice_.GetCurrentInputDevice();
1442     if (tempDesc.deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO &&
1443         (Bluetooth::AudioHfpManager::GetScoCategory() == Bluetooth::ScoCategory::SCO_RECOGNITION ||
1444         Bluetooth::AudioHfpManager::GetRecognitionStatus() == Bluetooth::RecognitionStatus::RECOGNITION_CONNECTING)) {
1445         desc = audioRouterCenter_.FetchInputDevice(SOURCE_TYPE_VOICE_RECOGNITION, -1);
1446     } else {
1447         desc = audioRouterCenter_.FetchInputDevice(SOURCE_TYPE_MIC, -1);
1448     }
1449 
1450     if (desc->deviceType_ == DEVICE_TYPE_NONE || IsSameDevice(desc, tempDesc)) {
1451         AUDIO_DEBUG_LOG("input device is not change");
1452         return;
1453     }
1454     audioActiveDevice_.SetCurrentInputDevice(*desc);
1455     if (desc->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) {
1456         audioEcManager_.PresetArmIdleInput(desc->macAddress_);
1457     }
1458     DeviceType deviceType = audioActiveDevice_.GetCurrentInputDeviceType();
1459     AUDIO_DEBUG_LOG("currentActiveInputDevice update %{public}d", deviceType);
1460     OnPreferredInputDeviceUpdated(deviceType, ""); // networkId is not used
1461 }
1462 
BluetoothScoFetch(std::shared_ptr<AudioDeviceDescriptor> & desc,std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & capturerChangeInfos,SourceType sourceType)1463 void AudioDeviceCommon::BluetoothScoFetch(std::shared_ptr<AudioDeviceDescriptor> &desc,
1464     std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos, SourceType sourceType)
1465 {
1466     Trace trace("AudioDeviceCommon::BluetoothScoFetch");
1467     int32_t ret;
1468     if (Util::IsScoSupportSource(sourceType)) {
1469         int32_t activeRet = Bluetooth::AudioHfpManager::SetActiveHfpDevice(desc->macAddress_);
1470         if (activeRet != SUCCESS) {
1471             AUDIO_ERR_LOG("Active hfp device failed, retrigger fetch input device");
1472             desc->exceptionFlag_ = true;
1473             audioDeviceManager_.UpdateDevicesListInfo(
1474                 std::make_shared<AudioDeviceDescriptor>(*desc), EXCEPTION_FLAG_UPDATE);
1475             FetchInputDevice(capturerChangeInfos);
1476         }
1477         ret = ScoInputDeviceFetchedForRecongnition(true, desc->macAddress_, desc->connectState_);
1478     } else {
1479         ret = HandleScoInputDeviceFetched(desc, capturerChangeInfos);
1480     }
1481     if (ret != SUCCESS) {
1482         AUDIO_ERR_LOG("sco [%{public}s] is not connected yet", GetEncryptAddr(desc->macAddress_).c_str());
1483     }
1484 }
1485 
FilterSourceOutputs(int32_t sessionId)1486 std::vector<SourceOutput> AudioDeviceCommon::FilterSourceOutputs(int32_t sessionId)
1487 {
1488     std::vector<SourceOutput> targetSourceOutputs = {};
1489     std::vector<SourceOutput> sourceOutputs = GetSourceOutputs();
1490 
1491     for (size_t i = 0; i < sourceOutputs.size(); i++) {
1492         AUDIO_DEBUG_LOG("sourceOutput[%{public}zu]:%{public}s", i, PrintSourceOutput(sourceOutputs[i]).c_str());
1493         if (sessionId == sourceOutputs[i].streamId) {
1494             targetSourceOutputs.push_back(sourceOutputs[i]);
1495         }
1496     }
1497     return targetSourceOutputs;
1498 }
1499 
HandleA2dpInputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> & desc,SourceType sourceType)1500 void AudioDeviceCommon::HandleA2dpInputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> &desc,
1501     SourceType sourceType)
1502 {
1503     audioActiveDevice_.SetActiveBtInDeviceMac(desc->macAddress_);
1504     AudioStreamInfo audioStreamInfo = {};
1505     audioActiveDevice_.GetActiveA2dpDeviceStreamInfo(DEVICE_TYPE_BLUETOOTH_A2DP_IN, audioStreamInfo);
1506 
1507     std::string networkId = audioActiveDevice_.GetCurrentOutputDeviceNetworkId();
1508     std::string sinkName = AudioPolicyUtils::GetInstance().GetSinkPortName(
1509         audioActiveDevice_.GetCurrentOutputDeviceType());
1510 
1511     int32_t ret = LoadA2dpModule(DEVICE_TYPE_BLUETOOTH_A2DP_IN, audioStreamInfo, networkId, sinkName,
1512         sourceType);
1513     CHECK_AND_RETURN_LOG(ret == SUCCESS, "load a2dp input module failed");
1514 }
1515 
TriggerRecreateCapturerStreamCallback(const std::shared_ptr<AudioCapturerChangeInfo> & capturerChangeInfo,int32_t streamFlag,const AudioStreamDeviceChangeReasonExt reason)1516 void AudioDeviceCommon::TriggerRecreateCapturerStreamCallback(
1517     const std::shared_ptr<AudioCapturerChangeInfo> &capturerChangeInfo,
1518     int32_t streamFlag, const AudioStreamDeviceChangeReasonExt reason)
1519 {
1520     Trace trace("AudioDeviceCommon::TriggerRecreateCapturerStreamCallback");
1521     SwitchStreamInfo info = {
1522         static_cast<uint32_t>(capturerChangeInfo->sessionId),
1523         capturerChangeInfo->createrUID,
1524         capturerChangeInfo->clientUID,
1525         capturerChangeInfo->clientPid,
1526         capturerChangeInfo->appTokenId,
1527         capturerChangeInfo->capturerState,
1528     };
1529     AUDIO_WARNING_LOG("Trigger recreate capturer stream, pid: %{public}d, sessionId: %{public}d, flag: %{public}d",
1530         capturerChangeInfo->callerPid, capturerChangeInfo->sessionId, streamFlag);
1531     if (audioPolicyServerHandler_ != nullptr) {
1532         SwitchStreamUtil::UpdateSwitchStreamRecord(info, SWITCH_STATE_WAITING);
1533         audioPolicyServerHandler_->SendRecreateCapturerStreamEvent(capturerChangeInfo->callerPid,
1534             capturerChangeInfo->sessionId, streamFlag, reason);
1535     } else {
1536         AUDIO_WARNING_LOG("No audio policy server handler");
1537     }
1538 }
1539 
MoveToLocalInputDevice(std::vector<SourceOutput> sourceOutputs,std::shared_ptr<AudioDeviceDescriptor> localDeviceDescriptor)1540 int32_t AudioDeviceCommon::MoveToLocalInputDevice(std::vector<SourceOutput> sourceOutputs,
1541     std::shared_ptr<AudioDeviceDescriptor> localDeviceDescriptor)
1542 {
1543     AUDIO_DEBUG_LOG("Start");
1544     // check
1545     CHECK_AND_RETURN_RET_LOG(LOCAL_NETWORK_ID == localDeviceDescriptor->networkId_, ERR_INVALID_OPERATION,
1546         "failed: not a local device.");
1547     // start move.
1548     uint32_t sourceId = -1; // invalid source id, use source name instead.
1549     std::string sourceName = AudioPolicyUtils::GetInstance().GetSourcePortName(localDeviceDescriptor->deviceType_);
1550     for (size_t i = 0; i < sourceOutputs.size(); i++) {
1551         int32_t ret = audioPolicyManager_.MoveSourceOutputByIndexOrName(sourceOutputs[i].paStreamId,
1552             sourceId, sourceName);
1553         CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR,
1554             "move [%{public}d] to local failed", sourceOutputs[i].paStreamId);
1555     }
1556 
1557     return SUCCESS;
1558 }
1559 
MoveToRemoteInputDevice(std::vector<SourceOutput> sourceOutputs,std::shared_ptr<AudioDeviceDescriptor> remoteDeviceDescriptor)1560 int32_t AudioDeviceCommon::MoveToRemoteInputDevice(std::vector<SourceOutput> sourceOutputs,
1561     std::shared_ptr<AudioDeviceDescriptor> remoteDeviceDescriptor)
1562 {
1563     AUDIO_INFO_LOG("Start");
1564 
1565     std::string networkId = remoteDeviceDescriptor->networkId_;
1566     DeviceRole deviceRole = remoteDeviceDescriptor->deviceRole_;
1567     DeviceType deviceType = remoteDeviceDescriptor->deviceType_;
1568 
1569     // check: networkid
1570     CHECK_AND_RETURN_RET_LOG(networkId != LOCAL_NETWORK_ID, ERR_INVALID_OPERATION,
1571         "failed: not a remote device.");
1572 
1573     uint32_t sourceId = -1; // invalid sink id, use sink name instead.
1574     std::string moduleName = AudioPolicyUtils::GetInstance().GetRemoteModuleName(networkId, deviceRole);
1575 
1576     AudioIOHandle moduleId;
1577     if (audioIOHandleMap_.GetModuleIdByKey(moduleName, moduleId)) {
1578         (void)moduleId; // mIOHandle is module id, not equal to sink id.
1579     } else {
1580         AUDIO_ERR_LOG("no such device.");
1581         if (!isOpenRemoteDevice) {
1582             return ERR_INVALID_PARAM;
1583         } else {
1584             return OpenRemoteAudioDevice(networkId, deviceRole, deviceType, remoteDeviceDescriptor);
1585         }
1586     }
1587     int32_t res = AudioServerProxy::GetInstance().CheckRemoteDeviceStateProxy(networkId, deviceRole, true);
1588     CHECK_AND_RETURN_RET_LOG(res == SUCCESS, ERR_OPERATION_FAILED, "remote device state is invalid!");
1589 
1590     // start move.
1591     for (size_t i = 0; i < sourceOutputs.size(); i++) {
1592         int32_t ret = audioPolicyManager_.MoveSourceOutputByIndexOrName(sourceOutputs[i].paStreamId,
1593             sourceId, moduleName);
1594         CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR,
1595             "move [%{public}d] failed", sourceOutputs[i].paStreamId);
1596     }
1597 
1598     if (deviceType != DeviceType::DEVICE_TYPE_DEFAULT) {
1599         AUDIO_DEBUG_LOG("Not defult type[%{public}d] on device:[%{public}s]",
1600             deviceType, GetEncryptStr(networkId).c_str());
1601     }
1602     return SUCCESS;
1603 }
1604 
ScoInputDeviceFetchedForRecongnition(bool handleFlag,const std::string & address,ConnectState connectState)1605 int32_t AudioDeviceCommon::ScoInputDeviceFetchedForRecongnition(bool handleFlag, const std::string &address,
1606     ConnectState connectState)
1607 {
1608     if (handleFlag && connectState != DEACTIVE_CONNECTED) {
1609         return SUCCESS;
1610     }
1611     Bluetooth::BluetoothRemoteDevice device = Bluetooth::BluetoothRemoteDevice(address);
1612     return Bluetooth::AudioHfpManager::HandleScoWithRecongnition(handleFlag, device);
1613 }
1614 
HandleScoInputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> & desc,std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & capturerChangeInfos)1615 int32_t AudioDeviceCommon::HandleScoInputDeviceFetched(std::shared_ptr<AudioDeviceDescriptor> &desc,
1616     std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos)
1617 {
1618 #ifdef BLUETOOTH_ENABLE
1619     int32_t ret = Bluetooth::AudioHfpManager::SetActiveHfpDevice(desc->macAddress_);
1620     if (ret != SUCCESS) {
1621         AUDIO_ERR_LOG("Active hfp device failed, retrigger fetch input device");
1622         desc->exceptionFlag_ = true;
1623         audioDeviceManager_.UpdateDevicesListInfo(
1624             std::make_shared<AudioDeviceDescriptor>(*desc), EXCEPTION_FLAG_UPDATE);
1625         FetchInputDevice(capturerChangeInfos);
1626         return ERROR;
1627     }
1628     if (desc->connectState_ == DEACTIVE_CONNECTED || !audioSceneManager_.IsSameAudioScene()) {
1629         Bluetooth::AudioHfpManager::ConnectScoWithAudioScene(audioSceneManager_.GetAudioScene(true));
1630         return SUCCESS;
1631     }
1632 #endif
1633     return SUCCESS;
1634 }
1635 
MoveToRemoteOutputDevice(std::vector<SinkInput> sinkInputIds,std::shared_ptr<AudioDeviceDescriptor> remoteDeviceDescriptor)1636 int32_t AudioDeviceCommon::MoveToRemoteOutputDevice(std::vector<SinkInput> sinkInputIds,
1637     std::shared_ptr<AudioDeviceDescriptor> remoteDeviceDescriptor)
1638 {
1639     AUDIO_INFO_LOG("Start for [%{public}zu] sink-inputs", sinkInputIds.size());
1640 
1641     std::string networkId = remoteDeviceDescriptor->networkId_;
1642     DeviceRole deviceRole = remoteDeviceDescriptor->deviceRole_;
1643     DeviceType deviceType = remoteDeviceDescriptor->deviceType_;
1644 
1645     // check: networkid
1646     CHECK_AND_RETURN_RET_LOG(networkId != LOCAL_NETWORK_ID, ERR_INVALID_OPERATION,
1647         "failed: not a remote device.");
1648 
1649     uint32_t sinkId = -1; // invalid sink id, use sink name instead.
1650     std::string moduleName = AudioPolicyUtils::GetInstance().GetRemoteModuleName(networkId, deviceRole);
1651     AudioIOHandle moduleId;
1652     if (audioIOHandleMap_.GetModuleIdByKey(moduleName, moduleId)) {
1653         (void)moduleId; // mIOHandle is module id, not equal to sink id.
1654     } else {
1655         AUDIO_ERR_LOG("no such device.");
1656         if (!isOpenRemoteDevice) {
1657             return ERR_INVALID_PARAM;
1658         } else {
1659             return OpenRemoteAudioDevice(networkId, deviceRole, deviceType, remoteDeviceDescriptor);
1660         }
1661     }
1662     int32_t res = AudioServerProxy::GetInstance().CheckRemoteDeviceStateProxy(networkId, deviceRole, true);
1663     CHECK_AND_RETURN_RET_LOG(res == SUCCESS, ERR_OPERATION_FAILED, "remote device state is invalid!");
1664 
1665     // start move.
1666     for (size_t i = 0; i < sinkInputIds.size(); i++) {
1667         int32_t ret = audioPolicyManager_.MoveSinkInputByIndexOrName(sinkInputIds[i].paStreamId, sinkId, moduleName);
1668         CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "move [%{public}d] failed", sinkInputIds[i].streamId);
1669         audioRouteMap_.AddRouteMapInfo(sinkInputIds[i].uid, moduleName, sinkInputIds[i].pid);
1670     }
1671 
1672     if (deviceType != DeviceType::DEVICE_TYPE_DEFAULT) {
1673         AUDIO_WARNING_LOG("Not defult type[%{public}d] on device:[%{public}s]",
1674             deviceType, GetEncryptStr(networkId).c_str());
1675     }
1676     isCurrentRemoteRenderer = true;
1677     return SUCCESS;
1678 }
1679 
MoveToLocalOutputDevice(std::vector<SinkInput> sinkInputIds,std::shared_ptr<AudioDeviceDescriptor> localDeviceDescriptor)1680 int32_t AudioDeviceCommon::MoveToLocalOutputDevice(std::vector<SinkInput> sinkInputIds,
1681     std::shared_ptr<AudioDeviceDescriptor> localDeviceDescriptor)
1682 {
1683     AUDIO_INFO_LOG("Start for [%{public}zu] sink-inputs", sinkInputIds.size());
1684     // check
1685     CHECK_AND_RETURN_RET_LOG(LOCAL_NETWORK_ID == localDeviceDescriptor->networkId_,
1686         ERR_INVALID_OPERATION, "failed: not a local device.");
1687 
1688     // start move.
1689     uint32_t sinkId = -1; // invalid sink id, use sink name instead.
1690     for (size_t i = 0; i < sinkInputIds.size(); i++) {
1691         AudioPipeType pipeType = PIPE_TYPE_UNKNOWN;
1692         streamCollector_.GetPipeType(sinkInputIds[i].streamId, pipeType);
1693         std::string sinkName = AudioPolicyUtils::GetInstance().GetSinkPortName(localDeviceDescriptor->deviceType_,
1694             pipeType);
1695         if (sinkName == BLUETOOTH_SPEAKER) {
1696             std::string activePort = BLUETOOTH_SPEAKER;
1697             audioPolicyManager_.SuspendAudioDevice(activePort, false);
1698         }
1699         AUDIO_INFO_LOG("move for session [%{public}d], portName %{public}s pipeType %{public}d",
1700             sinkInputIds[i].streamId, sinkName.c_str(), pipeType);
1701         int32_t ret = audioPolicyManager_.MoveSinkInputByIndexOrName(sinkInputIds[i].paStreamId, sinkId, sinkName);
1702         CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR,
1703             "move [%{public}d] to local failed", sinkInputIds[i].streamId);
1704         audioRouteMap_.AddRouteMapInfo(sinkInputIds[i].uid, LOCAL_NETWORK_ID, sinkInputIds[i].pid);
1705     }
1706 
1707     isCurrentRemoteRenderer = false;
1708     return SUCCESS;
1709 }
1710 
OpenRemoteAudioDevice(std::string networkId,DeviceRole deviceRole,DeviceType deviceType,std::shared_ptr<AudioDeviceDescriptor> remoteDeviceDescriptor)1711 int32_t AudioDeviceCommon::OpenRemoteAudioDevice(std::string networkId, DeviceRole deviceRole, DeviceType deviceType,
1712     std::shared_ptr<AudioDeviceDescriptor> remoteDeviceDescriptor)
1713 {
1714     // open the test device. We should open it when device is online.
1715     std::string moduleName = AudioPolicyUtils::GetInstance().GetRemoteModuleName(networkId, deviceRole);
1716     AudioModuleInfo remoteDeviceInfo = AudioPolicyUtils::GetInstance().ConstructRemoteAudioModuleInfo(networkId,
1717         deviceRole, deviceType);
1718 
1719     auto ret = AudioServerProxy::GetInstance().LoadHdiAdapterProxy(HDI_DEVICE_MANAGER_TYPE_REMOTE, networkId);
1720     if (ret) {
1721         AUDIO_ERR_LOG("load adapter fail");
1722     }
1723     audioIOHandleMap_.OpenPortAndInsertIOHandle(moduleName, remoteDeviceInfo);
1724 
1725     // If device already in list, remove it else do not modify the list.
1726     audioConnectedDevice_.DelConnectedDevice(networkId, deviceType);
1727     AudioPolicyUtils::GetInstance().UpdateDisplayName(remoteDeviceDescriptor);
1728     audioConnectedDevice_.AddConnectedDevice(remoteDeviceDescriptor);
1729     audioMicrophoneDescriptor_.AddMicrophoneDescriptor(remoteDeviceDescriptor);
1730     return SUCCESS;
1731 }
1732 
CheckAndNotifyUserSelectedDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)1733 void AudioDeviceCommon::CheckAndNotifyUserSelectedDevice(
1734     const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
1735 {
1736     shared_ptr<AudioDeviceDescriptor> userSelectedMediaDevice = audioStateManager_.GetPreferredMediaRenderDevice();
1737     shared_ptr<AudioDeviceDescriptor> userSelectedCallDevice = audioStateManager_.GetPreferredCallRenderDevice();
1738     if (userSelectedMediaDevice != nullptr
1739         && userSelectedMediaDevice->connectState_ == VIRTUAL_CONNECTED
1740         && deviceDescriptor->IsSameDeviceDesc(*userSelectedMediaDevice)) {
1741         audioActiveDevice_.NotifyUserSelectionEventToBt(deviceDescriptor);
1742     }
1743     if (userSelectedCallDevice != nullptr
1744         && userSelectedCallDevice->connectState_ == VIRTUAL_CONNECTED
1745         && deviceDescriptor->IsSameDeviceDesc(*userSelectedCallDevice)) {
1746         audioActiveDevice_.NotifyUserSelectionEventToBt(deviceDescriptor);
1747     }
1748 }
1749 
HasLowLatencyCapability(DeviceType deviceType,bool isRemote)1750 bool AudioDeviceCommon::HasLowLatencyCapability(DeviceType deviceType, bool isRemote)
1751 {
1752     // Distributed devices are low latency devices
1753     if (isRemote) {
1754         return true;
1755     }
1756 
1757     switch (deviceType) {
1758         case DeviceType::DEVICE_TYPE_EARPIECE:
1759         case DeviceType::DEVICE_TYPE_SPEAKER:
1760         case DeviceType::DEVICE_TYPE_WIRED_HEADSET:
1761         case DeviceType::DEVICE_TYPE_WIRED_HEADPHONES:
1762         case DeviceType::DEVICE_TYPE_USB_HEADSET:
1763         case DeviceType::DEVICE_TYPE_DP:
1764             return true;
1765 
1766         case DeviceType::DEVICE_TYPE_BLUETOOTH_SCO:
1767         case DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP:
1768             return false;
1769         default:
1770             return false;
1771     }
1772 }
1773 
GetSpatialDeviceType(const std::string & macAddress)1774 DeviceType AudioDeviceCommon::GetSpatialDeviceType(const std::string& macAddress)
1775 {
1776     auto it = spatialDeviceMap_.find(macAddress);
1777     DeviceType spatialDevice;
1778     if (it != spatialDeviceMap_.end()) {
1779         spatialDevice = it->second;
1780     } else {
1781         AUDIO_DEBUG_LOG("we can't find the spatialDevice of hvs");
1782         spatialDevice = DEVICE_TYPE_NONE;
1783     }
1784     AUDIO_INFO_LOG("Update a2dpOffloadFlag spatialDevice: %{public}d", spatialDevice);
1785     return spatialDevice;
1786 }
1787 
GetHasDpFlag()1788 bool AudioDeviceCommon::GetHasDpFlag()
1789 {
1790     return hasDpDevice_;
1791 }
1792 
SetHasDpFlag(bool flag)1793 void AudioDeviceCommon::SetHasDpFlag(bool flag)
1794 {
1795     hasDpDevice_ = flag;
1796 }
1797 
IsStopOrReleasePlayback(AudioMode & mode,RendererState rendererState)1798 bool AudioDeviceCommon::IsStopOrReleasePlayback(AudioMode &mode, RendererState rendererState)
1799 {
1800     if (mode != AUDIO_MODE_PLAYBACK) {
1801         return false;
1802     }
1803     if (rendererState != RENDERER_STOPPED && rendererState != RENDERER_RELEASED) {
1804         return false;
1805     }
1806     return true;
1807 }
1808 
UpdateTracker(AudioMode & mode,AudioStreamChangeInfo & streamChangeInfo,RendererState rendererState)1809 void AudioDeviceCommon::UpdateTracker(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo,
1810     RendererState rendererState)
1811 {
1812     const StreamUsage streamUsage = streamChangeInfo.audioRendererChangeInfo.rendererInfo.streamUsage;
1813     if (rendererState == RENDERER_RELEASED && !streamCollector_.ExistStreamForPipe(PIPE_TYPE_MULTICHANNEL)) {
1814         audioOffloadStream_.UnloadMchModule();
1815     }
1816 
1817     if (mode == AUDIO_MODE_PLAYBACK && (rendererState == RENDERER_STOPPED || rendererState == RENDERER_PAUSED ||
1818         rendererState == RENDERER_RELEASED)) {
1819         audioDeviceManager_.UpdateDefaultOutputDeviceWhenStopping(streamChangeInfo.audioRendererChangeInfo.sessionId);
1820         if (rendererState == RENDERER_RELEASED) {
1821             audioDeviceManager_.RemoveSelectedDefaultOutputDevice(streamChangeInfo.audioRendererChangeInfo.sessionId);
1822         }
1823         FetchDevice(true);
1824     }
1825 
1826     if (enableDualHalToneState_ && (mode == AUDIO_MODE_PLAYBACK)
1827         && (rendererState == RENDERER_STOPPED || rendererState == RENDERER_RELEASED)) {
1828         const int32_t sessionId = streamChangeInfo.audioRendererChangeInfo.sessionId;
1829         if ((sessionId == enableDualHalToneSessionId_) && Util::IsRingerOrAlarmerStreamUsage(streamUsage)) {
1830             AUDIO_INFO_LOG("disable dual hal tone when ringer/alarm renderer stop/release.");
1831             UpdateDualToneState(false, enableDualHalToneSessionId_);
1832         }
1833     }
1834     if (isRingDualToneOnPrimarySpeaker_ && IsStopOrReleasePlayback(mode, rendererState) &&
1835         Util::IsRingerOrAlarmerStreamUsage(streamUsage)) {
1836         AUDIO_INFO_LOG("disable primary speaker dual tone when ringer renderer stop/release.");
1837         isRingDualToneOnPrimarySpeaker_ = false;
1838         FetchDevice(true);
1839         for (std::pair<AudioStreamType, StreamUsage> stream : streamsWhenRingDualOnPrimarySpeaker_) {
1840             audioPolicyManager_.SetStreamMute(stream.first, false, stream.second);
1841         }
1842         streamsWhenRingDualOnPrimarySpeaker_.clear();
1843     }
1844 }
1845 
IsDeviceConnected(std::shared_ptr<AudioDeviceDescriptor> & audioDeviceDescriptors) const1846 bool AudioDeviceCommon::IsDeviceConnected(std::shared_ptr<AudioDeviceDescriptor> &audioDeviceDescriptors) const
1847 {
1848     return audioDeviceManager_.IsDeviceConnected(audioDeviceDescriptors);
1849 }
1850 
IsSameDevice(std::shared_ptr<AudioDeviceDescriptor> & desc,AudioDeviceDescriptor & deviceInfo)1851 bool AudioDeviceCommon::IsSameDevice(std::shared_ptr<AudioDeviceDescriptor> &desc, AudioDeviceDescriptor &deviceInfo)
1852 {
1853     if (desc->networkId_ == deviceInfo.networkId_ && desc->deviceType_ == deviceInfo.deviceType_ &&
1854         desc->macAddress_ == deviceInfo.macAddress_ && desc->connectState_ == deviceInfo.connectState_) {
1855         if (deviceInfo.IsAudioDeviceDescriptor()) {
1856             return true;
1857         }
1858         BluetoothOffloadState state = audioA2dpOffloadFlag_.GetA2dpOffloadFlag();
1859         if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP &&
1860             // switch to A2dp
1861             ((deviceInfo.a2dpOffloadFlag_ == A2DP_OFFLOAD && state != A2DP_OFFLOAD) ||
1862             // switch to A2dp offload
1863             (deviceInfo.a2dpOffloadFlag_ != A2DP_OFFLOAD && state == A2DP_OFFLOAD))) {
1864             return false;
1865         }
1866         if (IsUsb(desc->deviceType_)) {
1867             return desc->deviceRole_ == deviceInfo.deviceRole_;
1868         }
1869         return true;
1870     } else {
1871         return false;
1872     }
1873 }
1874 
IsSameDevice(std::shared_ptr<AudioDeviceDescriptor> & desc,const AudioDeviceDescriptor & deviceDesc)1875 bool AudioDeviceCommon::IsSameDevice(std::shared_ptr<AudioDeviceDescriptor> &desc,
1876     const AudioDeviceDescriptor &deviceDesc)
1877 {
1878     if (desc->networkId_ == deviceDesc.networkId_ && desc->deviceType_ == deviceDesc.deviceType_ &&
1879         desc->macAddress_ == deviceDesc.macAddress_ && desc->connectState_ == deviceDesc.connectState_ &&
1880         (!IsUsb(desc->deviceType_) || desc->deviceRole_ == deviceDesc.deviceRole_)) {
1881         return true;
1882     } else {
1883         return false;
1884     }
1885 }
1886 
GetSourceOutputs()1887 std::vector<SourceOutput> AudioDeviceCommon::GetSourceOutputs()
1888 {
1889     std::vector<SourceOutput> sourceOutputs;
1890     {
1891         std::unordered_map<std::string, AudioIOHandle> mapCopy = AudioIOHandleMap::GetInstance().GetCopy();
1892         if (std::any_of(mapCopy.cbegin(), mapCopy.cend(), [](const auto &pair) {
1893                 return std::find(SourceNames.cbegin(), SourceNames.cend(), pair.first) != SourceNames.cend();
1894             })) {
1895             sourceOutputs = audioPolicyManager_.GetAllSourceOutputs();
1896         }
1897     }
1898     return sourceOutputs;
1899 }
1900 
BluetoothScoDisconectForRecongnition()1901 void AudioDeviceCommon::BluetoothScoDisconectForRecongnition()
1902 {
1903     AudioDeviceDescriptor tempDesc = audioActiveDevice_.GetCurrentInputDevice();
1904     AUDIO_INFO_LOG("Recongnition scoCategory: %{public}d, deviceType: %{public}d, scoState: %{public}d",
1905         Bluetooth::AudioHfpManager::GetScoCategory(), tempDesc.deviceType_,
1906         audioDeviceManager_.GetScoState());
1907     if (tempDesc.deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
1908         int32_t ret = ScoInputDeviceFetchedForRecongnition(false, tempDesc.macAddress_,
1909             tempDesc.connectState_);
1910         CHECK_AND_RETURN_LOG(ret == SUCCESS, "sco [%{public}s] disconnected failed",
1911             GetEncryptAddr(tempDesc.macAddress_).c_str());
1912     }
1913 }
1914 
ClientDiedDisconnectScoNormal()1915 void AudioDeviceCommon::ClientDiedDisconnectScoNormal()
1916 {
1917     DeviceType deviceType = audioActiveDevice_.GetCurrentOutputDeviceType();
1918     bool hasRunningRendererStream = streamCollector_.HasRunningRendererStream();
1919     if (hasRunningRendererStream && deviceType == DEVICE_TYPE_BLUETOOTH_SCO) {
1920         return;
1921     }
1922     AUDIO_WARNING_LOG("Client died disconnect sco for normal");
1923     Bluetooth::AudioHfpManager::DisconnectSco();
1924     Bluetooth::AudioHfpManager::SetVirtualCall(true);
1925 }
1926 
ClientDiedDisconnectScoRecognition()1927 void AudioDeviceCommon::ClientDiedDisconnectScoRecognition()
1928 {
1929     bool hasRunningRecognitionCapturerStream = streamCollector_.HasRunningRecognitionCapturerStream();
1930     if (hasRunningRecognitionCapturerStream) {
1931         return;
1932     }
1933     AudioDeviceDescriptor tempDesc = audioActiveDevice_.GetCurrentInputDevice();
1934     if (tempDesc.deviceType_ != DEVICE_TYPE_BLUETOOTH_SCO) {
1935         return;
1936     }
1937     if (Bluetooth::AudioHfpManager::GetScoCategory() == Bluetooth::ScoCategory::SCO_RECOGNITION ||
1938         Bluetooth::AudioHfpManager::GetRecognitionStatus() == Bluetooth::RecognitionStatus::RECOGNITION_CONNECTING) {
1939         AUDIO_WARNING_LOG("Client died disconnect sco for recognition");
1940         BluetoothScoDisconectForRecongnition();
1941         Bluetooth::AudioHfpManager::ClearRecongnitionStatus();
1942     }
1943 }
1944 
GetA2dpModuleInfo(AudioModuleInfo & moduleInfo,const AudioStreamInfo & audioStreamInfo,SourceType sourceType)1945 void AudioDeviceCommon::GetA2dpModuleInfo(AudioModuleInfo &moduleInfo, const AudioStreamInfo& audioStreamInfo,
1946     SourceType sourceType)
1947 {
1948     uint32_t bufferSize = audioStreamInfo.samplingRate *
1949         AudioPolicyUtils::GetInstance().PcmFormatToBytes(audioStreamInfo.format) *
1950         audioStreamInfo.channels / BT_BUFFER_ADJUSTMENT_FACTOR;
1951     AUDIO_INFO_LOG("a2dp rate: %{public}d, format: %{public}d, channel: %{public}d",
1952         audioStreamInfo.samplingRate, audioStreamInfo.format, audioStreamInfo.channels);
1953     moduleInfo.channels = to_string(audioStreamInfo.channels);
1954     moduleInfo.rate = to_string(audioStreamInfo.samplingRate);
1955     moduleInfo.format = AudioPolicyUtils::GetInstance().ConvertToHDIAudioFormat(audioStreamInfo.format);
1956     moduleInfo.bufferSize = to_string(bufferSize);
1957     if (moduleInfo.role != "source") {
1958         moduleInfo.renderInIdleState = "1";
1959         moduleInfo.sinkLatency = "0";
1960     }
1961     audioEcManager_.UpdateStreamEcAndMicRefInfo(moduleInfo, sourceType);
1962 }
1963 
LoadA2dpModule(DeviceType deviceType,const AudioStreamInfo & audioStreamInfo,std::string networkID,std::string sinkName,SourceType sourceType)1964 int32_t AudioDeviceCommon::LoadA2dpModule(DeviceType deviceType, const AudioStreamInfo &audioStreamInfo,
1965     std::string networkID, std::string sinkName, SourceType sourceType)
1966 {
1967     std::list<AudioModuleInfo> moduleInfoList;
1968     bool ret = audioConfigManager_.GetModuleListByType(ClassType::TYPE_A2DP, moduleInfoList);
1969     CHECK_AND_RETURN_RET_LOG(ret, ERR_OPERATION_FAILED,
1970         "A2dp module is not exist in the configuration file");
1971 
1972     // not load bt_a2dp_fast and bt_hdap, maybe need fix
1973     int32_t loadRet = AudioServerProxy::GetInstance().LoadHdiAdapterProxy(HDI_DEVICE_MANAGER_TYPE_BLUETOOTH, "bt_a2dp");
1974     if (loadRet) {
1975         AUDIO_ERR_LOG("load adapter fail");
1976     }
1977     for (auto &moduleInfo : moduleInfoList) {
1978         DeviceRole configRole = moduleInfo.role == "source" ? INPUT_DEVICE : OUTPUT_DEVICE;
1979         DeviceRole deviceRole = deviceType == DEVICE_TYPE_BLUETOOTH_A2DP ? OUTPUT_DEVICE : INPUT_DEVICE;
1980         AUDIO_INFO_LOG("Load a2dp module [%{public}s], load role[%{public}d], config role[%{public}d]",
1981             moduleInfo.name.c_str(), deviceRole, configRole);
1982         if (configRole != deviceRole) {continue;}
1983         if (audioIOHandleMap_.CheckIOHandleExist(moduleInfo.name) == false) {
1984             // a2dp device connects for the first time
1985             GetA2dpModuleInfo(moduleInfo, audioStreamInfo, sourceType);
1986             AudioIOHandle ioHandle = audioPolicyManager_.OpenAudioPort(moduleInfo);
1987             CHECK_AND_RETURN_RET_LOG(ioHandle != OPEN_PORT_FAILURE, ERR_OPERATION_FAILED,
1988                 "OpenAudioPort failed %{public}d", ioHandle);
1989             audioIOHandleMap_.AddIOHandleInfo(moduleInfo.name, ioHandle);
1990         } else {
1991             // At least one a2dp device is already connected. A new a2dp device is connecting.
1992             // Need to reload a2dp module when switching to a2dp device.
1993             int32_t result = ReloadA2dpAudioPort(moduleInfo, deviceType, audioStreamInfo, networkID, sinkName,
1994                 sourceType);
1995             CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, "ReloadA2dpAudioPort failed %{public}d", result);
1996         }
1997     }
1998 
1999     return SUCCESS;
2000 }
2001 
ReloadA2dpAudioPort(AudioModuleInfo & moduleInfo,DeviceType deviceType,const AudioStreamInfo & audioStreamInfo,std::string networkID,std::string sinkName,SourceType sourceType)2002 int32_t AudioDeviceCommon::ReloadA2dpAudioPort(AudioModuleInfo &moduleInfo, DeviceType deviceType,
2003     const AudioStreamInfo& audioStreamInfo, std::string networkID, std::string sinkName,
2004     SourceType sourceType)
2005 {
2006     AUDIO_INFO_LOG("switch device from a2dp to another a2dp, reload a2dp module");
2007     if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP) {
2008         audioIOHandleMap_.MuteDefaultSinkPort(networkID, sinkName);
2009     }
2010 
2011     // Firstly, unload the existing a2dp sink or source.
2012     std::string portName = BLUETOOTH_SPEAKER;
2013     if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP_IN) {
2014         portName = BLUETOOTH_MIC;
2015     }
2016     AudioIOHandle activateDeviceIOHandle;
2017     audioIOHandleMap_.GetModuleIdByKey(portName, activateDeviceIOHandle);
2018     int32_t result = audioPolicyManager_.CloseAudioPort(activateDeviceIOHandle);
2019     CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result,
2020         "CloseAudioPort failed %{public}d", result);
2021 
2022     // Load a2dp sink or source module again with the configuration of active a2dp device.
2023     GetA2dpModuleInfo(moduleInfo, audioStreamInfo, sourceType);
2024     AudioIOHandle ioHandle = audioPolicyManager_.OpenAudioPort(moduleInfo);
2025     CHECK_AND_RETURN_RET_LOG(ioHandle != OPEN_PORT_FAILURE, ERR_OPERATION_FAILED,
2026         "OpenAudioPort failed %{public}d", ioHandle);
2027     audioIOHandleMap_.AddIOHandleInfo(moduleInfo.name, ioHandle);
2028     return SUCCESS;
2029 }
2030 
SwitchActiveA2dpDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)2031 int32_t AudioDeviceCommon::SwitchActiveA2dpDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
2032 {
2033     CHECK_AND_RETURN_RET_LOG(audioA2dpDevice_.CheckA2dpDeviceExist(deviceDescriptor->macAddress_),
2034         ERR_INVALID_PARAM, "the target A2DP device doesn't exist.");
2035     int32_t result = ERROR;
2036 #ifdef BLUETOOTH_ENABLE
2037     AUDIO_INFO_LOG("a2dp device name [%{public}s]", (deviceDescriptor->deviceName_).c_str());
2038     std::string lastActiveA2dpDevice = audioActiveDevice_.GetActiveBtDeviceMac();
2039     audioActiveDevice_.SetActiveBtDeviceMac(deviceDescriptor->macAddress_);
2040     DeviceType lastDevice = audioPolicyManager_.GetActiveDevice();
2041     audioPolicyManager_.SetActiveDevice(DEVICE_TYPE_BLUETOOTH_A2DP);
2042 
2043     if (Bluetooth::AudioA2dpManager::GetActiveA2dpDevice() == deviceDescriptor->macAddress_ &&
2044         audioIOHandleMap_.CheckIOHandleExist(BLUETOOTH_SPEAKER)) {
2045         AUDIO_WARNING_LOG("a2dp device [%{public}s] is already active",
2046             GetEncryptAddr(deviceDescriptor->macAddress_).c_str());
2047         return SUCCESS;
2048     }
2049 
2050     result = Bluetooth::AudioA2dpManager::SetActiveA2dpDevice(deviceDescriptor->macAddress_);
2051     if (result != SUCCESS) {
2052         audioActiveDevice_.SetActiveBtDeviceMac(lastActiveA2dpDevice);
2053         audioPolicyManager_.SetActiveDevice(lastDevice);
2054         AUDIO_ERR_LOG("Active [%{public}s] failed, using original [%{public}s] device",
2055             GetEncryptAddr(audioActiveDevice_.GetActiveBtDeviceMac()).c_str(),
2056             GetEncryptAddr(lastActiveA2dpDevice).c_str());
2057         return result;
2058     }
2059 
2060     AudioStreamInfo audioStreamInfo = {};
2061     audioActiveDevice_.GetActiveA2dpDeviceStreamInfo(DEVICE_TYPE_BLUETOOTH_A2DP, audioStreamInfo);
2062     std::string networkId = audioActiveDevice_.GetCurrentOutputDeviceNetworkId();
2063     std::string sinkName = AudioPolicyUtils::GetInstance().GetSinkPortName(
2064         audioActiveDevice_.GetCurrentOutputDeviceType());
2065     result = LoadA2dpModule(DEVICE_TYPE_BLUETOOTH_A2DP, audioStreamInfo, networkId, sinkName, SOURCE_TYPE_INVALID);
2066     CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED, "LoadA2dpModule failed %{public}d", result);
2067 #endif
2068     return result;
2069 }
2070 
SetFirstScreenOn()2071 void AudioDeviceCommon::SetFirstScreenOn()
2072 {
2073     isFirstScreenOn_ = true;
2074 }
2075 
SetVirtualCall(const bool isVirtual)2076 int32_t AudioDeviceCommon::SetVirtualCall(const bool isVirtual)
2077 {
2078     return Bluetooth::AudioHfpManager::SetVirtualCall(isVirtual);
2079 }
2080 }
2081 }
2082