1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_system_manager_adapter_impl.h"
17 #include "audio_device_desc_adapter_impl.h"
18
19 #include <unordered_map>
20
21 #include "audio_errors.h"
22 #include "audio_renderer_adapter_impl.h"
23 #include "nweb_log.h"
24
25 namespace OHOS::NWeb {
26 const std::unordered_map<AudioAdapterStreamType, AudioStreamType> STREAM_TYPE_MAP = {
27 { AudioAdapterStreamType::STREAM_DEFAULT, AudioStreamType::STREAM_DEFAULT },
28 { AudioAdapterStreamType::STREAM_VOICE_CALL, AudioStreamType::STREAM_VOICE_CALL },
29 { AudioAdapterStreamType::STREAM_MUSIC, AudioStreamType::STREAM_MUSIC },
30 { AudioAdapterStreamType::STREAM_RING, AudioStreamType::STREAM_RING },
31 { AudioAdapterStreamType::STREAM_MEDIA, AudioStreamType::STREAM_MEDIA },
32 { AudioAdapterStreamType::STREAM_VOICE_ASSISTANT, AudioStreamType::STREAM_VOICE_ASSISTANT },
33 { AudioAdapterStreamType::STREAM_SYSTEM, AudioStreamType::STREAM_SYSTEM },
34 { AudioAdapterStreamType::STREAM_ALARM, AudioStreamType::STREAM_ALARM },
35 { AudioAdapterStreamType::STREAM_NOTIFICATION, AudioStreamType::STREAM_NOTIFICATION },
36 { AudioAdapterStreamType::STREAM_BLUETOOTH_SCO, AudioStreamType::STREAM_BLUETOOTH_SCO },
37 { AudioAdapterStreamType::STREAM_ENFORCED_AUDIBLE, AudioStreamType::STREAM_ENFORCED_AUDIBLE },
38 { AudioAdapterStreamType::STREAM_DTMF, AudioStreamType::STREAM_DTMF },
39 { AudioAdapterStreamType::STREAM_TTS, AudioStreamType::STREAM_TTS },
40 { AudioAdapterStreamType::STREAM_ACCESSIBILITY, AudioStreamType::STREAM_ACCESSIBILITY },
41 { AudioAdapterStreamType::STREAM_RECORDING, AudioStreamType::STREAM_RECORDING },
42 { AudioAdapterStreamType::STREAM_ALL, AudioStreamType::STREAM_ALL },
43 };
44
45 const std::string DEVICE_TYPE_NONE = "device/none";
46 const std::string DEVICE_TYPE_INVALID = "device/invalid";
47 const std::string DEVICE_TYPE_EARPIECE = "device/earpiece";
48 const std::string DEVICE_TYPE_SPEAKER = "device/speaker";
49 const std::string DEVICE_TYPE_WIRED_HEADSET = "device/wired_headset";
50 const std::string DEVICE_TYPE_WIRED_HEADPHONES = "device/wired_headphones";
51 const std::string DEVICE_TYPE_BLUETOOTH_SCO = "device/bluetooth_sco";
52 const std::string DEVICE_TYPE_BLUETOOTH_A2DP = "device/bluetooth_a2dp";
53 const std::string DEVICE_TYPE_MIC = "device/mic";
54 const std::string DEVICE_TYPE_USB_HEADSET = "device/usb_headset";
55 const std::string DEVICE_TYPE_FILE_SINK = "device/file_sink";
56 const std::string DEVICE_TYPE_FILE_SOURCE = "device/file_source";
57 const std::string DEVICE_TYPE_MAX = "device/max";
58
59 const std::string DEVICE_TYPE_NONE_ZH_CN = "无";
60 const std::string DEVICE_TYPE_INVALID_ZH_CN = "未知设备";
61 const std::string DEVICE_TYPE_EARPIECE_ZH_CN = "耳机";
62 const std::string DEVICE_TYPE_SPEAKER_ZH_CN = "扬声器";
63 const std::string DEVICE_TYPE_WIRED_HEADSET_ZH_CN = "有线耳麦";
64 const std::string DEVICE_TYPE_WIRED_HEADPHONES_ZH_CN = "头戴式耳机";
65 const std::string DEVICE_TYPE_BLUETOOTH_SCO_ZH_CN = "未知耳机";
66 const std::string DEVICE_TYPE_BLUETOOTH_A2DP_ZH_CN = "未知耳机";
67 const std::string DEVICE_TYPE_MIC_ZH_CN = "麦克风";
68 const std::string DEVICE_TYPE_USB_HEADSET_ZH_CN = "USB 耳机";
69 const std::string DEVICE_TYPE_FILE_SINK_ZH_CN = "device/file_sink";
70 const std::string DEVICE_TYPE_FILE_SOURCE_ZH_CN = "device/file_source";
71 const std::string DEVICE_TYPE_MAX_ZH_CN = "device/max";
72
73 const std::unordered_map<DeviceType, std::string> DEVICE_TYPE_NAME_ZH_CN_MAP = {
74 { DeviceType::DEVICE_TYPE_NONE, DEVICE_TYPE_NONE_ZH_CN},
75 { DeviceType::DEVICE_TYPE_INVALID, DEVICE_TYPE_INVALID_ZH_CN},
76 { DeviceType::DEVICE_TYPE_EARPIECE, DEVICE_TYPE_EARPIECE_ZH_CN},
77 { DeviceType::DEVICE_TYPE_SPEAKER, DEVICE_TYPE_SPEAKER_ZH_CN},
78 { DeviceType::DEVICE_TYPE_WIRED_HEADSET, DEVICE_TYPE_WIRED_HEADSET_ZH_CN},
79 { DeviceType::DEVICE_TYPE_WIRED_HEADPHONES, DEVICE_TYPE_WIRED_HEADPHONES_ZH_CN},
80 { DeviceType::DEVICE_TYPE_BLUETOOTH_SCO, DEVICE_TYPE_BLUETOOTH_SCO_ZH_CN},
81 { DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP, DEVICE_TYPE_BLUETOOTH_A2DP_ZH_CN},
82 { DeviceType::DEVICE_TYPE_MIC, DEVICE_TYPE_MIC_ZH_CN},
83 { DeviceType::DEVICE_TYPE_USB_HEADSET, DEVICE_TYPE_USB_HEADSET_ZH_CN},
84 { DeviceType::DEVICE_TYPE_FILE_SINK, DEVICE_TYPE_FILE_SINK_ZH_CN},
85 { DeviceType::DEVICE_TYPE_FILE_SOURCE, DEVICE_TYPE_FILE_SOURCE_ZH_CN},
86 { DeviceType::DEVICE_TYPE_MAX, DEVICE_TYPE_MAX_ZH_CN},
87 };
88
89 const std::unordered_map<DeviceType, std::string> DEVICE_TYPE_MAP = {
90 { DeviceType::DEVICE_TYPE_NONE, DEVICE_TYPE_NONE },
91 { DeviceType::DEVICE_TYPE_INVALID, DEVICE_TYPE_INVALID },
92 { DeviceType::DEVICE_TYPE_EARPIECE, DEVICE_TYPE_EARPIECE },
93 { DeviceType::DEVICE_TYPE_SPEAKER, DEVICE_TYPE_SPEAKER },
94 { DeviceType::DEVICE_TYPE_WIRED_HEADSET, DEVICE_TYPE_WIRED_HEADSET },
95 { DeviceType::DEVICE_TYPE_WIRED_HEADPHONES, DEVICE_TYPE_WIRED_HEADPHONES },
96 { DeviceType::DEVICE_TYPE_BLUETOOTH_SCO, DEVICE_TYPE_BLUETOOTH_SCO },
97 { DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP, DEVICE_TYPE_BLUETOOTH_A2DP },
98 { DeviceType::DEVICE_TYPE_MIC, DEVICE_TYPE_MIC },
99 { DeviceType::DEVICE_TYPE_USB_HEADSET, DEVICE_TYPE_USB_HEADSET },
100 { DeviceType::DEVICE_TYPE_FILE_SINK, DEVICE_TYPE_FILE_SINK },
101 { DeviceType::DEVICE_TYPE_FILE_SOURCE, DEVICE_TYPE_FILE_SOURCE },
102 { DeviceType::DEVICE_TYPE_MAX, DEVICE_TYPE_MAX },
103 };
104
105 const int32_t ADAPTER_AUDIO_DEFAULT_DEVICE_ID = 1000000;
106 const int32_t ADAPTER_AUDIO_UNDEFINED_DEVICE_ID = 1000001;
107 const char* ADAPTER_AUDIO_DEFAULT_DEVICE_NAME = "(default)";
108 const char* ADAPTER_AUDIO_UNDEFINED_DEVICE_NAME = "(undefined)";
109
AudioManagerCallbackAdapterImpl(std::shared_ptr<AudioManagerCallbackAdapter> cb)110 AudioManagerCallbackAdapterImpl::AudioManagerCallbackAdapterImpl(std::shared_ptr<AudioManagerCallbackAdapter> cb)
111 : cb_(cb) {};
112
OnInterrupt(const InterruptAction & interruptAction)113 void AudioManagerCallbackAdapterImpl::OnInterrupt(const InterruptAction& interruptAction)
114 {
115 if (!cb_) {
116 return;
117 }
118 switch (interruptAction.interruptHint) {
119 case InterruptHint::INTERRUPT_HINT_PAUSE:
120 case InterruptHint::INTERRUPT_HINT_STOP:
121 cb_->OnSuspend();
122 break;
123 case InterruptHint::INTERRUPT_HINT_RESUME:
124 cb_->OnResume();
125 break;
126 default:
127 WVLOG_E("audio manager interrupt hint not foud, code: %{public}d", interruptAction.interruptHint);
128 break;
129 }
130 }
131
AudioManagerDeviceChangeCallbackAdapterImpl(std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> cb)132 AudioManagerDeviceChangeCallbackAdapterImpl::AudioManagerDeviceChangeCallbackAdapterImpl(
133 std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> cb)
134 : cb_(cb) {};
135
OnDeviceChange(const DeviceChangeAction & deviceChangeAction)136 void AudioManagerDeviceChangeCallbackAdapterImpl::OnDeviceChange(const DeviceChangeAction& deviceChangeAction)
137 {
138 if (!cb_) {
139 return;
140 }
141 cb_->OnDeviceChange();
142 }
143
GetInstance()144 AudioSystemManagerAdapterImpl& AudioSystemManagerAdapterImpl::GetInstance()
145 {
146 static AudioSystemManagerAdapterImpl instance;
147 return instance;
148 }
149
GetDeviceIdByDescriptor(AudioDeviceDescriptor * audioDeviceDescriptor,int32_t & deviceId)150 bool AudioSystemManagerAdapterImpl::GetDeviceIdByDescriptor(
151 AudioDeviceDescriptor* audioDeviceDescriptor, int32_t& deviceId)
152 {
153 if (audioDeviceDescriptor == nullptr) {
154 return false;
155 }
156 WVLOG_I("GetDeviceIdByDescriptor: deviceId: %{public}d", deviceId);
157 WVLOG_I("GetDeviceIdByDescriptor: deviceType: %{public}d", audioDeviceDescriptor->deviceType_);
158 if (audioOutputDeviceInfo_.empty()) {
159 deviceId = 1;
160 AudioDeviceDescriptor newDevice(*audioDeviceDescriptor);
161 audioOutputDeviceInfo_.emplace(std::make_pair(deviceId, newDevice));
162 return true;
163 }
164
165 auto it = audioOutputDeviceInfo_.begin();
166 int32_t newDeviceId = 0;
167 while (it != audioOutputDeviceInfo_.end()) {
168 if (audioDeviceDescriptor->IsSameDeviceDesc(it->second)) {
169 deviceId = it->first;
170 return true;
171 }
172 if ((audioDeviceDescriptor->deviceType_ == DeviceType::DEVICE_TYPE_BLUETOOTH_SCO ||
173 audioDeviceDescriptor->deviceType_ == DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP) &&
174 (audioDeviceDescriptor->macAddress_ == it->second.macAddress_)) {
175 deviceId = it->first;
176 it = audioOutputDeviceInfo_.erase(it);
177 AudioDeviceDescriptor newDevice(*audioDeviceDescriptor);
178 audioOutputDeviceInfo_.emplace(std::make_pair(deviceId, newDevice));
179 return true;
180 }
181 newDeviceId = it->first;
182 it++;
183 }
184 deviceId = newDeviceId + 1;
185 AudioDeviceDescriptor newDevice(*audioDeviceDescriptor);
186 audioOutputDeviceInfo_.emplace(std::make_pair(deviceId, newDevice));
187 return true;
188 }
189
HasAudioOutputDevices()190 bool AudioSystemManagerAdapterImpl::HasAudioOutputDevices()
191 {
192 DeviceType outputDeviceType = AudioSystemManager::GetInstance()->GetActiveOutputDevice();
193 if (outputDeviceType == DeviceType::DEVICE_TYPE_NONE || outputDeviceType == DeviceType::DEVICE_TYPE_INVALID) {
194 return false;
195 }
196 return true;
197 }
198
HasAudioInputDevices()199 bool AudioSystemManagerAdapterImpl::HasAudioInputDevices()
200 {
201 DeviceType inputDeviceType = AudioSystemManager::GetInstance()->GetActiveInputDevice();
202 if (inputDeviceType == DeviceType::DEVICE_TYPE_NONE || inputDeviceType == DeviceType::DEVICE_TYPE_INVALID) {
203 return false;
204 }
205 return true;
206 }
207
RequestAudioFocus(const std::shared_ptr<AudioInterruptAdapter> audioInterrupt)208 int32_t AudioSystemManagerAdapterImpl::RequestAudioFocus(const std::shared_ptr<AudioInterruptAdapter> audioInterrupt)
209 {
210 if (!audioInterrupt) {
211 WVLOG_E("audio request audio focus failed, audioInterrupt is null");
212 return AUDIO_ERROR;
213 }
214
215 AudioInterrupt interruptParams;
216 interruptParams.streamUsage = AudioRendererAdapterImpl::GetAudioStreamUsage(audioInterrupt->GetStreamUsage());
217 interruptParams.contentType = AudioRendererAdapterImpl::GetAudioContentType(audioInterrupt->GetContentType());
218 interruptParams.audioFocusType.streamType = GetStreamType(audioInterrupt->GetStreamType());
219
220 int32_t ret = AudioSystemManager::GetInstance()->RequestAudioFocus(interruptParams);
221 if (ret != AudioStandard::SUCCESS) {
222 WVLOG_E("audio request audio focus failed, code: %{public}d", ret);
223 return AUDIO_ERROR;
224 }
225 return AUDIO_OK;
226 }
227
AbandonAudioFocus(const std::shared_ptr<AudioInterruptAdapter> audioInterrupt)228 int32_t AudioSystemManagerAdapterImpl::AbandonAudioFocus(const std::shared_ptr<AudioInterruptAdapter> audioInterrupt)
229 {
230 if (!audioInterrupt) {
231 WVLOG_E("audio abandon audio focus failed, audioInterrupt is null");
232 return AUDIO_ERROR;
233 }
234
235 AudioInterrupt interruptParams;
236 interruptParams.streamUsage = AudioRendererAdapterImpl::GetAudioStreamUsage(audioInterrupt->GetStreamUsage());
237 interruptParams.contentType = AudioRendererAdapterImpl::GetAudioContentType(audioInterrupt->GetContentType());
238 interruptParams.audioFocusType.streamType = GetStreamType(audioInterrupt->GetStreamType());
239
240 int32_t ret = AudioSystemManager::GetInstance()->AbandonAudioFocus(interruptParams);
241 if (ret != AudioStandard::SUCCESS) {
242 WVLOG_E("audio abandon audio focus failed, code: %{public}d", ret);
243 return AUDIO_ERROR;
244 }
245 return AUDIO_OK;
246 }
247
SetAudioManagerInterruptCallback(std::shared_ptr<AudioManagerCallbackAdapter> callback)248 int32_t AudioSystemManagerAdapterImpl::SetAudioManagerInterruptCallback(
249 std::shared_ptr<AudioManagerCallbackAdapter> callback)
250 {
251 if (callback == nullptr) {
252 WVLOG_E("set audio manager interrupt callback is nullptr");
253 return AUDIO_NULL_ERROR;
254 }
255 callback_ = std::make_shared<AudioManagerCallbackAdapterImpl>(callback);
256
257 int32_t ret = AudioSystemManager::GetInstance()->SetAudioManagerInterruptCallback(callback_);
258 if (ret != AudioStandard::SUCCESS) {
259 WVLOG_E("audio manager set interrupt callback failed, code: %{public}d", ret);
260 return AUDIO_ERROR;
261 }
262 return AUDIO_OK;
263 }
264
UnsetAudioManagerInterruptCallback()265 int32_t AudioSystemManagerAdapterImpl::UnsetAudioManagerInterruptCallback()
266 {
267 int32_t ret = AudioSystemManager::GetInstance()->UnsetAudioManagerInterruptCallback();
268 if (ret != AudioStandard::SUCCESS) {
269 WVLOG_E("audio manager unset interrupt callback failed, code: %{public}d", ret);
270 return AUDIO_ERROR;
271 }
272 callback_ = nullptr;
273 return AUDIO_OK;
274 }
275
GetDeviceName(DeviceType deviceType)276 std::string AudioSystemManagerAdapterImpl::GetDeviceName(DeviceType deviceType)
277 {
278 WVLOG_I("GetDeviceName language: %{public}s", language_.c_str());
279 if (language_ == "zh") {
280 auto deviceTypeKey = DEVICE_TYPE_NAME_ZH_CN_MAP.find(deviceType);
281 if (deviceTypeKey != DEVICE_TYPE_NAME_ZH_CN_MAP.end()) {
282 return deviceTypeKey->second;
283 }
284 return DEVICE_TYPE_NONE_ZH_CN;
285 } else {
286 auto deviceTypeKey = DEVICE_TYPE_MAP.find(deviceType);
287 if (deviceTypeKey != DEVICE_TYPE_MAP.end()) {
288 return deviceTypeKey->second;
289 }
290 return DEVICE_TYPE_NONE;
291 }
292 }
293
GetDevices(AdapterDeviceFlag flag)294 std::vector<std::shared_ptr<AudioDeviceDescAdapter>> AudioSystemManagerAdapterImpl::GetDevices(AdapterDeviceFlag flag)
295 {
296 bool isCallDevice = false;
297 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
298 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
299 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
300 isCallDevice = true;
301 }
302 std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceList;
303 if (flag == AdapterDeviceFlag::OUTPUT_DEVICES_FLAG) {
304 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
305 isCallDevice ? AudioDeviceUsage::CALL_OUTPUT_DEVICES : AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
306 } else if (flag == AdapterDeviceFlag::INPUT_DEVICES_FLAG) {
307 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(AudioDeviceUsage::CALL_INPUT_DEVICES);
308 } else if (flag == AdapterDeviceFlag::ALL_DEVICES_FLAG) {
309 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
310 isCallDevice ? AudioDeviceUsage::ALL_CALL_DEVICES : AudioDeviceUsage::ALL_MEDIA_DEVICES);
311 }
312
313 std::vector<std::shared_ptr<AudioDeviceDescAdapter>> audioDeviceAdapterList;
314 for (auto& audioDevice : audioDeviceList) {
315 std::shared_ptr<AudioDeviceDescAdapterImpl> desc = std::make_shared<AudioDeviceDescAdapterImpl>();
316 if (!desc) {
317 WVLOG_E("AudioSystemManagerAdapterImpl::GetDevices create desc failed");
318 return audioDeviceAdapterList;
319 }
320 int32_t currentDeviceId = audioDevice->deviceId_;
321 if (flag == AdapterDeviceFlag::OUTPUT_DEVICES_FLAG) {
322 if (!GetDeviceIdByDescriptor(audioDevice.get(), currentDeviceId)) {
323 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
324 continue;
325 }
326 }
327 desc->SetDeviceId(currentDeviceId);
328 if (audioDevice->deviceName_.empty()) {
329 desc->SetDeviceName(GetDeviceName(audioDevice->deviceType_));
330 } else {
331 desc->SetDeviceName(audioDevice->deviceName_);
332 }
333 audioDeviceAdapterList.emplace_back(desc);
334 }
335 return audioDeviceAdapterList;
336 }
337
SelectAudioOutputDevice(bool isCallDevice,const std::vector<std::shared_ptr<AudioDeviceDescriptor>> & device) const338 int32_t AudioSystemManagerAdapterImpl::SelectAudioOutputDevice(
339 bool isCallDevice, const std::vector<std::shared_ptr<AudioDeviceDescriptor>>& device) const
340 {
341 if (isCallDevice) {
342 sptr<AudioRendererFilter> filter = new (std::nothrow) AudioRendererFilter;
343 if (!filter) {
344 WVLOG_E("AudioSystemManagerAdapterImpl::SelectAudioOutputDevice new filter failed");
345 return AUDIO_ERROR;
346 }
347 filter->rendererInfo.streamUsage = StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION;
348 filter->rendererInfo.rendererFlags = 0;
349 return AudioSystemManager::GetInstance()->SelectOutputDevice(filter, device);
350 }
351 return AudioSystemManager::GetInstance()->SelectOutputDevice(device);
352 }
353
SelectDefaultAudioDevice(bool isCallDevice)354 int32_t AudioSystemManagerAdapterImpl::SelectDefaultAudioDevice(bool isCallDevice)
355 {
356 WVLOG_I("Select default audio output Device.");
357 AudioRendererInfo rendererInfo;
358 rendererInfo.contentType = ContentType::CONTENT_TYPE_SPEECH;
359 rendererInfo.streamUsage =
360 isCallDevice ? StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : StreamUsage::STREAM_USAGE_MUSIC;
361 rendererInfo.rendererFlags = 0;
362 std::vector<std::shared_ptr<AudioDeviceDescriptor>> defaultOutputDevice;
363 AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, defaultOutputDevice);
364
365 return SelectAudioOutputDevice(isCallDevice, defaultOutputDevice);
366 }
367
SelectAudioDeviceById(int32_t deviceId,bool isInput)368 int32_t AudioSystemManagerAdapterImpl::SelectAudioDeviceById(int32_t deviceId, bool isInput)
369 {
370 WVLOG_I("AudioSystemManagerAdapterImpl::SelectAudioDevice deviceId: %{public}d, isInput: %{public}s", deviceId,
371 isInput ? "true" : "false");
372 if (deviceId == ADAPTER_AUDIO_UNDEFINED_DEVICE_ID) {
373 WVLOG_E("Cannot select undefined audio device.");
374 return AUDIO_ERROR;
375 }
376 bool isCallDevice = false;
377 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
378 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
379 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
380 isCallDevice = true;
381 }
382 if (!isInput && deviceId == ADAPTER_AUDIO_DEFAULT_DEVICE_ID) {
383 return SelectDefaultAudioDevice(isCallDevice);
384 }
385 if (isInput && deviceId == ADAPTER_AUDIO_DEFAULT_DEVICE_ID) {
386 WVLOG_I("Select default audio input Device.");
387 AudioCapturerInfo capturerInfo;
388 capturerInfo.sourceType = AudioStandard::SourceType::SOURCE_TYPE_VOICE_COMMUNICATION;
389 capturerInfo.capturerFlags = 0;
390 std::vector<std::shared_ptr<AudioDeviceDescriptor>> defaultInputDevice;
391 AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, defaultInputDevice);
392 return AudioSystemManager::GetInstance()->SelectInputDevice(defaultInputDevice);
393 }
394
395 std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceList;
396 if (isCallDevice) {
397 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
398 isInput ? AudioDeviceUsage::CALL_INPUT_DEVICES : AudioDeviceUsage::CALL_OUTPUT_DEVICES);
399 } else {
400 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
401 isInput ? AudioDeviceUsage::CALL_INPUT_DEVICES : AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
402 }
403 for (auto& device : audioDeviceList) {
404 int32_t currentDeviceId = device->deviceId_;
405 if (!isInput) {
406 if (!GetDeviceIdByDescriptor(device.get(), currentDeviceId)) {
407 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
408 continue;
409 }
410 }
411 if (currentDeviceId == deviceId) {
412 std::vector<std::shared_ptr<AudioDeviceDescriptor>> selectedAudioDevice { device };
413 return isInput ? AudioSystemManager::GetInstance()->SelectInputDevice(selectedAudioDevice)
414 : SelectAudioOutputDevice(isCallDevice, selectedAudioDevice);
415 }
416 }
417 WVLOG_E("can't find any device by audio device id");
418 return AUDIO_ERROR;
419 }
420
GetDefaultOutputDevice()421 std::shared_ptr<AudioDeviceDescAdapter> AudioSystemManagerAdapterImpl::GetDefaultOutputDevice()
422 {
423 bool isCallDevice = false;
424 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
425 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
426 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
427 isCallDevice = true;
428 }
429 AudioRendererInfo rendererInfo;
430 rendererInfo.contentType = ContentType::CONTENT_TYPE_SPEECH;
431 rendererInfo.streamUsage =
432 isCallDevice ? StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : StreamUsage::STREAM_USAGE_MUSIC;
433 rendererInfo.rendererFlags = 0;
434 std::vector<std::shared_ptr<AudioDeviceDescriptor>> defaultOutputDevice;
435 AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, defaultOutputDevice);
436
437 if (defaultOutputDevice.empty() || !defaultOutputDevice[0]) {
438 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice failed.");
439 return nullptr;
440 }
441 auto defaultDevice = defaultOutputDevice[0];
442
443 std::shared_ptr<AudioDeviceDescAdapterImpl> desc = std::make_shared<AudioDeviceDescAdapterImpl>();
444 if (!desc) {
445 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice create desc failed");
446 return nullptr;
447 }
448
449 int32_t currentDeviceId = 0;
450 if (!GetDeviceIdByDescriptor(defaultDevice.get(), currentDeviceId)) {
451 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
452 return nullptr;
453 }
454 desc->SetDeviceId(currentDeviceId);
455 if (defaultDevice->deviceName_.empty()) {
456 desc->SetDeviceName(GetDeviceName(defaultDevice->deviceType_));
457 } else {
458 desc->SetDeviceName(defaultDevice->deviceName_);
459 }
460 return desc;
461 }
462
GetDefaultInputDevice()463 std::shared_ptr<AudioDeviceDescAdapter> AudioSystemManagerAdapterImpl::GetDefaultInputDevice()
464 {
465 AudioCapturerInfo capturerInfo;
466 capturerInfo.sourceType = AudioStandard::SourceType::SOURCE_TYPE_VOICE_COMMUNICATION;
467 capturerInfo.capturerFlags = 0;
468 std::vector<std::shared_ptr<AudioDeviceDescriptor>> defaultInputDevice;
469 AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, defaultInputDevice);
470 if (defaultInputDevice.empty() || !defaultInputDevice[0]) {
471 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultInputDevice failed.");
472 return nullptr;
473 }
474 auto defaultDevice = defaultInputDevice[0];
475
476 std::shared_ptr<AudioDeviceDescAdapterImpl> desc = std::make_shared<AudioDeviceDescAdapterImpl>();
477 if (!desc) {
478 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice create desc failed");
479 return nullptr;
480 }
481 int32_t currentDeviceId = 0;
482 if (!GetDeviceIdByDescriptor(defaultDevice.get(), currentDeviceId)) {
483 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
484 return nullptr;
485 }
486 desc->SetDeviceId(currentDeviceId);
487 if (defaultDevice->deviceName_.empty()) {
488 desc->SetDeviceName(GetDeviceName(defaultDevice->deviceType_));
489 } else {
490 desc->SetDeviceName(defaultDevice->deviceName_);
491 }
492 return desc;
493 }
494
SetLanguage(const std::string & language)495 bool AudioSystemManagerAdapterImpl::SetLanguage(const std::string& language)
496 {
497 if (language.empty()) {
498 WVLOG_E("SetLanguage language is nullptr");
499 return false;
500 }
501 language_ = language;
502 return true;
503 }
504
SetDeviceChangeCallback(std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> callback)505 int32_t AudioSystemManagerAdapterImpl::SetDeviceChangeCallback(
506 std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> callback)
507 {
508 if (callback == nullptr) {
509 WVLOG_E("audio device change callback is nullptr");
510 return AUDIO_NULL_ERROR;
511 }
512 DeviceFlag deviceFlag = DeviceFlag::OUTPUT_DEVICES_FLAG;
513 deviceChangeCallback_ = std::make_shared<AudioManagerDeviceChangeCallbackAdapterImpl>(callback);
514 if (deviceChangeCallback_ == nullptr) {
515 WVLOG_E("audio device change callback impl is nullptr");
516 return AUDIO_NULL_ERROR;
517 }
518 int32_t ret = AudioSystemManager::GetInstance()->SetDeviceChangeCallback(deviceFlag, deviceChangeCallback_);
519 if (ret != AudioStandard::SUCCESS) {
520 WVLOG_E("audio manager set audio device change callback failed, code: %{public}d", ret);
521 return AUDIO_ERROR;
522 }
523 return AUDIO_OK;
524 }
525
UnsetDeviceChangeCallback()526 int32_t AudioSystemManagerAdapterImpl::UnsetDeviceChangeCallback()
527 {
528 int32_t ret = AudioSystemManager::GetInstance()->UnsetDeviceChangeCallback();
529 return ret;
530 }
531
GetStreamType(AudioAdapterStreamType streamType)532 AudioStreamType AudioSystemManagerAdapterImpl::GetStreamType(AudioAdapterStreamType streamType)
533 {
534 auto item = STREAM_TYPE_MAP.find(streamType);
535 if (item == STREAM_TYPE_MAP.end()) {
536 WVLOG_E("audio stream type not found");
537 return AudioStreamType::STREAM_DEFAULT;
538 }
539 return item->second;
540 }
541 } // namespace OHOS::NWeb
542