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