1 /*
2 * Copyright (c) 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 "migrate_avsession_server.h"
17
18 #include <chrono>
19 #include <thread>
20
21 #include "audio_device_manager.h"
22 #include "avsession_errors.h"
23 #include "avsession_item.h"
24 #include "avsession_log.h"
25 #include "avsession_service.h"
26 #include "softbus/softbus_session_utils.h"
27 #include "migrate_avsession_constant.h"
28 #include "base64_utils.h"
29 #include "avsession_pixel_map_adapter.h"
30 #include "pixel_map.h"
31 #include "image_packer.h"
32 #include "avsession_event_handler.h"
33
34 namespace OHOS::AVSession {
MigrateAVSessionServer(int32_t migrateMode)35 MigrateAVSessionServer::MigrateAVSessionServer(int32_t migrateMode)
36 {
37 migrateMode_ = migrateMode;
38 }
39
OnConnectProxy(const std::string & deviceId)40 void MigrateAVSessionServer::OnConnectProxy(const std::string &deviceId)
41 {
42 SLOGI("OnConnectProxy: %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
43 isSoftbusConnecting_ = true;
44 deviceId_ = deviceId;
45 if (migrateMode_ == MIGRATE_MODE_NEXT) {
46 SLOGI("connect process as next behavior");
47 LocalFrontSessionArrive(lastSessionId_);
48 RegisterAudioCallbackAndTrigger();
49 return;
50 }
51 ObserveControllerChanged(deviceId);
52 SendSpecialKeepaliveData();
53 SendRemoteHistorySessionList(deviceId);
54 SendRemoteControllerList(deviceId);
55 }
56
OnDisconnectProxy(const std::string & deviceId)57 void MigrateAVSessionServer::OnDisconnectProxy(const std::string &deviceId)
58 {
59 SLOGI("OnDisConnectProxy: %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
60 UnregisterAudioCallback();
61 isSoftbusConnecting_ = false;
62 if (servicePtr_ == nullptr) {
63 SLOGE("do NotifyMigrateStop without servicePtr, return");
64 return;
65 }
66 servicePtr_->NotifyMigrateStop(deviceId);
67 }
68
RegisterAudioCallbackAndTrigger()69 void MigrateAVSessionServer::RegisterAudioCallbackAndTrigger()
70 {
71 AudioAdapter::GetInstance().RegisterVolumeKeyEventCallback(volumeKeyEventCallbackFunc_);
72 volumeKeyEventCallbackFunc_(AudioAdapter::GetInstance().GetVolume());
73
74 AudioAdapter::GetInstance().SetAvailableDeviceChangeCallback(availableDeviceChangeCallbackFunc_);
75 availableDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetAvailableDevices());
76
77 AudioAdapter::GetInstance().SetPreferredOutputDeviceChangeCallback(preferredDeviceChangeCallbackFunc_);
78 preferredDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo());
79 }
80
UnregisterAudioCallback()81 void MigrateAVSessionServer::UnregisterAudioCallback()
82 {
83 if (migrateMode_ == MIGRATE_MODE_NEXT) {
84 AudioAdapter::GetInstance().UnregisterVolumeKeyEventCallback();
85 AudioAdapter::GetInstance().UnsetAvailableDeviceChangeCallback();
86 AudioAdapter::GetInstance().UnsetPreferredOutputDeviceChangeCallback();
87 }
88 }
89
GetCharacteristic()90 int32_t MigrateAVSessionServer::GetCharacteristic()
91 {
92 return MSG_HEAD_MODE;
93 }
94
ObserveControllerChanged(const std::string & deviceId)95 void MigrateAVSessionServer::ObserveControllerChanged(const std::string &deviceId)
96 {
97 std::vector<AVSessionDescriptor> descriptors;
98 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
99 if (res != AVSESSION_SUCCESS) {
100 SLOGW("GetAllSessionDescriptors fail");
101 return;
102 }
103
104 for (auto &item : descriptors) {
105 if (item.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
106 item.elementName_.GetBundleName().empty() ||
107 item.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
108 continue;
109 }
110 if (item.isTopSession_) {
111 std::lock_guard lockGuard(topSessionLock_);
112 topSessionId_ = item.sessionId_;
113 }
114 CreateController(item.sessionId_);
115 }
116 }
117
CreateController(const std::string & sessionId)118 void MigrateAVSessionServer::CreateController(const std::string &sessionId)
119 {
120 {
121 std::lock_guard lockGuard(migrateControllerLock_);
122 auto it = playerIdToControllerCallbackMap_.find(sessionId);
123 if (it != playerIdToControllerCallbackMap_.end()) {
124 SLOGW("CreateControlller has registered");
125 return;
126 }
127 }
128 sptr<IRemoteObject> proxyObject;
129 int32_t ret = servicePtr_->CreateControllerInner(sessionId, proxyObject);
130 if (ret != AVSESSION_SUCCESS && !(ret == ERR_CONTROLLER_IS_EXIST && proxyObject != nullptr)) {
131 SLOGW("CreateControllerInner fail");
132 return;
133 }
134 sptr<AVControllerItem> controller = iface_cast<AVControllerItem>(proxyObject);
135 if (controller == nullptr) {
136 SLOGW("controller is null");
137 return;
138 }
139 std::shared_ptr<AVControllerObserver> callback = std::make_shared<AVControllerObserver>(sessionId);
140 std::weak_ptr<MigrateAVSessionServer> migrageServerWeak(shared_from_this());
141 callback->Init(migrageServerWeak, migrateMode_);
142 ret = controller->RegisterAVControllerCallback(callback);
143 if (ret != AVSESSION_SUCCESS) {
144 SLOGW("RegisteAVControllerCallback fail");
145 return;
146 }
147 AVMetaData::MetaMaskType metaDataFilter(METADATA_MASK_ALL);
148 AVPlaybackState::PlaybackStateMaskType playFilter(PLAYBACK_MASK_ALL);
149 controller->SetMetaFilter(metaDataFilter);
150 controller->SetPlaybackFilter(playFilter);
151 UpdateCache(sessionId, controller, callback, true);
152 }
153
ClearCacheBySessionId(const std::string & sessionId)154 void MigrateAVSessionServer::ClearCacheBySessionId(const std::string &sessionId)
155 {
156 std::lock_guard lockGuard(migrateControllerLock_);
157 auto it = playerIdToControllerMap_.find(sessionId);
158 if (it != playerIdToControllerMap_.end()) {
159 if (std::count(sortControllerList_.begin(), sortControllerList_.end(), it->second) > 0) {
160 SLOGI("ClearCacheBySessionId in and remove controller in sortList");
161 sortControllerList_.remove(it->second);
162 }
163 playerIdToControllerMap_.erase(it);
164 }
165
166 auto item = playerIdToControllerCallbackMap_.find(sessionId);
167 if (item != playerIdToControllerCallbackMap_.end()) {
168 playerIdToControllerCallbackMap_.erase(item);
169 }
170 }
171
172 // LCOV_EXCL_START
UpdateCache(const std::string & sessionId,sptr<AVControllerItem> avcontroller,std::shared_ptr<AVControllerObserver> callback,bool isAdd)173 void MigrateAVSessionServer::UpdateCache(const std::string &sessionId, sptr<AVControllerItem> avcontroller,
174 std::shared_ptr<AVControllerObserver> callback, bool isAdd)
175 {
176 if (isAdd) {
177 if (avcontroller == nullptr) {
178 return;
179 }
180 std::lock_guard lockGuard(migrateControllerLock_);
181 playerIdToControllerMap_.insert({sessionId, avcontroller});
182 playerIdToControllerCallbackMap_.insert({sessionId, callback});
183 sortControllerList_.push_back(avcontroller);
184 } else {
185 ClearCacheBySessionId(sessionId);
186 }
187 }
188 // LCOV_EXCL_STOP
189
StopObserveControllerChanged(const std::string & deviceId)190 void MigrateAVSessionServer::StopObserveControllerChanged(const std::string &deviceId)
191 {
192 SLOGI("StopObserveControllerChanged with id %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
193 std::lock_guard lockGuard(migrateControllerLock_);
194 for (auto it = sortControllerList_.begin(); it != sortControllerList_.end(); it++) {
195 (*it)->Destroy();
196 SLOGI("Controller destroy");
197 }
198 deviceId_ = "";
199 playerIdToControllerMap_.clear();
200 sortControllerList_.clear();
201 playerIdToControllerCallbackMap_.clear();
202 }
203
204 // LCOV_EXCL_START
OnBytesReceived(const std::string & deviceId,const std::string & data)205 void MigrateAVSessionServer::OnBytesReceived(const std::string &deviceId, const std::string &data)
206 {
207 SLOGD("OnBytesReceived: %{public}s", data.c_str());
208 if (data.length() < MSG_HEAD_LENGTH) {
209 SLOGW("OnBytesReceived: invalid data");
210 return;
211 }
212 if (migrateMode_ == MIGRATE_MODE_NEXT) {
213 ProcFromNext(deviceId, data);
214 return;
215 }
216 if (data[1] == SYNC_COMMAND) {
217 ProcControlCommand(data);
218 } else if (data[1] == COLD_START) {
219 StartConfigHistorySession(data);
220 }
221 }
222 // LCOV_EXCL_STOP
223
ProcControlCommand(const std::string & data)224 void MigrateAVSessionServer::ProcControlCommand(const std::string &data)
225 {
226 std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
227 SLOGI("ProcControlCommand: %{public}s", jsonStr.c_str());
228 Json::Reader reader;
229 Json::Value root;
230 if (!reader.parse(jsonStr, root)) {
231 SLOGE("json parse fail");
232 return;
233 }
234 if (!root.isMember(PLAYER_ID) || !root.isMember(MEDIA_COMMAND) ||
235 !root.isMember(COMMAND)) {
236 SLOGE("json parse with error member");
237 return;
238 }
239 std::string playerId = root[PLAYER_ID].isString() ?
240 root[PLAYER_ID].asString() : "ERROR_PLAYER_ID";
241 sptr<AVControllerItem> avcontroller{nullptr};
242 auto res = GetControllerById(playerId, avcontroller);
243 if (res != AVSESSION_SUCCESS || avcontroller == nullptr) {
244 SLOGW("GetControllerById fail");
245 return;
246 }
247 int mediaCommand = root[MEDIA_COMMAND].isInt() ? root[MEDIA_COMMAND].asInt() : -1;
248 std::string command = root[COMMAND].isString() ? root[COMMAND].asString() : "ERROR_COMMAND";
249 SLOGI("ProcContolCommand mediaCommand: %{public}d", mediaCommand);
250 std::string extras = (root.isMember(EXTRAS) && root[EXTRAS].isString()) ? root[EXTRAS].asString() : "ERROR_EXTRAS";
251 switch (mediaCommand) {
252 case SYNC_MEDIASESSION_CALLBACK_ON_COMMAND:
253 SendCommandProc(command, avcontroller);
254 break;
255 case SYNC_MEDIASESSION_CALLBACK_ON_MEDIABUTTON_EVENT:
256 MediaButtonEventProc(command, avcontroller);
257 break;
258 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
259 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
260 case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
261 CommandWithExtrasProc(mediaCommand, command, extras, avcontroller);
262 break;
263 default:
264 PlaybackCommandDataProc(mediaCommand, command, avcontroller);
265 break;
266 }
267 }
268
StartConfigHistorySession(const std::string & data)269 void MigrateAVSessionServer::StartConfigHistorySession(const std::string &data)
270 {
271 std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
272 SLOGI("StartConfigHistorySession: %{public}s", jsonStr.c_str());
273 Json::Reader reader;
274 Json::Value jsonData;
275 if (!reader.parse(jsonStr, jsonData)) {
276 SLOGE("StartConfigHistorySession: parse json failed");
277 return;
278 }
279 if (!jsonData.isMember(PLAYER_ID)) {
280 SLOGE("StartConfigHistorySession: json parse with error member");
281 return;
282 }
283 std::string playerId = jsonData[PLAYER_ID].isString() ? jsonData[PLAYER_ID].asString() : "ERROR_PLAYER_ID";
284 int32_t ret = servicePtr_->StartAVPlayback(playerId, "");
285 SLOGI("StartConfigHistorySession StartAVPlayback %{public}s, ret=%{public}d", playerId.c_str(), ret);
286 }
287
288 // LCOV_EXCL_START
GetControllerById(const std::string & sessionId,sptr<AVControllerItem> & controller)289 int32_t MigrateAVSessionServer::GetControllerById(const std::string &sessionId, sptr<AVControllerItem> &controller)
290 {
291 if (sessionId.empty()) {
292 SLOGW("empty sessionId");
293 return AVSESSION_ERROR;
294 }
295
296 std::lock_guard lockGuard(migrateControllerLock_);
297 for (auto it = playerIdToControllerMap_.begin(); it != playerIdToControllerMap_.end(); it++) {
298 std::string foundId = it->first;
299 if (it->first == sessionId) {
300 controller = it->second;
301 return AVSESSION_SUCCESS;
302 }
303 }
304 SLOGW("controller not found");
305 return AVSESSION_ERROR;
306 }
307
GetAllControllers(std::vector<sptr<AVControllerItem>> & controller)308 int32_t MigrateAVSessionServer::GetAllControllers(std::vector<sptr<AVControllerItem>> &controller)
309 {
310 std::lock_guard lockGuard(migrateControllerLock_);
311 std::vector<AVSessionDescriptor> descriptors;
312 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
313 if (res != AVSESSION_SUCCESS) {
314 SLOGW("GetAllSessionDescriptors failed");
315 return AVSESSION_ERROR;
316 }
317 for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
318 if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
319 iter->elementName_.GetBundleName().empty() ||
320 iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
321 releaseSessionId_.compare(iter->sessionId_) == 0) {
322 continue;
323 }
324 auto it = playerIdToControllerMap_.find(iter->sessionId_);
325 controller.push_back(it->second);
326 }
327 return AVSESSION_SUCCESS;
328 }
329 // LCOV_EXCL_STOP
330
Init(AVSessionService * ptr)331 void MigrateAVSessionServer::Init(AVSessionService *ptr)
332 {
333 servicePtr_ = ptr;
334 supportCrossMediaPlay_ = false;
335 }
336
ResetSupportCrossMediaPlay(const std::string & extraInfo)337 void MigrateAVSessionServer::ResetSupportCrossMediaPlay(const std::string &extraInfo)
338 {
339 Json::Reader reader;
340 Json::Value jsonData;
341 if (!reader.parse(extraInfo, jsonData)) {
342 SLOGE("json parse fail");
343 return;
344 }
345 bool isSupportSingleFrameMediaPlay = jsonData[IS_SUPPORT_SINGLE_FRAME_MEDIA_PLAY].isBool() ?
346 jsonData[IS_SUPPORT_SINGLE_FRAME_MEDIA_PLAY].asBool() :
347 false;
348 SLOGI("SuperLauncher: isSupportSingleFrameMediaPlay=%{public}d", isSupportSingleFrameMediaPlay);
349 supportCrossMediaPlay_ = isSupportSingleFrameMediaPlay;
350 }
351
352 // LCOV_EXCL_START
OnSessionCreate(const AVSessionDescriptor & descriptor)353 void MigrateAVSessionServer::OnSessionCreate(const AVSessionDescriptor &descriptor)
354 {
355 if (migrateMode_ == MIGRATE_MODE_NEXT) {
356 return;
357 }
358 SLOGI("OnSessionCreate");
359 std::string sessionId = descriptor.sessionId_;
360 if (sessionId.empty()) {
361 SLOGW("no valid avsession");
362 return;
363 }
364 if (descriptor.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
365 descriptor.elementName_.GetBundleName().empty() ||
366 descriptor.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
367 SLOGI("not audio avsession or anco audio");
368 return;
369 }
370 std::string identity = IPCSkeleton::ResetCallingIdentity();
371 CreateController(sessionId);
372 IPCSkeleton::SetCallingIdentity(identity);
373 }
374
OnSessionRelease(const AVSessionDescriptor & descriptor)375 void MigrateAVSessionServer::OnSessionRelease(const AVSessionDescriptor &descriptor)
376 {
377 if (migrateMode_ == MIGRATE_MODE_NEXT) {
378 return;
379 }
380 std::string sessionId = descriptor.sessionId_;
381 if (sessionId.empty()) {
382 SLOGW("no valid avsession");
383 return;
384 }
385 SLOGI("OnSessionRelease : %{public}s", sessionId.c_str());
386 ClearCacheBySessionId(sessionId);
387 releaseSessionId_ = sessionId;
388 releaseSessionBundleName_ = descriptor.elementName_.GetBundleName();
389 SendRemoteHistorySessionList(deviceId_);
390 SendRemoteControllerList(deviceId_);
391 }
392
OnTopSessionChange(const AVSessionDescriptor & descriptor)393 void MigrateAVSessionServer::OnTopSessionChange(const AVSessionDescriptor &descriptor)
394 {
395 if (migrateMode_ == MIGRATE_MODE_NEXT) {
396 return;
397 }
398 SLOGI("OnTopSessionChange sessionId_: %{public}s", descriptor.sessionId_.c_str());
399 {
400 std::lock_guard lockGuard(topSessionLock_);
401 if (descriptor.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
402 descriptor.elementName_.GetBundleName().empty() ||
403 descriptor.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
404 SLOGI("not audio avsession or anco audio");
405 return;
406 }
407 if (topSessionId_ == descriptor.sessionId_) {
408 return;
409 }
410 lastSessionId_ = topSessionId_;
411 topSessionId_ = descriptor.sessionId_;
412 auto it = playerIdToControllerMap_.find(descriptor.sessionId_);
413 if (it == playerIdToControllerMap_.end()) {
414 CreateController(descriptor.sessionId_);
415 }
416 }
417 SendRemoteHistorySessionList(deviceId_);
418 SendRemoteControllerList(deviceId_);
419 }
420
SortControllers(std::list<sptr<AVControllerItem>> controllers)421 void MigrateAVSessionServer::SortControllers(std::list<sptr<AVControllerItem>> controllers)
422 {
423 SLOGI("SortControllers");
424 std::lock_guard topSessionLockGuard(topSessionLock_);
425 if (topSessionId_.empty()) {
426 SLOGE("SortControllers topSessionId is null");
427 return;
428 }
429 std::lock_guard lockGuard(migrateControllerLock_);
430 for (auto iter = controllers.begin(); iter != controllers.end(); iter++) {
431 if ((*iter)->GetSessionId() == topSessionId_) {
432 controllers.splice(controllers.begin(), controllers, iter);
433 break;
434 }
435 }
436 }
437
SendRemoteControllerList(const std::string & deviceId)438 void MigrateAVSessionServer::SendRemoteControllerList(const std::string &deviceId)
439 {
440 SLOGI("SendRemoteControllerList");
441 SortControllers(sortControllerList_);
442 std::vector<sptr<AVControllerItem>> avcontroller;
443 auto res = GetAllControllers(avcontroller);
444 if (res != AVSESSION_SUCCESS) {
445 SLOGE("SendRemoteControllerList no top session");
446 return;
447 }
448 if (avcontroller.empty()) {
449 SLOGE("SendRemoteControllerList avcontroller is null");
450 ClearRemoteControllerList(deviceId);
451 return;
452 }
453 std::string msg = ConvertControllersToStr(avcontroller);
454
455 if (!deviceId.empty()) {
456 SendByte(deviceId, msg);
457 } else {
458 SendByteToAll(msg);
459 }
460 AVSessionEventHandler::GetInstance().AVSessionPostTask([this]() {
461 DelaySendMetaData();
462 }, "DelaySendMetaData", DELAY_TIME);
463 }
464
SendRemoteHistorySessionList(const std::string & deviceId)465 void MigrateAVSessionServer::SendRemoteHistorySessionList(const std::string &deviceId)
466 {
467 if (!supportCrossMediaPlay_) {
468 SLOGI("SendRemoteHistorySessionList, Remote does not support cross media play");
469 return;
470 }
471
472 std::vector<AVSessionDescriptor> descriptors;
473 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
474 if (res != AVSESSION_SUCCESS) {
475 SLOGW("GetAllSessionDescriptors fail");
476 return;
477 }
478
479 std::vector<AVSessionDescriptor> hisDescriptors;
480 auto hisRes = servicePtr_->GetHistoricalSessionDescriptors(MAX_HISTORY_SESSION_NUMS, hisDescriptors);
481 if (hisRes != AVSESSION_SUCCESS) {
482 SLOGW("GetHistoricalSessionDescriptors fail");
483 return;
484 }
485
486 std::string msg = ConvertHistorySessionListToStr(descriptors, hisDescriptors);
487 if (!deviceId.empty()) {
488 SendByte(deviceId, msg);
489 } else {
490 SendByteToAll(msg);
491 }
492 }
493
ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,std::vector<AVSessionDescriptor> hisSessionDescriptors)494 std::string MigrateAVSessionServer::ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,
495 std::vector<AVSessionDescriptor> hisSessionDescriptors)
496 {
497 Json::Value jsonArray(Json::arrayValue);
498 int32_t descriptorNums = 0;
499 if (!releaseSessionId_.empty()) {
500 Json::Value releaseData;
501 std::string supportModule;
502 std::string profile;
503 if (BundleStatusAdapter::GetInstance().IsSupportPlayIntent(releaseSessionBundleName_, supportModule, profile)) {
504 releaseData[PLAYER_ID] = releaseSessionId_;
505 releaseData[PACKAGE_NAME] = releaseSessionBundleName_;
506 jsonArray[descriptorNums] = releaseData;
507 descriptorNums++;
508 }
509 }
510 for (auto iter = sessionDescriptors.begin(); iter != sessionDescriptors.end(); iter++) {
511 if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
512 iter->elementName_.GetBundleName().empty() ||
513 iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
514 releaseSessionId_.compare(iter->sessionId_) == 0) {
515 continue;
516 }
517 Json::Value jsonData;
518 jsonData[PLAYER_ID] = iter->sessionId_;
519 jsonData[PACKAGE_NAME] = iter->elementName_.GetBundleName();
520 jsonArray[descriptorNums] = jsonData;
521 descriptorNums++;
522 }
523 for (auto iter = hisSessionDescriptors.begin(); iter != hisSessionDescriptors.end(); iter++) {
524 if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
525 iter->elementName_.GetBundleName().empty() ||
526 iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
527 releaseSessionId_.compare(iter->sessionId_) == 0) {
528 continue;
529 }
530 Json::Value jsonData;
531 jsonData[PLAYER_ID] = iter->sessionId_;
532 jsonData[PACKAGE_NAME] = iter->elementName_.GetBundleName();
533 jsonArray[descriptorNums] = jsonData;
534 descriptorNums++;
535 }
536 Json::Value jsonData;
537 jsonData[HISTORY_MEDIA_PLAYER_INFO] = jsonArray;
538
539 Json::FastWriter writer;
540 std::string jsonStr = writer.write(jsonData);
541 char header[] = {MSG_HEAD_MODE, GET_HISTORY_MEDIA_INFO, '\0'};
542 std::string msg = std::string(header) + jsonStr;
543 return msg;
544 }
545
DelaySendMetaData()546 void MigrateAVSessionServer::DelaySendMetaData()
547 {
548 sptr<AVControllerItem> avcontroller{nullptr};
549 GetControllerById(topSessionId_, avcontroller);
550 if (avcontroller != nullptr) {
551 AVMetaData resultMetaData;
552 resultMetaData.Reset();
553 avcontroller->GetAVMetaData(resultMetaData);
554 AVMetaData metaDataInfo = resultMetaData;
555 std::shared_ptr<AVSessionPixelMap> pixelImage = resultMetaData.GetMediaImage();
556 std::shared_ptr<AVSessionPixelMap> mediaImage = std::make_shared<AVSessionPixelMap>();
557 if (pixelImage != nullptr) {
558 SLOGI("ready to copy image");
559 mediaImage->SetInnerImgBuffer(pixelImage->GetInnerImgBuffer());
560 metaDataInfo.SetMediaImage(mediaImage);
561 std::string metaDataStr = ConvertMetadataInfoToStr(topSessionId_,
562 SYNC_CONTROLLER_CALLBACK_ON_METADATA_CHANNGED, metaDataInfo);
563 SendByte(deviceId_, metaDataStr);
564 }
565 if (mediaImage != nullptr) {
566 mediaImage->Clear();
567 }
568 }
569 }
570
GenerateClearAVSessionMsg()571 std::string MigrateAVSessionServer::GenerateClearAVSessionMsg()
572 {
573 Json::Value jsonArray(Json::arrayValue);
574 Json::Value jsonData;
575 jsonData[MEDIA_CONTROLLER_LIST] = jsonArray;
576 Json::FastWriter writer;
577 std::string jsonStr = writer.write(jsonData);
578 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST, '\0'};
579 std::string msg = std::string(header) + jsonStr;
580 return msg;
581 }
582
GenerateClearHistorySessionMsg()583 std::string MigrateAVSessionServer::GenerateClearHistorySessionMsg()
584 {
585 SLOGI("GenerateClearHistorySessionMsg");
586 Json::Value jsonArray(Json::arrayValue);
587 Json::Value jsonData;
588 jsonData[HISTORY_MEDIA_PLAYER_INFO] = jsonArray;
589 Json::FastWriter writer;
590 std::string jsonStr = writer.write(jsonData);
591 char header[] = {MSG_HEAD_MODE, GET_HISTORY_MEDIA_INFO, '\0'};
592 std::string msg = std::string(header) + jsonStr;
593 return msg;
594 }
595
ClearRemoteControllerList(const std::string & deviceId)596 void MigrateAVSessionServer::ClearRemoteControllerList(const std::string &deviceId)
597 {
598 std::lock_guard lockGuard(migrateControllerLock_);
599 std::string msg = GenerateClearAVSessionMsg();
600 if (!deviceId.empty()) {
601 SendByte(deviceId, msg);
602 }
603 }
604
ClearRemoteHistorySessionList(const std::string & deviceId)605 void MigrateAVSessionServer::ClearRemoteHistorySessionList(const std::string &deviceId)
606 {
607 if (!supportCrossMediaPlay_) {
608 SLOGI("ClearRemoteHistorySessionList, Remote does not support cross media play");
609 return;
610 }
611 std::lock_guard lockGuard(historySessionLock_);
612 std::string msg = GenerateClearHistorySessionMsg();
613 if (!deviceId.empty()) {
614 SendByte(deviceId, msg);
615 }
616 }
617
ConvertControllersToStr(std::vector<sptr<AVControllerItem>> avcontrollers)618 std::string MigrateAVSessionServer::ConvertControllersToStr(
619 std::vector<sptr<AVControllerItem>> avcontrollers)
620 {
621 SLOGI("ConvertControllersToStr");
622 Json::Value jsonArray(Json::arrayValue);
623 int32_t sessionNums = 0;
624 for (auto& controller : avcontrollers) {
625 if (sessionNums >= MAX_SESSION_NUMS) {
626 break;
627 }
628 if (controller == nullptr) {
629 continue;
630 }
631 std::string playerId = controller->GetSessionId();
632 Json::Value jsonObject = ConvertControllerToJson(controller);
633 jsonObject[PLAYER_ID] = playerId;
634 jsonArray[sessionNums] = jsonObject;
635 sessionNums++;
636 }
637 Json::Value jsonData;
638 jsonData[MEDIA_CONTROLLER_LIST] = jsonArray;
639
640 Json::FastWriter writer;
641 std::string jsonStr = writer.write(jsonData);
642 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST, '\0'};
643 std::string msg = std::string(header) + jsonStr;
644 return msg;
645 }
646 // LCOV_EXCL_STOP
647
ConvertControllerToJson(sptr<AVControllerItem> avcontroller)648 Json::Value MigrateAVSessionServer::ConvertControllerToJson(sptr<AVControllerItem> avcontroller)
649 {
650 SLOGI("ConvertControllerToJson");
651 Json::Value metadata;
652 AVMetaData data;
653 data.Reset();
654 avcontroller->GetAVMetaData(data);
655 metadata = ConvertMetadataToJson(data, false);
656
657 AVPlaybackState state;
658 if (AVSESSION_SUCCESS == avcontroller->GetAVPlaybackState(state)) {
659 metadata[PLAYBACK_STATE] = RebuildPlayState(state);
660 }
661
662 metadata[SESSION_INFO] =
663 "OAAAAEJOREwBAAAAEwAAAEMAbwBuAHQAcgBvAGwAbABlAHIAVwBoAGkAdABlAEwAaQBzAHQAAAAU\nAAAAAQAAAA==\n";
664 metadata[VOLUME_INFO] = VOLUMN_INFO;
665 metadata[PACKAGE_NAME] = GetBundleName(avcontroller->GetSessionId());
666 return metadata;
667 }
668
669 // LCOV_EXCL_START
GetBundleName(std::string sessionId)670 std::string MigrateAVSessionServer::GetBundleName(std::string sessionId)
671 {
672 std::vector<AVSessionDescriptor> descriptors;
673
674 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
675 if (res != AVSESSION_SUCCESS) {
676 SLOGW("GetAllSessionDescriptors fail");
677 return "";
678 }
679 for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
680 if (iter->sessionId_ == sessionId) {
681 std::string bundleName = iter->elementName_.GetBundleName();
682 std::string abilityName = iter->elementName_.GetAbilityName();
683 SLOGI("bundleName: %{public}s abilityName: %{public}s", bundleName.c_str(), abilityName.c_str());
684 return bundleName;
685 }
686 }
687 SLOGW("GetBundleName fail");
688 return "";
689 }
690
ConvertStateFromSingleToDouble(int32_t state)691 int32_t MigrateAVSessionServer::ConvertStateFromSingleToDouble(int32_t state)
692 {
693 switch (state) {
694 case AVPlaybackState::PLAYBACK_STATE_PLAY:
695 return MEDIA_SESSION_PLAYBACK_STATE_PLAY;
696 case AVPlaybackState::PLAYBACK_STATE_PAUSE:
697 return MEDIA_SESSION_PLAYBACK_STATE_PAUSE;
698 case AVPlaybackState::PLAYBACK_STATE_STOP:
699 return MEDIA_SESSION_PLAYBACK_STATE_STOP;
700 case AVPlaybackState::PLAYBACK_STATE_ERROR:
701 return MEDIA_SESSION_PLAYBACK_STATE_ERROR;
702 default:
703 SLOGW("unknowState: %{public}d", state);
704 break;
705 }
706 return state;
707 }
708
RebuildPlayState(const AVPlaybackState & playbackState)709 std::string MigrateAVSessionServer::RebuildPlayState(const AVPlaybackState &playbackState)
710 {
711 int64_t actions = 1911;
712 Parcel parcel;
713 parcel.WriteInt32(ConvertStateFromSingleToDouble(playbackState.GetState()))
714 && parcel.WriteInt64(playbackState.GetPosition().elapsedTime_)
715 && parcel.WriteFloat(playbackState.GetSpeed())
716 && parcel.WriteInt64(playbackState.GetPosition().updateTime_)
717 && parcel.WriteInt64(playbackState.GetBufferedTime())
718 && parcel.WriteInt64(actions)
719 && parcel.WriteInt32(-1)
720 && parcel.WriteInt64(playbackState.GetActiveItemId())
721 && parcel.WriteInt32(1)
722 && parcel.WriteCString("")
723 && parcel.WriteInt32(-1);
724
725 uint8_t* pointer = reinterpret_cast<uint8_t*>(parcel.GetData());
726 size_t len = parcel.GetDataSize();
727 std::vector<uint8_t> vec(len);
728 for (size_t i = 0; i < len; ++i) {
729 vec[i] = pointer[i];
730 }
731 std::string str = Base64Utils::Base64Encode(vec);
732 return str;
733 }
734
ConvertMetadataToJson(const AVMetaData & metadata)735 Json::Value MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata)
736 {
737 return ConvertMetadataToJson(metadata, true);
738 }
739
ConvertMetadataToJson(const AVMetaData & metadata,bool includeImage)740 Json::Value MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata, bool includeImage)
741 {
742 Json::Value result;
743 if (metadata.IsValid()) {
744 SLOGI("ConvertMetadataToJson without img");
745 result[METADATA_TITLE] = metadata.GetTitle();
746 result[METADATA_ARTIST] = metadata.GetArtist();
747 if (includeImage) {
748 std::string mediaImage = "";
749 std::vector<uint8_t> outputData(BUFFER_MAX_SIZE);
750 int32_t ret = CompressToJPEG(metadata, outputData);
751 mediaImage = ((ret == true) && (!outputData.empty())) ? Base64Utils::Base64Encode(outputData) : "";
752 result[METADATA_IMAGE] = mediaImage;
753 }
754 } else {
755 result[METADATA_TITLE] = "";
756 result[METADATA_ARTIST] = "";
757 result[METADATA_IMAGE] = "";
758 }
759 return result;
760 }
761
CompressToJPEG(const AVMetaData & metadata,std::vector<uint8_t> & outputData)762 bool MigrateAVSessionServer::CompressToJPEG(const AVMetaData &metadata, std::vector<uint8_t> &outputData)
763 {
764 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metadata.GetMediaImage();
765 std::shared_ptr<Media::PixelMap> pixelMap;
766 if (innerPixelMap == nullptr) {
767 return false;
768 } else {
769 pixelMap = AVSessionPixelMapAdapter::ConvertFromInner(innerPixelMap);
770 }
771
772 Media::ImagePacker imagePacker;
773 Media::PackOption option;
774 option.format = "image/jpeg";
775 option.quality = DEFAULT_QUALITY;
776 uint32_t maxSize = outputData.size();
777 uint32_t ret = imagePacker.StartPacking(outputData.data(), maxSize, option);
778 if (ret != 0) {
779 SLOGI("Failed to start packing");
780 return false;
781 }
782 if (pixelMap == nullptr) {
783 SLOGE("CompressToJPEG with pixel get null");
784 return false;
785 }
786 ret = imagePacker.AddImage(*pixelMap);
787 if (ret != 0) {
788 SLOGI("Failed to add image");
789 return false;
790 }
791 int64_t packedSize = 0;
792 ret = imagePacker.FinalizePacking(packedSize);
793 if (ret != 0) {
794 SLOGI("Failed to finalize packing");
795 return false;
796 }
797
798 outputData.resize(packedSize);
799 return true;
800 }
801
ConvertMetadataInfoToStr(const std::string playerId,int32_t controlCommand,const AVMetaData & metadata)802 std::string MigrateAVSessionServer::ConvertMetadataInfoToStr(
803 const std::string playerId, int32_t controlCommand, const AVMetaData &metadata)
804 {
805 SLOGI("ConvertMetadataInfoToStr");
806 Json::Value metaDataJson = ConvertMetadataToJson(metadata);
807 metaDataJson[PLAYER_ID] = playerId;
808 metaDataJson[MEDIA_INFO] = controlCommand;
809 Json::FastWriter writer;
810 std::string msg = writer.write(metaDataJson);
811 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
812 return std::string(header) + msg;
813 }
814
SendSpecialKeepaliveData()815 void MigrateAVSessionServer::SendSpecialKeepaliveData()
816 {
817 std::thread([this]() {
818 std::this_thread::sleep_for(std::chrono::milliseconds(HEART_BEAT_TIME));
819 if (this->isSoftbusConnecting_) {
820 char header[] = {MSG_HEAD_MODE, SYNC_HEARTBEAT, '\0'};
821 std::string data = std::string(header);
822 SendByteToAll(data);
823 SendSpecialKeepaliveData();
824 SLOGI("send special mediamession data to proxy connection");
825 } else {
826 SLOGI("send special mediamession data to proxy exit");
827 }
828 }).detach();
829 }
830
SendCommandProc(const std::string & command,sptr<AVControllerItem> controller)831 void MigrateAVSessionServer::SendCommandProc(const std::string &command, sptr<AVControllerItem> controller)
832 {
833 if (command == EVENT_COMMAND_UNLOCK_LYRIC || command == EVENT_COMMAND_SHOW_LYRIC ||
834 command == EVENT_COMMAND_HIDE_LYRIC) {
835 } else {
836 SLOGW("command is not support: %{public}s", command.c_str());
837 }
838 }
839
MediaButtonEventProc(const std::string & command,sptr<AVControllerItem> controller)840 void MigrateAVSessionServer::MediaButtonEventProc(const std::string &command, sptr<AVControllerItem> controller)
841 {
842 std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
843 if (keyEvent == nullptr) {
844 SLOGE("MediaButtonEventProc with key event null");
845 return;
846 }
847 keyEvent->SetKeyCode(atoi(command.c_str()));
848 controller->SendAVKeyEvent(*keyEvent.get());
849 }
850
CommandWithExtrasProc(int mediaCommand,const std::string & extrasCommand,const std::string & extras,sptr<AVControllerItem> controller)851 void MigrateAVSessionServer::CommandWithExtrasProc(int mediaCommand, const std::string &extrasCommand,
852 const std::string &extras, sptr<AVControllerItem> controller)
853 {
854 SLOGI("CommandWithExtrasProc mediaCommand is: %{public}d", mediaCommand);
855 switch (mediaCommand) {
856 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
857 break;
858 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
859 break;
860 case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
861 break;
862 default:
863 SLOGW("mediaCommand is not support: %{public}d", mediaCommand);
864 break;
865 }
866 }
867
PlaybackCommandDataProc(int mediaCommand,const std::string & command,sptr<AVControllerItem> controller)868 void MigrateAVSessionServer::PlaybackCommandDataProc(int mediaCommand, const std::string &command,
869 sptr<AVControllerItem> controller)
870 {
871 SLOGI("PlaybackComandDataProc Command is: %{public}d", mediaCommand);
872 AVControlCommand cmd;
873 switch (mediaCommand) {
874 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY:
875 AVSessionEventHandler::GetInstance().AVSessionPostTask([=]() {
876 AVControlCommand cmd;
877 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY);
878 controller->SendControlCommand(cmd);
879 }, "DelaySendPlayCom", DELAY_PLAY_COM_TIME);
880 break;
881 case SYNC_MEDIASESSION_CALLBACK_ON_PAUSE:
882 cmd.SetCommand(AVControlCommand::SESSION_CMD_PAUSE);
883 controller->SendControlCommand(cmd);
884 break;
885 case SYNC_MEDIASESSION_CALLBACK_ON_STOP:
886 cmd.SetCommand(AVControlCommand::SESSION_CMD_STOP);
887 controller->SendControlCommand(cmd);
888 break;
889 case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_PREVIOUS:
890 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
891 controller->SendControlCommand(cmd);
892 break;
893 case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_NEXT:
894 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
895 controller->SendControlCommand(cmd);
896 break;
897 case SYNC_MEDIASESSION_CALLBACK_ON_SET_RATING:
898 break;
899 case SYNC_CONTROLLER_CALLBACK_ON_AUDIOINFO_CHANGED:
900 break;
901 default:
902 SLOGI("mediaCommand is not support: %{public}s", command.c_str());
903 break;
904 }
905 }
906
OnHistoricalRecordChange()907 void MigrateAVSessionServer::OnHistoricalRecordChange()
908 {
909 SendRemoteHistorySessionList(deviceId_);
910 }
911
OnMetaDataChange(const std::string & playerId,const AVMetaData & data)912 void MigrateAVSessionServer::OnMetaDataChange(const std::string & playerId, const AVMetaData &data)
913 {
914 std::string metaDataStr = ConvertMetadataInfoToStr(playerId, SYNC_CONTROLLER_CALLBACK_ON_METADATA_CHANNGED, data);
915 SLOGI("MigrateAVSessionServer OnMetaDataChange: %{public}s", metaDataStr.c_str());
916
917 SendByte(deviceId_, metaDataStr);
918 }
919 // LCOV_EXCL_STOP
920
OnPlaybackStateChanged(const std::string & playerId,const AVPlaybackState & state)921 void MigrateAVSessionServer::OnPlaybackStateChanged(const std::string &playerId, const AVPlaybackState &state)
922 {
923 Json::Value value;
924 value[PLAYER_ID] = playerId;
925 value[MEDIA_INFO] = SYNC_CONTROLLER_CALLBACK_ON_PLAYBACKSTATE_CHANGED;
926 value[CALLBACK_INFO] = RebuildPlayState(state);
927 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
928 Json::FastWriter writer;
929 std::string msg = writer.write(value);
930 std::string result = std::string(header) + msg;
931 SendByte(deviceId_, result);
932 }
933
934 // LCOV_EXCL_START
OnSessionDestroy()935 void AVControllerObserver::OnSessionDestroy()
936 {
937 SLOGI("OnSessionDestroy");
938 }
939
OnPlaybackStateChange(const AVPlaybackState & state)940 void AVControllerObserver::OnPlaybackStateChange(const AVPlaybackState &state)
941 {
942 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
943 if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
944 server->HandleFocusPlaybackStateChange(playerId_, state);
945 return;
946 }
947 if (server != nullptr && state.GetState() != AVPlaybackState::PLAYBACK_STATE_INITIAL) {
948 server->OnPlaybackStateChanged(playerId_, state);
949 }
950 }
951
OnMetaDataChange(const AVMetaData & data)952 void AVControllerObserver::OnMetaDataChange(const AVMetaData &data)
953 {
954 SLOGI("OnMetaDataChange check migrateMode:%{public}d", migrateMode_);
955 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
956 if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
957 server->HandleFocusMetaDataChange(playerId_, data);
958 return;
959 }
960 if (server != nullptr) {
961 server->OnMetaDataChange(playerId_, data);
962 }
963 }
964
OnValidCommandChange(const std::vector<int32_t> & cmds)965 void AVControllerObserver::OnValidCommandChange(const std::vector<int32_t> &cmds)
966 {
967 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
968 if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
969 server->HandleFocusValidCommandChange(playerId_, cmds);
970 return;
971 }
972 }
973
974
Init(std::weak_ptr<MigrateAVSessionServer> migrateServer,int32_t migrateMode)975 void AVControllerObserver::Init(std::weak_ptr<MigrateAVSessionServer> migrateServer, int32_t migrateMode)
976 {
977 migrateServer_ = migrateServer;
978 migrateMode_ = migrateMode;
979 }
980 // LCOV_EXCL_STOP
981 } // namespace OHOS::AVSession