• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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