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 #include "audio_adapter.h"
16 #include "audio_system_manager.h"
17 #include "avsession_log.h"
18 #include "avsession_errors.h"
19 #include "parameters.h"
20 #include "avsession_users_manager.h"
21 #include "permission_checker.h"
22 #include "app_manager_adapter.h"
23 #include "iservice_registry.h"
24
25 namespace OHOS::AVSession {
26 std::shared_ptr<AudioAdapter> AudioAdapter::instance_;
27 std::once_flag AudioAdapter::onceFlag_;
28
GetInstance()29 AudioAdapter& AudioAdapter::GetInstance()
30 {
31 std::call_once(onceFlag_, [] {
32 instance_ = std::make_shared<AudioAdapter>();
33 });
34 return *instance_;
35 }
36
AudioAdapter()37 AudioAdapter::AudioAdapter()
38 {
39 SLOGD("construct");
40 }
41
~AudioAdapter()42 AudioAdapter::~AudioAdapter()
43 {
44 SLOGD("destroy");
45 }
46
Init()47 void AudioAdapter::Init()
48 {
49 SLOGI("register audio renderer event listener");
50 auto ret = AudioStandard::AudioStreamManager::GetInstance()->RegisterAudioRendererEventListener(
51 getpid(), shared_from_this());
52 CHECK_AND_PRINT_LOG(ret == 0, "register audio renderer event listener failed!");
53 AudioStandard::AudioRendererInfo rendererInfo = {};
54 rendererInfo.streamUsage = AudioStandard::STREAM_USAGE_MUSIC;
55 ret = AudioStandard::AudioRoutingManager::GetInstance()->SetPreferredOutputDeviceChangeCallback(
56 rendererInfo, shared_from_this());
57 CHECK_AND_PRINT_LOG(ret == 0, "register audio device changed event listener failed!");
58 is2in1_ = system::GetBoolParameter("const.audio.volume_apply_to_all", false);
59
60 AudioStandard::AudioVolumeType streamType = AudioStandard::AudioVolumeType::STREAM_MUSIC;
61 volumeMax_ = AudioStandard::AudioSystemManager::GetInstance()->GetMaxVolume(streamType);
62 volumeMin_ = AudioStandard::AudioSystemManager::GetInstance()->GetMinVolume(streamType);
63 }
64
AddStreamRendererStateListener(const StateListener & listener)65 void AudioAdapter::AddStreamRendererStateListener(const StateListener& listener)
66 {
67 std::lock_guard lockGuard(listenersLock_);
68 listeners_.push_back(listener);
69 }
70
AddDeviceChangeListener(const PreferOutputDeviceChangeListener & listener)71 void AudioAdapter::AddDeviceChangeListener(const PreferOutputDeviceChangeListener& listener)
72 {
73 deviceChangeListeners_.push_back(listener);
74 }
75
MuteAudioStream(int32_t uid,int32_t pid)76 int32_t AudioAdapter::MuteAudioStream(int32_t uid, int32_t pid)
77 {
78 if (is2in1_) {
79 SLOGI("PC no need mute");
80 return AVSESSION_ERROR;
81 }
82 std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> audioRendererChangeInfo;
83 auto ret = AudioStandard::AudioStreamManager::GetInstance()->GetCurrentRendererChangeInfos(audioRendererChangeInfo);
84 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "get renderer state failed!");
85 auto muteRet = AVSESSION_ERROR;
86 for (const auto& info : audioRendererChangeInfo) {
87 if ((info->clientUID == uid && info->clientPid == pid) &&
88 info->rendererState == AudioStandard::RENDERER_RUNNING && !info->backMute &&
89 (std::count(BACKGROUND_MUTE_STREAM_USAGE.begin(), BACKGROUND_MUTE_STREAM_USAGE.end(),
90 info->rendererInfo.streamUsage) != 0)) {
91 SLOGI("mute uid=%{public}d pid=%{public}d stream usage %{public}d renderer state is %{public}d",
92 uid, pid, info->rendererInfo.streamUsage, info->rendererState);
93 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UpdateStreamState(
94 uid, AudioStandard::StreamSetState::STREAM_MUTE, info->rendererInfo.streamUsage);
95 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "mute uid=%{public}d failed!", uid);
96 muteRet = AVSESSION_SUCCESS;
97 }
98 }
99 return muteRet;
100 }
101
UnMuteAudioStream(int32_t uid)102 int32_t AudioAdapter::UnMuteAudioStream(int32_t uid)
103 {
104 if (is2in1_) {
105 SLOGI("PC no need unmute");
106 return AVSESSION_ERROR;
107 }
108 std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> audioRendererChangeInfo;
109 auto ret = AudioStandard::AudioStreamManager::GetInstance()->GetCurrentRendererChangeInfos(audioRendererChangeInfo);
110 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "get renderer state failed!");
111 for (const auto& info : audioRendererChangeInfo) {
112 if (info->clientUID == uid && info->rendererState == AudioStandard::RENDERER_RUNNING && info->backMute) {
113 SLOGI("unmute uid=%{public}d stream usage %{public}d renderer state is %{public}d",
114 uid, info->rendererInfo.streamUsage, info->rendererState);
115 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UpdateStreamState(
116 uid, AudioStandard::StreamSetState::STREAM_UNMUTE, info->rendererInfo.streamUsage);
117 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "unmute uid=%{public}d failed!", uid);
118 }
119 }
120 return AVSESSION_SUCCESS;
121 }
122
UnMuteAudioStream(int32_t uid,AudioStandard::StreamUsage usage)123 int32_t AudioAdapter::UnMuteAudioStream(int32_t uid, AudioStandard::StreamUsage usage)
124 {
125 if (is2in1_) {
126 SLOGI("PC no need unmute");
127 return AVSESSION_ERROR;
128 }
129 SLOGI("usage unmute uid=%{public}d stream usage %{public}d", uid, usage);
130 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UpdateStreamState(
131 uid, AudioStandard::StreamSetState::STREAM_UNMUTE, usage);
132 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "unmute uid=%{public}d failed!", uid);
133 return AVSESSION_SUCCESS;
134 }
135
MuteAudioStream(int32_t uid,AudioStandard::StreamUsage usage)136 int32_t AudioAdapter::MuteAudioStream(int32_t uid, AudioStandard::StreamUsage usage)
137 {
138 if (is2in1_) {
139 SLOGI("PC no need mute");
140 return AVSESSION_ERROR;
141 }
142 if (std::count(BACKGROUND_MUTE_STREAM_USAGE.begin(), BACKGROUND_MUTE_STREAM_USAGE.end(), usage) == 0) {
143 SLOGI("mute uid=%{public}d stream usage=%{public}d uncontrolled, return", uid, usage);
144 return AVSESSION_ERROR;
145 }
146 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UpdateStreamState(
147 uid, AudioStandard::StreamSetState::STREAM_MUTE, usage);
148 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "mute uid=%{public}d failed!", uid);
149 return AVSESSION_SUCCESS;
150 }
151
PauseAudioStream(int32_t uid,AudioStandard::StreamUsage usage)152 int32_t AudioAdapter::PauseAudioStream(int32_t uid, AudioStandard::StreamUsage usage)
153 {
154 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UpdateStreamState(
155 uid, AudioStandard::StreamSetState::STREAM_PAUSE, usage);
156 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "pause uid=%{public}d failed!", uid);
157 return AVSESSION_SUCCESS;
158 }
159
OnRendererStateChange(const AudioRendererChangeInfos & infos)160 void AudioAdapter::OnRendererStateChange(const AudioRendererChangeInfos& infos)
161 {
162 std::lock_guard lockGuard(listenersLock_);
163 for (const auto& listener : listeners_) {
164 if (listener) {
165 listener(infos);
166 }
167 }
168 }
169
OnDeviceChange(const DeviceChangeAction & deviceChangeAction)170 void AudioAdapter::OnDeviceChange(const DeviceChangeAction& deviceChangeAction)
171 {
172 }
173
OnAvailableDeviceChange(const AudioStandard::AudioDeviceUsage usage,const AudioStandard::DeviceChangeAction & deviceChangeAction)174 void AudioAdapter::OnAvailableDeviceChange(const AudioStandard::AudioDeviceUsage usage,
175 const AudioStandard::DeviceChangeAction& deviceChangeAction)
176 {
177 if (AudioStandard::DeviceChangeType::CONNECT == deviceChangeAction.type) {
178 SLOGI("receive connect available device change");
179 } else {
180 SLOGI("receive disconnect available device change");
181 }
182 AudioDeviceDescriptors deviceDescriptors = GetAvailableDevices();
183 for (auto& device : deviceDescriptors) {
184 SLOGI("OnDeviceChange output deviceCategory_ %{public}d, deviceType_ %{public}d",
185 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
186 }
187 availableDeviceChangeCallbackFunc_(deviceDescriptors);
188 }
189
OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptors & desc)190 void AudioAdapter::OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptors& desc)
191 {
192 for (const auto& listener : deviceChangeListeners_) {
193 if (listener) {
194 listener(desc);
195 }
196 }
197 }
198
GetRendererRunning(int32_t uid,int32_t pid)199 bool AudioAdapter::GetRendererRunning(int32_t uid, int32_t pid)
200 {
201 std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> audioRendererChangeInfo;
202 auto ret = AudioStandard::AudioStreamManager::GetInstance()->GetCurrentRendererChangeInfos(audioRendererChangeInfo);
203 CHECK_AND_RETURN_RET_LOG(ret == 0, false, "get renderer state failed!");
204 for (const auto& info : audioRendererChangeInfo) {
205 CHECK_AND_RETURN_RET_LOG(!(info->clientUID == uid && info->clientPid == pid &&
206 info->rendererState == AudioStandard::RENDERER_RUNNING), true,
207 "find uid=%{public}d pid=%{public}d renderer state is %{public}d", uid, pid, info->rendererState);
208 }
209
210 return false;
211 }
212
SetVolume(int32_t volume)213 int32_t AudioAdapter::SetVolume(int32_t volume)
214 {
215 AudioStandard::AudioVolumeType streamType = AudioStandard::AudioVolumeType::STREAM_MUSIC;
216 int32_t volumeNum = std::min(volumeMax_, std::max(volume, volumeMin_));
217 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SetVolume(streamType, volumeNum);
218 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetVolume failed");
219 return AVSESSION_SUCCESS;
220 }
221
GetVolume()222 int32_t AudioAdapter::GetVolume()
223 {
224 AudioStandard::AudioVolumeType streamType = AudioStandard::AudioVolumeType::STREAM_MUSIC;
225 return AudioStandard::AudioSystemManager::GetInstance()->GetVolume(streamType);
226 }
227
RegisterVolumeKeyEventCallback(const std::function<void (int32_t)> & callback)228 int32_t AudioAdapter::RegisterVolumeKeyEventCallback(const std::function<void(int32_t)>& callback)
229 {
230 volumeCallback_ = std::make_shared<AudioVolumeKeyEventCallback>(callback);
231 int32_t ret = AudioStandard::AudioSystemManager::GetInstance()->RegisterVolumeKeyEventCallback(
232 getpid(), volumeCallback_);
233 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "RegisterVolumeKeyEventCallback failed");
234 return AVSESSION_SUCCESS;
235 }
236
UnregisterVolumeKeyEventCallback()237 int32_t AudioAdapter::UnregisterVolumeKeyEventCallback()
238 {
239 int32_t ret = AudioStandard::AudioSystemManager::GetInstance()->UnregisterVolumeKeyEventCallback(
240 getpid(), volumeCallback_);
241 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnregisterVolumeKeyEventCallback failed");
242 return AVSESSION_SUCCESS;
243 }
244
GetAvailableDevices()245 AudioDeviceDescriptors AudioAdapter::GetAvailableDevices()
246 {
247 AudioDeviceDescriptors outDeviceDescriptors;
248 AudioDeviceDescriptors devices = AudioStandard::AudioRoutingManager::GetInstance()->GetAvailableDevices(
249 AudioStandard::AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
250 for (auto& device : devices) {
251 SLOGI("GetAvailableDevices output deviceCategory_ %{public}d, deviceType_ %{public}d",
252 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
253 outDeviceDescriptors.push_back(device);
254 }
255 return outDeviceDescriptors;
256 }
257
SetAvailableDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc & callback)258 int32_t AudioAdapter::SetAvailableDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc& callback)
259 {
260 availableDeviceChangeCallbackFunc_ = callback;
261 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SetAvailableDeviceChangeCallback(
262 AudioStandard::AudioDeviceUsage::MEDIA_OUTPUT_DEVICES, shared_from_this());
263 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAvailableDeviceChangeCallback failed");
264 return AVSESSION_SUCCESS;
265 }
266
UnsetAvailableDeviceChangeCallback()267 int32_t AudioAdapter::UnsetAvailableDeviceChangeCallback()
268 {
269 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UnsetAvailableDeviceChangeCallback(
270 AudioStandard::AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
271 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnsetAvailableDeviceChangeCallback failed");
272 return AVSESSION_SUCCESS;
273 }
274
RegisterAllowedPlaybackCallback(const std::function<bool (int32_t,int32_t)> & callback)275 int32_t AudioAdapter::RegisterAllowedPlaybackCallback(const std::function<bool(int32_t, int32_t)>& callback)
276 {
277 playbackCallback_ = std::make_shared<AudioAllowedPlaybackCallback>(callback);
278 int32_t ret = AudioStandard::AudioSystemManager::GetInstance()->SetQueryAllowedPlaybackCallback(playbackCallback_);
279 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "RegisterAllowedPlaybackCallback failed");
280 return AVSESSION_SUCCESS;
281 }
282
GetDevices()283 AudioDeviceDescriptors AudioAdapter::GetDevices()
284 {
285 auto devices = AudioStandard::AudioSystemManager::GetInstance()->GetDevices(
286 AudioStandard::DeviceFlag::OUTPUT_DEVICES_FLAG);
287 for (auto& device : devices) {
288 SLOGI("GetDevices output deviceCategory_ %{public}d, deviceType_ %{public}d",
289 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
290 }
291 return devices;
292 }
293
SetDeviceChangeCallback()294 int32_t AudioAdapter::SetDeviceChangeCallback()
295 {
296 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SetDeviceChangeCallback(
297 AudioStandard::DeviceFlag::OUTPUT_DEVICES_FLAG, shared_from_this());
298 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetDeviceChangeCallback failed");
299 return AVSESSION_SUCCESS;
300 }
301
UnsetDeviceChangeCallback()302 int32_t AudioAdapter::UnsetDeviceChangeCallback()
303 {
304 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UnsetDeviceChangeCallback(
305 AudioStandard::DeviceFlag::OUTPUT_DEVICES_FLAG, shared_from_this());
306 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnsetDeviceChangeCallback failed");
307 return AVSESSION_SUCCESS;
308 }
309
GetPreferredOutputDeviceForRendererInfo()310 AudioDeviceDescriptors AudioAdapter::GetPreferredOutputDeviceForRendererInfo()
311 {
312 AudioStandard::AudioRendererInfo rendererInfo = {};
313 rendererInfo.streamUsage = AudioStandard::STREAM_USAGE_MUSIC;
314 AudioDeviceDescriptors outDeviceDescriptors;
315 auto ret = AudioStandard::AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(
316 rendererInfo, outDeviceDescriptors);
317 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AudioDeviceDescriptors{},
318 "GetPreferredOutputDeviceForRendererInfo failed");
319 for (auto& device : outDeviceDescriptors) {
320 SLOGI("preferred output deviceCategory_ %{public}d, deviceType_ %{public}d",
321 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
322 }
323 return outDeviceDescriptors;
324 }
325
SetPreferredOutputDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc & callback)326 int32_t AudioAdapter::SetPreferredOutputDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc& callback)
327 {
328 preferredDeviceChangeCallback_ = std::make_shared<AudioPreferredDeviceChangeCallback>(callback);
329 AudioStandard::AudioRendererInfo rendererInfo = {};
330 rendererInfo.streamUsage = AudioStandard::STREAM_USAGE_MUSIC;
331 auto ret = AudioStandard::AudioRoutingManager::GetInstance()->SetPreferredOutputDeviceChangeCallback(
332 rendererInfo, preferredDeviceChangeCallback_);
333 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetPreferredOutputDeviceChangeCallback failed");
334 return AVSESSION_SUCCESS;
335 }
336
UnsetPreferredOutputDeviceChangeCallback()337 int32_t AudioAdapter::UnsetPreferredOutputDeviceChangeCallback()
338 {
339 auto ret = AudioStandard::AudioRoutingManager::GetInstance()->UnsetPreferredOutputDeviceChangeCallback();
340 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnsetPreferredOutputDeviceChangeCallback failed");
341 return AVSESSION_SUCCESS;
342 }
343
FindRenderDeviceForUsage(const AudioDeviceDescriptors & devices,const AudioDeviceDescriptorWithSptr & desc)344 AudioDeviceDescriptorWithSptr AudioAdapter::FindRenderDeviceForUsage(const AudioDeviceDescriptors& devices,
345 const AudioDeviceDescriptorWithSptr& desc)
346 {
347 auto itr = std::find_if(devices.cbegin(), devices.cend(), [&desc](const auto &device) {
348 return (desc->deviceType_ == device->deviceType_) &&
349 (desc->macAddress_ == device->macAddress_) &&
350 (desc->networkId_ == device->networkId_) &&
351 (!AudioStandard::IsUsb(desc->deviceType_) || desc->deviceRole_ == device->deviceRole_);
352 });
353 return itr != devices.cend() ? *itr : nullptr;
354 }
355
SelectOutputDevice(const AudioDeviceDescriptorWithSptr & desc)356 int32_t AudioAdapter::SelectOutputDevice(const AudioDeviceDescriptorWithSptr& desc)
357 {
358 AudioDeviceDescriptorWithSptr device = FindRenderDeviceForUsage(GetAvailableDevices(), desc);
359 CHECK_AND_RETURN_RET_LOG(device != nullptr, AVSESSION_ERROR, "Give device invaild");
360
361 AudioDeviceDescriptors deviceDescriptorVector { device };
362 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SelectOutputDevice(deviceDescriptorVector);
363 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SelectOutputDevice failed");
364 return AVSESSION_SUCCESS;
365 }
366 }
367