• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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