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::unique_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
321 int32_t currentDeviceId = audioDevice->deviceId_;
322 if (flag == AdapterDeviceFlag::OUTPUT_DEVICES_FLAG) {
323 if (!GetDeviceIdByDescriptor(audioDevice.get(), currentDeviceId)) {
324 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
325 continue;
326 }
327 }
328 desc->SetDeviceId(currentDeviceId);
329 if (audioDevice->deviceName_.empty()) {
330 desc->SetDeviceName(GetDeviceName(audioDevice->deviceType_));
331 } else {
332 desc->SetDeviceName(audioDevice->deviceName_);
333 }
334 audioDeviceAdapterList.emplace_back(desc);
335 }
336 return audioDeviceAdapterList;
337 }
338
SelectAudioOutputDevice(bool isCallDevice,const std::vector<sptr<AudioDeviceDescriptor>> & device) const339 int32_t AudioSystemManagerAdapterImpl::SelectAudioOutputDevice(
340 bool isCallDevice, const std::vector<sptr<AudioDeviceDescriptor>>& device) const
341 {
342 if (isCallDevice) {
343 sptr<AudioRendererFilter> filter = new (std::nothrow) AudioRendererFilter;
344 if (!filter) {
345 WVLOG_E("AudioSystemManagerAdapterImpl::SelectAudioOutputDevice new filter failed");
346 return AUDIO_ERROR;
347 }
348 filter->rendererInfo.streamUsage = StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION;
349 filter->rendererInfo.rendererFlags = 0;
350 return AudioSystemManager::GetInstance()->SelectOutputDevice(filter, device);
351 }
352 return AudioSystemManager::GetInstance()->SelectOutputDevice(device);
353 }
354
SelectDefaultAudioDevice(bool isCallDevice)355 int32_t AudioSystemManagerAdapterImpl::SelectDefaultAudioDevice(bool isCallDevice)
356 {
357 WVLOG_I("Select default audio output Device.");
358 AudioRendererInfo rendererInfo;
359 rendererInfo.contentType = ContentType::CONTENT_TYPE_SPEECH;
360 rendererInfo.streamUsage =
361 isCallDevice ? StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : StreamUsage::STREAM_USAGE_MUSIC;
362 rendererInfo.rendererFlags = 0;
363 std::vector<sptr<AudioDeviceDescriptor>> defaultOutputDevice;
364 AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, defaultOutputDevice);
365
366 return SelectAudioOutputDevice(isCallDevice, defaultOutputDevice);
367 }
368
SelectAudioDeviceById(int32_t deviceId,bool isInput)369 int32_t AudioSystemManagerAdapterImpl::SelectAudioDeviceById(int32_t deviceId, bool isInput)
370 {
371 WVLOG_I("AudioSystemManagerAdapterImpl::SelectAudioDevice deviceId: %{public}d, isInput: %{public}s", deviceId,
372 isInput ? "true" : "false");
373 if (deviceId == ADAPTER_AUDIO_UNDEFINED_DEVICE_ID) {
374 WVLOG_E("Cannot select undefined audio device.");
375 return AUDIO_ERROR;
376 }
377 bool isCallDevice = false;
378 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
379 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
380 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
381 isCallDevice = true;
382 }
383 if (!isInput && deviceId == ADAPTER_AUDIO_DEFAULT_DEVICE_ID) {
384 return SelectDefaultAudioDevice(isCallDevice);
385 }
386 if (isInput && deviceId == ADAPTER_AUDIO_DEFAULT_DEVICE_ID) {
387 WVLOG_I("Select default audio input Device.");
388 AudioCapturerInfo capturerInfo;
389 capturerInfo.sourceType = AudioStandard::SourceType::SOURCE_TYPE_VOICE_COMMUNICATION;
390 capturerInfo.capturerFlags = 0;
391 std::vector<sptr<AudioDeviceDescriptor>> defaultInputDevice;
392 AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, defaultInputDevice);
393 return AudioSystemManager::GetInstance()->SelectInputDevice(defaultInputDevice);
394 }
395
396 std::vector<std::unique_ptr<AudioDeviceDescriptor>> audioDeviceList;
397 if (isCallDevice) {
398 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
399 isInput ? AudioDeviceUsage::CALL_INPUT_DEVICES : AudioDeviceUsage::CALL_OUTPUT_DEVICES);
400 } else {
401 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
402 isInput ? AudioDeviceUsage::CALL_INPUT_DEVICES : AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
403 }
404 for (auto& device : audioDeviceList) {
405 int32_t currentDeviceId = device->deviceId_;
406 if (!isInput) {
407 if (!GetDeviceIdByDescriptor(device.get(), currentDeviceId)) {
408 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
409 continue;
410 }
411 }
412 if (currentDeviceId == deviceId) {
413 std::vector<sptr<AudioDeviceDescriptor>> selectedAudioDevice { device.release() };
414 return isInput ? AudioSystemManager::GetInstance()->SelectInputDevice(selectedAudioDevice)
415 : SelectAudioOutputDevice(isCallDevice, selectedAudioDevice);
416 }
417 }
418 WVLOG_E("can't find any device by audio device id");
419 return AUDIO_ERROR;
420 }
421
GetDefaultOutputDevice()422 std::shared_ptr<AudioDeviceDescAdapter> AudioSystemManagerAdapterImpl::GetDefaultOutputDevice()
423 {
424 bool isCallDevice = false;
425 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
426 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
427 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
428 isCallDevice = true;
429 }
430 AudioRendererInfo rendererInfo;
431 rendererInfo.contentType = ContentType::CONTENT_TYPE_SPEECH;
432 rendererInfo.streamUsage =
433 isCallDevice ? StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : StreamUsage::STREAM_USAGE_MUSIC;
434 rendererInfo.rendererFlags = 0;
435 std::vector<sptr<AudioDeviceDescriptor>> defaultOutputDevice;
436 AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, defaultOutputDevice);
437
438 if (defaultOutputDevice.empty() || !defaultOutputDevice[0]) {
439 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice failed.");
440 return nullptr;
441 }
442 auto defaultDevice = defaultOutputDevice[0];
443
444 std::shared_ptr<AudioDeviceDescAdapterImpl> desc = std::make_shared<AudioDeviceDescAdapterImpl>();
445 if (!desc) {
446 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice create desc failed");
447 return nullptr;
448 }
449
450 int32_t currentDeviceId = 0;
451 if (!GetDeviceIdByDescriptor(defaultDevice, currentDeviceId)) {
452 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
453 return nullptr;
454 }
455 desc->SetDeviceId(currentDeviceId);
456 if (defaultDevice->deviceName_.empty()) {
457 desc->SetDeviceName(GetDeviceName(defaultDevice->deviceType_));
458 } else {
459 desc->SetDeviceName(defaultDevice->deviceName_);
460 }
461 return desc;
462 }
463
GetDefaultInputDevice()464 std::shared_ptr<AudioDeviceDescAdapter> AudioSystemManagerAdapterImpl::GetDefaultInputDevice()
465 {
466 AudioCapturerInfo capturerInfo;
467 capturerInfo.sourceType = AudioStandard::SourceType::SOURCE_TYPE_VOICE_COMMUNICATION;
468 capturerInfo.capturerFlags = 0;
469 std::vector<sptr<AudioDeviceDescriptor>> defaultInputDevice;
470 AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, defaultInputDevice);
471 if (defaultInputDevice.empty() || !defaultInputDevice[0]) {
472 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultInputDevice failed.");
473 return nullptr;
474 }
475 auto defaultDevice = defaultInputDevice[0];
476
477 std::shared_ptr<AudioDeviceDescAdapterImpl> desc = std::make_shared<AudioDeviceDescAdapterImpl>();
478 if (!desc) {
479 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice create desc failed");
480 return nullptr;
481 }
482
483 int32_t currentDeviceId = 0;
484 if (!GetDeviceIdByDescriptor(defaultDevice, currentDeviceId)) {
485 WVLOG_E("AudioSystemManagerAdapterImpl::invalid audio device descriptor");
486 return nullptr;
487 }
488 desc->SetDeviceId(currentDeviceId);
489 if (defaultDevice->deviceName_.empty()) {
490 desc->SetDeviceName(GetDeviceName(defaultDevice->deviceType_));
491 } else {
492 desc->SetDeviceName(defaultDevice->deviceName_);
493 }
494 return desc;
495 }
496
SetLanguage(const std::string & language)497 bool AudioSystemManagerAdapterImpl::SetLanguage(const std::string& language)
498 {
499 if (language.empty()) {
500 WVLOG_E("SetLanguage language is nullptr");
501 return false;
502 }
503 language_ = language;
504 return true;
505 }
506
SetDeviceChangeCallback(std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> callback)507 int32_t AudioSystemManagerAdapterImpl::SetDeviceChangeCallback(
508 std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> callback)
509 {
510 if (callback == nullptr) {
511 WVLOG_E("audio device change callback is nullptr");
512 return AUDIO_NULL_ERROR;
513 }
514 DeviceFlag deviceFlag = DeviceFlag::OUTPUT_DEVICES_FLAG;
515 deviceChangeCallback_ = std::make_shared<AudioManagerDeviceChangeCallbackAdapterImpl>(callback);
516 if (deviceChangeCallback_ == nullptr) {
517 WVLOG_E("audio device change callback impl is nullptr");
518 return AUDIO_NULL_ERROR;
519 }
520 int32_t ret = AudioSystemManager::GetInstance()->SetDeviceChangeCallback(deviceFlag, deviceChangeCallback_);
521 if (ret != AudioStandard::SUCCESS) {
522 WVLOG_E("audio manager set audio device change callback failed, code: %{public}d", ret);
523 return AUDIO_ERROR;
524 }
525 return AUDIO_OK;
526 }
527
UnsetDeviceChangeCallback()528 int32_t AudioSystemManagerAdapterImpl::UnsetDeviceChangeCallback()
529 {
530 int32_t ret = AudioSystemManager::GetInstance()->UnsetDeviceChangeCallback();
531 return ret;
532 }
533
GetStreamType(AudioAdapterStreamType streamType)534 AudioStreamType AudioSystemManagerAdapterImpl::GetStreamType(AudioAdapterStreamType streamType)
535 {
536 auto item = STREAM_TYPE_MAP.find(streamType);
537 if (item == STREAM_TYPE_MAP.end()) {
538 WVLOG_E("audio stream type not found");
539 return AudioStreamType::STREAM_DEFAULT;
540 }
541 return item->second;
542 }
543 } // namespace OHOS::NWeb
544