• 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::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