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