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 AudioDeviceDescriptorsWithSptr 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 AudioDeviceDescriptorsWithSptr & desc)190 void AudioAdapter::OnPreferredOutputDeviceUpdated(const AudioDeviceDescriptorsWithSptr& desc)
191 {
192 for (const auto& listener : deviceChangeListeners_) {
193 if (listener) {
194 listener(desc);
195 }
196 }
197 }
198
GetRendererRunning(int32_t uid)199 bool AudioAdapter::GetRendererRunning(int32_t uid)
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->rendererState == AudioStandard::RENDERER_RUNNING),
206 true, "find uid=%{public}d renderer state is %{public}d", uid, info->rendererState);
207 }
208 return false;
209 }
210
SetVolume(int32_t volume)211 int32_t AudioAdapter::SetVolume(int32_t volume)
212 {
213 AudioStandard::AudioVolumeType streamType = AudioStandard::AudioVolumeType::STREAM_MUSIC;
214 int32_t volumeNum = std::min(volumeMax_, std::max(volume, volumeMin_));
215 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SetVolume(streamType, volumeNum);
216 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetVolume failed");
217 return AVSESSION_SUCCESS;
218 }
219
GetVolume()220 int32_t AudioAdapter::GetVolume()
221 {
222 AudioStandard::AudioVolumeType streamType = AudioStandard::AudioVolumeType::STREAM_MUSIC;
223 return AudioStandard::AudioSystemManager::GetInstance()->GetVolume(streamType);
224 }
225
RegisterVolumeKeyEventCallback(const std::function<void (int32_t)> & callback)226 int32_t AudioAdapter::RegisterVolumeKeyEventCallback(const std::function<void(int32_t)>& callback)
227 {
228 volumeCallback_ = std::make_shared<AudioVolumeKeyEventCallback>(callback);
229 int32_t ret = AudioStandard::AudioSystemManager::GetInstance()->RegisterVolumeKeyEventCallback(
230 getpid(), volumeCallback_);
231 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "RegisterVolumeKeyEventCallback failed");
232 return AVSESSION_SUCCESS;
233 }
234
UnregisterVolumeKeyEventCallback()235 int32_t AudioAdapter::UnregisterVolumeKeyEventCallback()
236 {
237 int32_t ret = AudioStandard::AudioSystemManager::GetInstance()->UnregisterVolumeKeyEventCallback(
238 getpid(), volumeCallback_);
239 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnregisterVolumeKeyEventCallback failed");
240 return AVSESSION_SUCCESS;
241 }
242
GetAvailableDevices()243 AudioDeviceDescriptorsWithSptr AudioAdapter::GetAvailableDevices()
244 {
245 AudioDeviceDescriptorsWithSptr outDeviceDescriptors;
246 AudioDeviceDescriptors devices = AudioStandard::AudioRoutingManager::GetInstance()->GetAvailableDevices(
247 AudioStandard::AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
248 for (auto& device : devices) {
249 SLOGI("GetAvailableDevices output deviceCategory_ %{public}d, deviceType_ %{public}d",
250 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
251 outDeviceDescriptors.push_back(std::move(device));
252 }
253 return outDeviceDescriptors;
254 }
255
SetAvailableDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc & callback)256 int32_t AudioAdapter::SetAvailableDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc& callback)
257 {
258 availableDeviceChangeCallbackFunc_ = callback;
259 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SetAvailableDeviceChangeCallback(
260 AudioStandard::AudioDeviceUsage::MEDIA_OUTPUT_DEVICES, shared_from_this());
261 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAvailableDeviceChangeCallback failed");
262 return AVSESSION_SUCCESS;
263 }
264
UnsetAvailableDeviceChangeCallback()265 int32_t AudioAdapter::UnsetAvailableDeviceChangeCallback()
266 {
267 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UnsetAvailableDeviceChangeCallback(
268 AudioStandard::AudioDeviceUsage::MEDIA_OUTPUT_DEVICES);
269 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnsetAvailableDeviceChangeCallback failed");
270 return AVSESSION_SUCCESS;
271 }
272
RegisterAllowedPlaybackCallback(const std::function<bool (int32_t,int32_t)> & callback)273 int32_t AudioAdapter::RegisterAllowedPlaybackCallback(const std::function<bool(int32_t, int32_t)>& callback)
274 {
275 playbackCallback_ = std::make_shared<AudioAllowedPlaybackCallback>(callback);
276 int32_t ret = AudioStandard::AudioSystemManager::GetInstance()->SetQueryAllowedPlaybackCallback(playbackCallback_);
277 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "RegisterAllowedPlaybackCallback failed");
278 return AVSESSION_SUCCESS;
279 }
280
GetDevices()281 AudioDeviceDescriptorsWithSptr AudioAdapter::GetDevices()
282 {
283 auto devices = AudioStandard::AudioSystemManager::GetInstance()->GetDevices(
284 AudioStandard::DeviceFlag::OUTPUT_DEVICES_FLAG);
285 for (auto& device : devices) {
286 SLOGI("GetDevices output deviceCategory_ %{public}d, deviceType_ %{public}d",
287 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
288 }
289 return devices;
290 }
291
SetDeviceChangeCallback()292 int32_t AudioAdapter::SetDeviceChangeCallback()
293 {
294 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SetDeviceChangeCallback(
295 AudioStandard::DeviceFlag::OUTPUT_DEVICES_FLAG, shared_from_this());
296 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetDeviceChangeCallback failed");
297 return AVSESSION_SUCCESS;
298 }
299
UnsetDeviceChangeCallback()300 int32_t AudioAdapter::UnsetDeviceChangeCallback()
301 {
302 auto ret = AudioStandard::AudioSystemManager::GetInstance()->UnsetDeviceChangeCallback(
303 AudioStandard::DeviceFlag::OUTPUT_DEVICES_FLAG, shared_from_this());
304 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnsetDeviceChangeCallback failed");
305 return AVSESSION_SUCCESS;
306 }
307
GetPreferredOutputDeviceForRendererInfo()308 AudioDeviceDescriptorsWithSptr AudioAdapter::GetPreferredOutputDeviceForRendererInfo()
309 {
310 AudioStandard::AudioRendererInfo rendererInfo = {};
311 rendererInfo.streamUsage = AudioStandard::STREAM_USAGE_MUSIC;
312 AudioDeviceDescriptorsWithSptr outDeviceDescriptors;
313 auto ret = AudioStandard::AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(
314 rendererInfo, outDeviceDescriptors);
315 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AudioDeviceDescriptorsWithSptr{},
316 "GetPreferredOutputDeviceForRendererInfo failed");
317 for (auto& device : outDeviceDescriptors) {
318 SLOGI("preferred output deviceCategory_ %{public}d, deviceType_ %{public}d",
319 static_cast<int32_t>(device->deviceCategory_), static_cast<int32_t>(device->deviceType_));
320 }
321 return outDeviceDescriptors;
322 }
323
SetPreferredOutputDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc & callback)324 int32_t AudioAdapter::SetPreferredOutputDeviceChangeCallback(const AudioDeviceDescriptorsCallbackFunc& callback)
325 {
326 preferredDeviceChangeCallback_ = std::make_shared<AudioPreferredDeviceChangeCallback>(callback);
327 AudioStandard::AudioRendererInfo rendererInfo = {};
328 rendererInfo.streamUsage = AudioStandard::STREAM_USAGE_MUSIC;
329 auto ret = AudioStandard::AudioRoutingManager::GetInstance()->SetPreferredOutputDeviceChangeCallback(
330 rendererInfo, preferredDeviceChangeCallback_);
331 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetPreferredOutputDeviceChangeCallback failed");
332 return AVSESSION_SUCCESS;
333 }
334
UnsetPreferredOutputDeviceChangeCallback()335 int32_t AudioAdapter::UnsetPreferredOutputDeviceChangeCallback()
336 {
337 auto ret = AudioStandard::AudioRoutingManager::GetInstance()->UnsetPreferredOutputDeviceChangeCallback();
338 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "UnsetPreferredOutputDeviceChangeCallback failed");
339 return AVSESSION_SUCCESS;
340 }
341
FindRenderDeviceForUsage(const AudioDeviceDescriptorsWithSptr & devices,const AudioDeviceDescriptorWithSptr & desc)342 AudioDeviceDescriptorWithSptr AudioAdapter::FindRenderDeviceForUsage(const AudioDeviceDescriptorsWithSptr& devices,
343 const AudioDeviceDescriptorWithSptr& desc)
344 {
345 auto itr = std::find_if(devices.cbegin(), devices.cend(), [&desc](const auto &device) {
346 return (desc->deviceType_ == device->deviceType_) &&
347 (desc->macAddress_ == device->macAddress_) &&
348 (desc->networkId_ == device->networkId_) &&
349 (!AudioStandard::IsUsb(desc->deviceType_) || desc->deviceRole_ == device->deviceRole_);
350 });
351 return itr != devices.cend() ? *itr : nullptr;
352 }
353
SelectOutputDevice(const AudioDeviceDescriptorWithSptr & desc)354 int32_t AudioAdapter::SelectOutputDevice(const AudioDeviceDescriptorWithSptr& desc)
355 {
356 AudioDeviceDescriptorWithSptr device = FindRenderDeviceForUsage(GetAvailableDevices(), desc);
357 CHECK_AND_RETURN_RET_LOG(device != nullptr, AVSESSION_ERROR, "Give device invaild");
358
359 AudioDeviceDescriptorsWithSptr deviceDescriptorVector { device };
360 auto ret = AudioStandard::AudioSystemManager::GetInstance()->SelectOutputDevice(deviceDescriptorVector);
361 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SelectOutputDevice failed");
362 return AVSESSION_SUCCESS;
363 }
364 }
365