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