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