1 /*
2 * Copyright (c) 2022-2023 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 "avsession_manager_impl.h"
17 #include "iservice_registry.h"
18 #include "ipc_skeleton.h"
19 #include "system_ability_definition.h"
20 #include "avsession_log.h"
21 #include "avsession_errors.h"
22 #include "session_listener_client.h"
23 #include "avsession_trace.h"
24 #include "avsession_sysevent.h"
25 #include "avsession_utils.h"
26
27 namespace OHOS::AVSession {
AVSessionManagerImpl()28 AVSessionManagerImpl::AVSessionManagerImpl()
29 {
30 SLOGD("constructor");
31 }
32
GetService()33 sptr<AVSessionServiceProxy> AVSessionManagerImpl::GetService()
34 {
35 std::lock_guard<std::mutex> lockGuard(lock_);
36 if (service_) {
37 return service_;
38 }
39
40 auto mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
41 if (mgr == nullptr) {
42 SLOGE("failed to get sa mgr");
43 return nullptr;
44 }
45 auto object = mgr->GetSystemAbility(AVSESSION_SERVICE_ID);
46 if (object == nullptr) {
47 SLOGE("failed to get service");
48 return nullptr;
49 }
50 service_ = iface_cast<AVSessionServiceProxy>(object);
51 if (service_ != nullptr) {
52 serviceDeathRecipient_ = new(std::nothrow) ServiceDeathRecipient([this] { OnServiceDie(); });
53 if (serviceDeathRecipient_ == nullptr) {
54 SLOGE("register ServiceDeathRecipient failed");
55 return nullptr;
56 }
57
58 sptr<IAVSessionService> serviceBase = service_;
59 serviceBase->AsObject()->AddDeathRecipient(serviceDeathRecipient_);
60
61 SLOGD("get service success");
62 RegisterClientDeathObserver();
63 }
64 return service_;
65 }
66
OnServiceDie()67 void AVSessionManagerImpl::OnServiceDie()
68 {
69 SLOGI("enter");
70 auto callback = deathCallback_;
71 {
72 std::lock_guard<std::mutex> lockGuard(lock_);
73 service_.clear();
74 listener_.clear();
75 clientDeath_.clear();
76 deathCallback_ = nullptr;
77 }
78 if (callback) {
79 callback();
80 }
81 HISYSEVENT_RESET;
82 HISYSEVENT_UNREGISTER;
83 std::string cachePath(AVSessionUtils::GetCachePathName());
84 AVSessionUtils::DeleteCacheFiles(cachePath);
85 }
86
CreateSession(const std::string & tag,int32_t type,const AppExecFwk::ElementName & elementName)87 std::shared_ptr<AVSession> AVSessionManagerImpl::CreateSession(const std::string& tag, int32_t type,
88 const AppExecFwk::ElementName& elementName)
89 {
90 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CreateSession");
91 if (tag.empty() || elementName.GetBundleName().empty() || elementName.GetAbilityName().empty()) {
92 SLOGE("param is invalid");
93 return nullptr;
94 }
95 if (type != AVSession::SESSION_TYPE_AUDIO && type != AVSession::SESSION_TYPE_VIDEO
96 && type != AVSession::SESSION_TYPE_VOICE_CALL) {
97 SLOGE("type is invalid");
98 return nullptr;
99 }
100
101 auto service = GetService();
102 return service ? service->CreateSession(tag, type, elementName) : nullptr;
103 }
104
GetAllSessionDescriptors(std::vector<AVSessionDescriptor> & descriptors)105 int32_t AVSessionManagerImpl::GetAllSessionDescriptors(std::vector<AVSessionDescriptor>& descriptors)
106 {
107 auto service = GetService();
108 return service ? service->GetAllSessionDescriptors(descriptors) : ERR_SERVICE_NOT_EXIST;
109 }
110
GetActivatedSessionDescriptors(std::vector<AVSessionDescriptor> & activatedSessions)111 int32_t AVSessionManagerImpl::GetActivatedSessionDescriptors(std::vector<AVSessionDescriptor>& activatedSessions)
112 {
113 std::vector<AVSessionDescriptor> descriptors;
114 int32_t ret = GetAllSessionDescriptors(descriptors);
115 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetAllSessionDescriptors failed");
116
117 for (const auto& descriptor : descriptors) {
118 if (descriptor.isActive_) {
119 activatedSessions.push_back(descriptor);
120 }
121 }
122 return ret;
123 }
124
GetSessionDescriptorsBySessionId(const std::string & sessionId,AVSessionDescriptor & descriptor)125 int32_t AVSessionManagerImpl::GetSessionDescriptorsBySessionId(const std::string& sessionId,
126 AVSessionDescriptor& descriptor)
127 {
128 if (sessionId.empty()) {
129 SLOGE("sessionId is invalid");
130 return ERR_INVALID_PARAM;
131 }
132
133 auto service = GetService();
134 return service ? service->GetSessionDescriptorsBySessionId(sessionId, descriptor) : ERR_SERVICE_NOT_EXIST;
135 }
136
GetHistoricalSessionDescriptors(int32_t maxSize,std::vector<AVSessionDescriptor> & descriptors)137 int32_t AVSessionManagerImpl::GetHistoricalSessionDescriptors(int32_t maxSize,
138 std::vector<AVSessionDescriptor>& descriptors)
139 {
140 auto service = GetService();
141 return service ? service->GetHistoricalSessionDescriptors(maxSize, descriptors) : ERR_SERVICE_NOT_EXIST;
142 }
143
GetHistoricalAVQueueInfos(int32_t maxSize,int32_t maxAppSize,std::vector<AVQueueInfo> & avQueueInfo)144 int32_t AVSessionManagerImpl::GetHistoricalAVQueueInfos(int32_t maxSize, int32_t maxAppSize,
145 std::vector<AVQueueInfo>& avQueueInfo)
146 {
147 auto service = GetService();
148 return service ? service->GetHistoricalAVQueueInfos(maxSize, maxAppSize, avQueueInfo) : ERR_SERVICE_NOT_EXIST;
149 }
150
StartAVPlayback(const std::string & bundleName,const std::string & assetId)151 int32_t AVSessionManagerImpl::StartAVPlayback(const std::string& bundleName, const std::string& assetId)
152 {
153 auto service = GetService();
154 return service ? service->StartAVPlayback(bundleName, assetId) : ERR_SERVICE_NOT_EXIST;
155 }
156
CreateController(const std::string & sessionId,std::shared_ptr<AVSessionController> & controller)157 int32_t AVSessionManagerImpl::CreateController(const std::string& sessionId,
158 std::shared_ptr<AVSessionController>& controller)
159 {
160 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CreateController");
161 if (sessionId.empty()) {
162 SLOGE("sessionId is invalid");
163 return ERR_INVALID_PARAM;
164 }
165
166 auto service = GetService();
167 return service ? service->CreateController(sessionId, controller) : ERR_SERVICE_NOT_EXIST;
168 }
169
170 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastController(const std::string & sessionId,std::shared_ptr<AVCastController> & castController)171 int32_t AVSessionManagerImpl::GetAVCastController(const std::string& sessionId,
172 std::shared_ptr<AVCastController>& castController)
173 {
174 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::GetAVCastController");
175 if (sessionId.empty()) {
176 SLOGE("sessionId is invalid");
177 return ERR_INVALID_PARAM;
178 }
179
180 auto service = GetService();
181 return service ? service->GetAVCastController(sessionId, castController) : ERR_SERVICE_NOT_EXIST;
182 }
183 #endif
184
RegisterSessionListener(const std::shared_ptr<SessionListener> & listener)185 int32_t AVSessionManagerImpl::RegisterSessionListener(const std::shared_ptr<SessionListener>& listener)
186 {
187 if (listener == nullptr) {
188 SLOGE("listener is nullptr");
189 return ERR_INVALID_PARAM;
190 }
191
192 auto service = GetService();
193 if (service == nullptr) {
194 return ERR_SERVICE_NOT_EXIST;
195 }
196
197 if (listener_ != nullptr) {
198 return ERR_SESSION_LISTENER_EXIST;
199 }
200
201 listener_ = new(std::nothrow) SessionListenerClient(listener);
202 if (listener_ == nullptr) {
203 return ERR_NO_MEMORY;
204 }
205 auto ret = service->RegisterSessionListener(listener_);
206 if (ret != AVSESSION_SUCCESS) {
207 std::lock_guard<std::mutex> lockGuard(lock_);
208 listener_.clear();
209 return ret;
210 }
211 return AVSESSION_SUCCESS;
212 }
213
RegisterServiceDeathCallback(const DeathCallback & callback)214 int32_t AVSessionManagerImpl::RegisterServiceDeathCallback(const DeathCallback& callback)
215 {
216 deathCallback_ = callback;
217 return AVSESSION_SUCCESS;
218 }
219
UnregisterServiceDeathCallback()220 int32_t AVSessionManagerImpl::UnregisterServiceDeathCallback()
221 {
222 deathCallback_ = nullptr;
223 return AVSESSION_SUCCESS;
224 }
225
SendSystemAVKeyEvent(const MMI::KeyEvent & keyEvent)226 int32_t AVSessionManagerImpl::SendSystemAVKeyEvent(const MMI::KeyEvent& keyEvent)
227 {
228 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::SendSystemAVKeyEvent");
229 if (!keyEvent.IsValid()) {
230 SLOGE("keyEvent is invalid");
231 return ERR_COMMAND_NOT_SUPPORT;
232 }
233
234 auto service = GetService();
235 return service ? service->SendSystemAVKeyEvent(keyEvent) : ERR_SERVICE_NOT_EXIST;
236 }
237
SendSystemControlCommand(const AVControlCommand & command)238 int32_t AVSessionManagerImpl::SendSystemControlCommand(const AVControlCommand& command)
239 {
240 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::SendSystemControlCommand");
241 if (!command.IsValid()) {
242 SLOGE("command is invalid");
243 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", command.GetCommand(),
244 "ERROR_CODE", ERR_INVALID_PARAM, "ERROR_INFO", "avsessionmanagerimpl command is invalid");
245 return ERR_COMMAND_NOT_SUPPORT;
246 }
247
248 auto service = GetService();
249 if (service == nullptr) {
250 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "GET_SERVICE_ERROR",
251 "ERROR_CODE", ERR_SERVICE_NOT_EXIST, "ERROR_INFO", "mgrimp sendsystemcontrolcommand get service error");
252 return ERR_SERVICE_NOT_EXIST;
253 }
254 return service->SendSystemControlCommand(command);
255 }
256
CastAudio(const SessionToken & token,const std::vector<AudioStandard::AudioDeviceDescriptor> & descriptors)257 int32_t AVSessionManagerImpl::CastAudio(const SessionToken& token,
258 const std::vector<AudioStandard::AudioDeviceDescriptor>& descriptors)
259 {
260 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CastAudio");
261 CHECK_AND_RETURN_RET_LOG(descriptors.size() > 0, ERR_INVALID_PARAM, "devices size is zero");
262 auto service = GetService();
263 return service ? service->CastAudio(token, descriptors) : ERR_SERVICE_NOT_EXIST;
264 }
265
CastAudioForAll(const std::vector<AudioStandard::AudioDeviceDescriptor> & descriptors)266 int32_t AVSessionManagerImpl::CastAudioForAll(const std::vector<AudioStandard::AudioDeviceDescriptor>& descriptors)
267 {
268 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CastAudioForAll");
269 CHECK_AND_RETURN_RET_LOG(descriptors.size() > 0, ERR_INVALID_PARAM, "devices size is zero");
270 auto service = GetService();
271 return service ? service->CastAudioForAll(descriptors) : ERR_SERVICE_NOT_EXIST;
272 }
273
Close(void)274 int32_t AVSessionManagerImpl::Close(void)
275 {
276 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::Close");
277 int32_t ret = ERR_SERVICE_NOT_EXIST;
278 auto service = GetService();
279 if (service) {
280 sptr<IAVSessionService> serviceBase = service;
281 serviceBase->AsObject()->RemoveDeathRecipient(serviceDeathRecipient_);
282 serviceDeathRecipient_ = nullptr;
283 ret = service->Close();
284 }
285 SLOGI("manager impl close with listener clear");
286 listener_.clear();
287 return ret;
288 }
289
290 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
StartCastDiscovery(const int32_t castDeviceCapability)291 int32_t AVSessionManagerImpl::StartCastDiscovery(const int32_t castDeviceCapability)
292 {
293 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StartCastDiscovery");
294 auto service = GetService();
295 return service ? service->StartCastDiscovery(castDeviceCapability) : ERR_SERVICE_NOT_EXIST;
296 }
297
StopCastDiscovery()298 int32_t AVSessionManagerImpl::StopCastDiscovery()
299 {
300 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StopCastDiscovery");
301 auto service = GetService();
302 return service ? service->StopCastDiscovery() : ERR_SERVICE_NOT_EXIST;
303 }
304
SetDiscoverable(const bool enable)305 int32_t AVSessionManagerImpl::SetDiscoverable(const bool enable)
306 {
307 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::SetDiscoverable");
308 auto service = GetService();
309 return service ? service->SetDiscoverable(enable) : ERR_SERVICE_NOT_EXIST;
310 }
311
StartCast(const SessionToken & sessionToken,const OutputDeviceInfo & outputDeviceInfo)312 int32_t AVSessionManagerImpl::StartCast(const SessionToken& sessionToken, const OutputDeviceInfo& outputDeviceInfo)
313 {
314 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StartCast");
315 auto service = GetService();
316 return service ? service->StartCast(sessionToken, outputDeviceInfo) : ERR_SERVICE_NOT_EXIST;
317 }
318
StopCast(const SessionToken & sessionToken)319 int32_t AVSessionManagerImpl::StopCast(const SessionToken& sessionToken)
320 {
321 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StopCast");
322 auto service = GetService();
323 return service ? service->StopCast(sessionToken) : ERR_SERVICE_NOT_EXIST;
324 }
325 #endif
326
RegisterClientDeathObserver()327 void AVSessionManagerImpl::RegisterClientDeathObserver()
328 {
329 clientDeath_ = new(std::nothrow) ClientDeathStub();
330 if (clientDeath_ == nullptr) {
331 SLOGE("malloc failed");
332 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "MALLOC_FAILED",
333 "ERROR_INFO", "avsession manager impl register client death observer malloc failed");
334 return;
335 }
336
337 if (service_->RegisterClientDeathObserver(clientDeath_) != AVSESSION_SUCCESS) {
338 SLOGE("register failed");
339 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "REGISTER_FAILED",
340 "ERROR_INFO", "avsession manager impl register client death observer register failed");
341 return;
342 }
343 SLOGI("success");
344 }
345
ServiceDeathRecipient(const std::function<void ()> & callback)346 ServiceDeathRecipient::ServiceDeathRecipient(const std::function<void()>& callback)
347 : callback_(callback)
348 {
349 SLOGD("construct");
350 }
351
OnRemoteDied(const wptr<IRemoteObject> & object)352 void ServiceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& object)
353 {
354 if (callback_) {
355 callback_();
356 }
357 }
358 } // namespace OHOS::AVSession
359