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
18 #include <unordered_map>
19
20 #include "audio_errors.h"
21 #include "audio_renderer_adapter_impl.h"
22 #include "nweb_log.h"
23
24 namespace OHOS::NWeb {
25 const std::unordered_map<AudioAdapterStreamType, AudioStreamType> STREAM_TYPE_MAP = {
26 { AudioAdapterStreamType::STREAM_DEFAULT, AudioStreamType::STREAM_DEFAULT },
27 { AudioAdapterStreamType::STREAM_VOICE_CALL, AudioStreamType::STREAM_VOICE_CALL },
28 { AudioAdapterStreamType::STREAM_MUSIC, AudioStreamType::STREAM_MUSIC },
29 { AudioAdapterStreamType::STREAM_RING, AudioStreamType::STREAM_RING },
30 { AudioAdapterStreamType::STREAM_MEDIA, AudioStreamType::STREAM_MEDIA },
31 { AudioAdapterStreamType::STREAM_VOICE_ASSISTANT, AudioStreamType::STREAM_VOICE_ASSISTANT },
32 { AudioAdapterStreamType::STREAM_SYSTEM, AudioStreamType::STREAM_SYSTEM },
33 { AudioAdapterStreamType::STREAM_ALARM, AudioStreamType::STREAM_ALARM },
34 { AudioAdapterStreamType::STREAM_NOTIFICATION, AudioStreamType::STREAM_NOTIFICATION },
35 { AudioAdapterStreamType::STREAM_BLUETOOTH_SCO, AudioStreamType::STREAM_BLUETOOTH_SCO },
36 { AudioAdapterStreamType::STREAM_ENFORCED_AUDIBLE, AudioStreamType::STREAM_ENFORCED_AUDIBLE },
37 { AudioAdapterStreamType::STREAM_DTMF, AudioStreamType::STREAM_DTMF },
38 { AudioAdapterStreamType::STREAM_TTS, AudioStreamType::STREAM_TTS },
39 { AudioAdapterStreamType::STREAM_ACCESSIBILITY, AudioStreamType::STREAM_ACCESSIBILITY },
40 { AudioAdapterStreamType::STREAM_RECORDING, AudioStreamType::STREAM_RECORDING },
41 { AudioAdapterStreamType::STREAM_ALL, AudioStreamType::STREAM_ALL },
42 };
43
44 const std::string DEVICE_TYPE_NONE = "device/none";
45 const std::string DEVICE_TYPE_INVALID = "device/invalid";
46 const std::string DEVICE_TYPE_EARPIECE = "device/earpiece";
47 const std::string DEVICE_TYPE_SPEAKER = "device/speaker";
48 const std::string DEVICE_TYPE_WIRED_HEADSET = "device/wired_headset";
49 const std::string DEVICE_TYPE_WIRED_HEADPHONES = "device/wired_headphones";
50 const std::string DEVICE_TYPE_BLUETOOTH_SCO = "device/bluetooth_sco";
51 const std::string DEVICE_TYPE_BLUETOOTH_A2DP = "device/bluetooth_a2dp";
52 const std::string DEVICE_TYPE_MIC = "device/mic";
53 const std::string DEVICE_TYPE_USB_HEADSET = "device/usb_headset";
54 const std::string DEVICE_TYPE_FILE_SINK = "device/file_sink";
55 const std::string DEVICE_TYPE_FILE_SOURCE = "device/file_source";
56 const std::string DEVICE_TYPE_MAX = "device/max";
57
58 const std::unordered_map<DeviceType, std::string> DEVICE_TYPE_MAP = {
59 { DeviceType::DEVICE_TYPE_NONE, DEVICE_TYPE_NONE },
60 { DeviceType::DEVICE_TYPE_INVALID, DEVICE_TYPE_INVALID },
61 { DeviceType::DEVICE_TYPE_EARPIECE, DEVICE_TYPE_EARPIECE },
62 { DeviceType::DEVICE_TYPE_SPEAKER, DEVICE_TYPE_SPEAKER },
63 { DeviceType::DEVICE_TYPE_WIRED_HEADSET, DEVICE_TYPE_WIRED_HEADSET },
64 { DeviceType::DEVICE_TYPE_WIRED_HEADPHONES, DEVICE_TYPE_WIRED_HEADPHONES },
65 { DeviceType::DEVICE_TYPE_BLUETOOTH_SCO, DEVICE_TYPE_BLUETOOTH_SCO },
66 { DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP, DEVICE_TYPE_BLUETOOTH_A2DP },
67 { DeviceType::DEVICE_TYPE_MIC, DEVICE_TYPE_MIC },
68 { DeviceType::DEVICE_TYPE_USB_HEADSET, DEVICE_TYPE_USB_HEADSET },
69 { DeviceType::DEVICE_TYPE_FILE_SINK, DEVICE_TYPE_FILE_SINK },
70 { DeviceType::DEVICE_TYPE_FILE_SOURCE, DEVICE_TYPE_FILE_SOURCE },
71 { DeviceType::DEVICE_TYPE_MAX, DEVICE_TYPE_MAX },
72 };
73
74 const int32_t ADAPTER_AUDIO_DEFAULT_DEVICE_ID = 1000000;
75 const int32_t ADAPTER_AUDIO_UNDEFINED_DEVICE_ID = 1000001;
76 const char* ADAPTER_AUDIO_DEFAULT_DEVICE_NAME = "(default)";
77 const char* ADAPTER_AUDIO_UNDEFINED_DEVICE_NAME = "(undefined)";
78
AudioManagerCallbackAdapterImpl(std::shared_ptr<AudioManagerCallbackAdapter> cb)79 AudioManagerCallbackAdapterImpl::AudioManagerCallbackAdapterImpl(std::shared_ptr<AudioManagerCallbackAdapter> cb)
80 : cb_(cb) {};
81
OnInterrupt(const InterruptAction & interruptAction)82 void AudioManagerCallbackAdapterImpl::OnInterrupt(const InterruptAction& interruptAction)
83 {
84 if (!cb_) {
85 return;
86 }
87 switch (interruptAction.interruptHint) {
88 case InterruptHint::INTERRUPT_HINT_PAUSE:
89 case InterruptHint::INTERRUPT_HINT_STOP:
90 cb_->OnSuspend();
91 break;
92 case InterruptHint::INTERRUPT_HINT_RESUME:
93 cb_->OnResume();
94 break;
95 default:
96 WVLOG_E("audio manager interrupt hint not foud, code: %{public}d", interruptAction.interruptHint);
97 break;
98 }
99 }
100
AudioManagerDeviceChangeCallbackAdapterImpl(std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> cb)101 AudioManagerDeviceChangeCallbackAdapterImpl::AudioManagerDeviceChangeCallbackAdapterImpl(
102 std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> cb)
103 : cb_(cb) {};
104
OnDeviceChange(const DeviceChangeAction & deviceChangeAction)105 void AudioManagerDeviceChangeCallbackAdapterImpl::OnDeviceChange(const DeviceChangeAction& deviceChangeAction)
106 {
107 if (!cb_) {
108 return;
109 }
110 cb_->OnDeviceChange();
111 }
112
GetInstance()113 AudioSystemManagerAdapterImpl& AudioSystemManagerAdapterImpl::GetInstance()
114 {
115 static AudioSystemManagerAdapterImpl instance;
116 return instance;
117 }
118
HasAudioOutputDevices() const119 bool AudioSystemManagerAdapterImpl::HasAudioOutputDevices() const
120 {
121 DeviceType outputDeviceType = AudioSystemManager::GetInstance()->GetActiveOutputDevice();
122 if (outputDeviceType == DeviceType::DEVICE_TYPE_NONE || outputDeviceType == DeviceType::DEVICE_TYPE_INVALID) {
123 return false;
124 }
125 return true;
126 }
127
HasAudioInputDevices() const128 bool AudioSystemManagerAdapterImpl::HasAudioInputDevices() const
129 {
130 DeviceType inputDeviceType = AudioSystemManager::GetInstance()->GetActiveInputDevice();
131 if (inputDeviceType == DeviceType::DEVICE_TYPE_NONE || inputDeviceType == DeviceType::DEVICE_TYPE_INVALID) {
132 return false;
133 }
134 return true;
135 }
136
RequestAudioFocus(const AudioAdapterInterrupt & audioInterrupt)137 int32_t AudioSystemManagerAdapterImpl::RequestAudioFocus(const AudioAdapterInterrupt& audioInterrupt)
138 {
139 AudioInterrupt interruptParams;
140 interruptParams.streamUsage = AudioRendererAdapterImpl::GetAudioStreamUsage(audioInterrupt.streamUsage);
141 interruptParams.contentType = AudioRendererAdapterImpl::GetAudioContentType(audioInterrupt.contentType);
142 interruptParams.audioFocusType.streamType = GetStreamType(audioInterrupt.streamType);
143
144 int32_t ret = AudioSystemManager::GetInstance()->RequestAudioFocus(interruptParams);
145 if (ret != AudioStandard::SUCCESS) {
146 WVLOG_E("audio request audio focus failed, code: %{public}d", ret);
147 return AUDIO_ERROR;
148 }
149 return AUDIO_OK;
150 }
151
AbandonAudioFocus(const AudioAdapterInterrupt & audioInterrupt)152 int32_t AudioSystemManagerAdapterImpl::AbandonAudioFocus(const AudioAdapterInterrupt& audioInterrupt)
153 {
154 AudioInterrupt interruptParams;
155 interruptParams.streamUsage = AudioRendererAdapterImpl::GetAudioStreamUsage(audioInterrupt.streamUsage);
156 interruptParams.contentType = AudioRendererAdapterImpl::GetAudioContentType(audioInterrupt.contentType);
157 interruptParams.audioFocusType.streamType = GetStreamType(audioInterrupt.streamType);
158
159 int32_t ret = AudioSystemManager::GetInstance()->AbandonAudioFocus(interruptParams);
160 if (ret != AudioStandard::SUCCESS) {
161 WVLOG_E("audio abandon audio focus failed, code: %{public}d", ret);
162 return AUDIO_ERROR;
163 }
164 return AUDIO_OK;
165 }
166
SetAudioManagerInterruptCallback(const std::shared_ptr<AudioManagerCallbackAdapter> & callback)167 int32_t AudioSystemManagerAdapterImpl::SetAudioManagerInterruptCallback(
168 const std::shared_ptr<AudioManagerCallbackAdapter>& callback)
169 {
170 if (callback == nullptr) {
171 WVLOG_E("set audio manager interrupt callback is nullptr");
172 return AUDIO_NULL_ERROR;
173 }
174 callback_ = std::make_shared<AudioManagerCallbackAdapterImpl>(callback);
175
176 int32_t ret = AudioSystemManager::GetInstance()->SetAudioManagerInterruptCallback(callback_);
177 if (ret != AudioStandard::SUCCESS) {
178 WVLOG_E("audio manager set interrupt callback failed, code: %{public}d", ret);
179 return AUDIO_ERROR;
180 }
181 return AUDIO_OK;
182 }
183
UnsetAudioManagerInterruptCallback()184 int32_t AudioSystemManagerAdapterImpl::UnsetAudioManagerInterruptCallback()
185 {
186 int32_t ret = AudioSystemManager::GetInstance()->UnsetAudioManagerInterruptCallback();
187 if (ret != AudioStandard::SUCCESS) {
188 WVLOG_E("audio manager unset interrupt callback failed, code: %{public}d", ret);
189 return AUDIO_ERROR;
190 }
191 callback_ = nullptr;
192 return AUDIO_OK;
193 }
194
GetDevices(AdapterDeviceFlag flag) const195 std::vector<AudioAdapterDeviceDesc> AudioSystemManagerAdapterImpl::GetDevices(AdapterDeviceFlag flag) const
196 {
197 bool isCallDevice = false;
198 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
199 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
200 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
201 isCallDevice = true;
202 }
203 std::vector<std::unique_ptr<AudioDeviceDescriptor>> audioDeviceList;
204 if (flag == AdapterDeviceFlag::OUTPUT_DEVICES_FLAG) {
205 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
206 isCallDevice ? AudioDeviceUsage::CALL_OUTPUT_DEVICES : AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
207 } else if (flag == AdapterDeviceFlag::INPUT_DEVICES_FLAG) {
208 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(AudioDeviceUsage::CALL_INPUT_DEVICES);
209 } else if (flag == AdapterDeviceFlag::ALL_DEVICES_FLAG) {
210 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
211 isCallDevice ? AudioDeviceUsage::ALL_CALL_DEVICES : AudioDeviceUsage::ALL_MEDIA_DEVICES);
212 }
213 std::vector<AudioAdapterDeviceDesc> audioAdapterDeviceList;
214 for (auto& audioDevice : audioDeviceList) {
215 AudioAdapterDeviceDesc desc;
216 desc.deviceId = audioDevice->deviceId_;
217 if (audioDevice->deviceName_.empty()) {
218 auto deviceTypeKey = DEVICE_TYPE_MAP.find(audioDevice->deviceType_);
219 if (deviceTypeKey != DEVICE_TYPE_MAP.end()) {
220 desc.deviceName = deviceTypeKey->second;
221 }
222 } else {
223 desc.deviceName = audioDevice->deviceName_;
224 }
225 audioAdapterDeviceList.emplace_back(desc);
226 }
227 return audioAdapterDeviceList;
228 }
229
SelectAudioOutputDevice(bool isCallDevice,const std::vector<sptr<AudioDeviceDescriptor>> & device) const230 int32_t AudioSystemManagerAdapterImpl::SelectAudioOutputDevice(
231 bool isCallDevice, const std::vector<sptr<AudioDeviceDescriptor>>& device) const
232 {
233 if (isCallDevice) {
234 sptr<AudioRendererFilter> filter = new(std::nothrow) AudioRendererFilter;
235 if (!filter) {
236 WVLOG_E("AudioSystemManagerAdapterImpl::SelectAudioOutputDevice new filter failed");
237 return AUDIO_ERROR;
238 }
239 filter->rendererInfo.streamUsage = StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION;
240 filter->rendererInfo.rendererFlags = 0;
241 return AudioSystemManager::GetInstance()->SelectOutputDevice(filter, device);
242 }
243 return AudioSystemManager::GetInstance()->SelectOutputDevice(device);
244 }
245
SelectAudioDevice(AudioAdapterDeviceDesc desc,bool isInput) const246 int32_t AudioSystemManagerAdapterImpl::SelectAudioDevice(AudioAdapterDeviceDesc desc, bool isInput) const
247 {
248 WVLOG_I("AudioSystemManagerAdapterImpl::SelectAudioDevice isInput: %{public}s", isInput ? "true" : "false");
249 if (desc.deviceId == ADAPTER_AUDIO_UNDEFINED_DEVICE_ID) {
250 WVLOG_E("Cannot select undefined audio device.");
251 return AUDIO_ERROR;
252 }
253 bool isCallDevice = false;
254 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
255 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
256 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
257 isCallDevice = true;
258 }
259 if (!isInput && desc.deviceId == ADAPTER_AUDIO_DEFAULT_DEVICE_ID) {
260 WVLOG_I("Select default audio output Device.");
261 AudioRendererInfo rendererInfo;
262 rendererInfo.contentType = ContentType::CONTENT_TYPE_SPEECH;
263 rendererInfo.streamUsage =
264 isCallDevice ? StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : StreamUsage::STREAM_USAGE_MUSIC;
265 rendererInfo.rendererFlags = 0;
266 std::vector<sptr<AudioDeviceDescriptor>> defaultOutputDevice;
267 AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, defaultOutputDevice);
268 return SelectAudioOutputDevice(isCallDevice, defaultOutputDevice);
269 }
270 if (isInput && desc.deviceId == ADAPTER_AUDIO_DEFAULT_DEVICE_ID) {
271 WVLOG_I("Select default audio input Device.");
272 AudioCapturerInfo capturerInfo;
273 capturerInfo.sourceType = AudioStandard::SourceType::SOURCE_TYPE_VOICE_COMMUNICATION;
274 capturerInfo.capturerFlags = 0;
275 std::vector<sptr<AudioDeviceDescriptor>> defaultInputDevice;
276 AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, defaultInputDevice);
277 return AudioSystemManager::GetInstance()->SelectInputDevice(defaultInputDevice);
278 }
279
280 std::vector<std::unique_ptr<AudioDeviceDescriptor>> audioDeviceList;
281 if (isCallDevice) {
282 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
283 isInput ? AudioDeviceUsage::CALL_INPUT_DEVICES : AudioDeviceUsage::CALL_OUTPUT_DEVICES);
284 } else {
285 audioDeviceList = AudioRoutingManager::GetInstance()->GetAvailableDevices(
286 isInput ? AudioDeviceUsage::CALL_INPUT_DEVICES : AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
287 }
288 for (auto& device : audioDeviceList) {
289 if (device->deviceId_ == desc.deviceId) {
290 std::vector<sptr<AudioDeviceDescriptor>> selectedAudioDevice { device.release() };
291 return isInput ? AudioSystemManager::GetInstance()->SelectInputDevice(selectedAudioDevice)
292 : SelectAudioOutputDevice(isCallDevice, selectedAudioDevice);
293 }
294 }
295 WVLOG_E("can't find any device by audio device id");
296 return AUDIO_ERROR;
297 }
298
GetDefaultOutputDevice()299 AudioAdapterDeviceDesc AudioSystemManagerAdapterImpl::GetDefaultOutputDevice()
300 {
301 bool isCallDevice = false;
302 auto audioScene = AudioSystemManager::GetInstance()->GetAudioScene();
303 if (audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CALL ||
304 audioScene == AudioStandard::AudioScene::AUDIO_SCENE_PHONE_CHAT) {
305 isCallDevice = true;
306 }
307 AudioRendererInfo rendererInfo;
308 rendererInfo.contentType = ContentType::CONTENT_TYPE_SPEECH;
309 rendererInfo.streamUsage =
310 isCallDevice ? StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : StreamUsage::STREAM_USAGE_MUSIC;
311 rendererInfo.rendererFlags = 0;
312 std::vector<sptr<AudioDeviceDescriptor>> defaultOutputDevice;
313 AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, defaultOutputDevice);
314
315 if (defaultOutputDevice.empty() || !defaultOutputDevice[0]) {
316 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultOutputDevice failed.");
317 AudioAdapterDeviceDesc undefinedDesc;
318 undefinedDesc.deviceName = ADAPTER_AUDIO_UNDEFINED_DEVICE_NAME;
319 undefinedDesc.deviceId = ADAPTER_AUDIO_UNDEFINED_DEVICE_ID;
320 return undefinedDesc;
321 }
322 auto defaultDevice = defaultOutputDevice[0];
323 AudioAdapterDeviceDesc desc;
324 desc.deviceId = defaultDevice->deviceId_;
325 if (defaultDevice->deviceName_.empty()) {
326 auto deviceTypeKey = DEVICE_TYPE_MAP.find(defaultDevice->deviceType_);
327 if (deviceTypeKey != DEVICE_TYPE_MAP.end()) {
328 desc.deviceName = deviceTypeKey->second;
329 }
330 } else {
331 desc.deviceName = defaultDevice->deviceName_;
332 }
333 return desc;
334 }
335
GetDefaultInputDevice()336 AudioAdapterDeviceDesc AudioSystemManagerAdapterImpl::GetDefaultInputDevice()
337 {
338 AudioCapturerInfo capturerInfo;
339 capturerInfo.sourceType = AudioStandard::SourceType::SOURCE_TYPE_VOICE_COMMUNICATION;
340 capturerInfo.capturerFlags = 0;
341 std::vector<sptr<AudioDeviceDescriptor>> defaultInputDevice;
342 AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, defaultInputDevice);
343 if (defaultInputDevice.empty() || !defaultInputDevice[0]) {
344 WVLOG_E("AudioSystemManagerAdapterImpl::GetDefaultInputDevice failed.");
345 AudioAdapterDeviceDesc undefinedDesc;
346 undefinedDesc.deviceName = ADAPTER_AUDIO_UNDEFINED_DEVICE_NAME;
347 undefinedDesc.deviceId = ADAPTER_AUDIO_UNDEFINED_DEVICE_ID;
348 return undefinedDesc;
349 }
350 auto defaultDevice = defaultInputDevice[0];
351 AudioAdapterDeviceDesc desc;
352 desc.deviceId = defaultDevice->deviceId_;
353 if (defaultDevice->deviceName_.empty()) {
354 auto deviceTypeKey = DEVICE_TYPE_MAP.find(defaultDevice->deviceType_);
355 if (deviceTypeKey != DEVICE_TYPE_MAP.end()) {
356 desc.deviceName = deviceTypeKey->second;
357 }
358 } else {
359 desc.deviceName = defaultDevice->deviceName_;
360 }
361 return desc;
362 }
363
SetDeviceChangeCallback(const std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter> & callback)364 int32_t AudioSystemManagerAdapterImpl::SetDeviceChangeCallback(
365 const std::shared_ptr<AudioManagerDeviceChangeCallbackAdapter>& callback)
366 {
367 if (callback == nullptr) {
368 WVLOG_E("audio device change callback is nullptr");
369 return AUDIO_NULL_ERROR;
370 }
371 DeviceFlag deviceFlag = DeviceFlag::OUTPUT_DEVICES_FLAG;
372 deviceChangeCallback_ = std::make_shared<AudioManagerDeviceChangeCallbackAdapterImpl>(callback);
373 if (deviceChangeCallback_ == nullptr) {
374 WVLOG_E("audio device change callback impl is nullptr");
375 return AUDIO_NULL_ERROR;
376 }
377 int32_t ret = AudioSystemManager::GetInstance()->SetDeviceChangeCallback(deviceFlag, deviceChangeCallback_);
378 if (ret != AudioStandard::SUCCESS) {
379 WVLOG_E("audio manager set audio device change callback failed, code: %{public}d", ret);
380 return AUDIO_ERROR;
381 }
382 return AUDIO_OK;
383 }
384
UnsetDeviceChangeCallback()385 int32_t AudioSystemManagerAdapterImpl::UnsetDeviceChangeCallback()
386 {
387 int32_t ret = AudioSystemManager::GetInstance()->UnsetDeviceChangeCallback();
388 return ret;
389 }
390
GetStreamType(AudioAdapterStreamType streamType)391 AudioStreamType AudioSystemManagerAdapterImpl::GetStreamType(AudioAdapterStreamType streamType)
392 {
393 auto item = STREAM_TYPE_MAP.find(streamType);
394 if (item == STREAM_TYPE_MAP.end()) {
395 WVLOG_E("audio stream type not found");
396 return AudioStreamType::STREAM_DEFAULT;
397 }
398 return item->second;
399 }
400 } // namespace OHOS::NWeb