• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 <chrono>
17 #include <thread>
18 
19 #include "migrate_avsession_proxy.h"
20 
21 #include "avsession_log.h"
22 #include "avsession_service.h"
23 #include "softbus/softbus_session_utils.h"
24 #include "int_wrapper.h"
25 #include "string_wrapper.h"
26 
27 namespace OHOS::AVSession {
28 
MigrateAVSessionProxy(AVSessionService * ptr,int32_t mode)29 MigrateAVSessionProxy::MigrateAVSessionProxy(AVSessionService *ptr, int32_t mode)
30 {
31     mMode_ = mode;
32     servicePtr_ = ptr;
33 }
34 
~MigrateAVSessionProxy()35 MigrateAVSessionProxy::~MigrateAVSessionProxy()
36 {
37     SLOGI("MigrateAVSessionProxy destruct with disconnect process");
38     OnDisconnectServer(deviceId_);
39 }
40 
OnConnectServer(const std::string & deviceId)41 void MigrateAVSessionProxy::OnConnectServer(const std::string &deviceId)
42 {
43     SLOGI("MigrateAVSessionProxy OnConnectServer:%{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
44     deviceId_ = deviceId;
45     SendSpecialKeepAliveData();
46     PrepareSessionFromRemote();
47     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnConnectServer find service ptr null!");
48     std::vector<sptr<IRemoteObject>> sessionControllers;
49     sessionControllers.push_back(preSetController_);
50     servicePtr_->NotifyRemoteDistributedSessionControllersChanged(sessionControllers);
51 }
52 
OnDisconnectServer(const std::string & deviceId)53 void MigrateAVSessionProxy::OnDisconnectServer(const std::string &deviceId)
54 {
55     SLOGI("MigrateAVSessionProxy OnDisconnectServer:%{public}s",
56         SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
57     deviceId_ = "";
58     std::vector<sptr<IRemoteObject>> sessionControllers;
59     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDisconnectServer find service ptr null!");
60     servicePtr_->NotifyRemoteDistributedSessionControllersChanged(sessionControllers);
61 }
62 
GetCharacteristic()63 int32_t MigrateAVSessionProxy::GetCharacteristic()
64 {
65     return mMode_;
66 }
67 
68 //LCOV_EXCL_START
OnBytesReceived(const std::string & deviceId,const std::string & data)69 void MigrateAVSessionProxy::OnBytesReceived(const std::string &deviceId, const std::string &data)
70 {
71     if (data.length() <= MSG_HEAD_LENGTH) {
72         SLOGE("OnBytesReceived too short to process");
73         return;
74     }
75     int32_t infoType = data[1];
76     SLOGI("OnBytesReceived with infoType: %{public}d", infoType);
77     std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
78     if (infoType == SYNC_FOCUS_MEDIA_IMAGE) {
79         ProcessMediaImage(jsonStr);
80         return;
81     } else if (infoType == SYNC_FOCUS_BUNDLE_IMG) {
82         ProcessBundleImg(jsonStr);
83         return;
84     }
85 
86     Json::Value jsonValue;
87     if (!SoftbusSessionUtils::TransferStrToJson(jsonStr, jsonValue)) {
88         SLOGE("OnBytesReceived parse json fail");
89         return;
90     }
91 
92     switch (infoType) {
93         case SYNC_FOCUS_SESSION_INFO:
94             ProcessSessionInfo(jsonValue);
95             break;
96         case SYNC_FOCUS_META_INFO:
97             ProcessMetaData(jsonValue);
98             break;
99         case SYNC_FOCUS_PLAY_STATE:
100             ProcessPlaybackState(jsonValue);
101             break;
102         case SYNC_FOCUS_VALID_COMMANDS:
103             ProcessValidCommands(jsonValue);
104             break;
105         case SYNC_SET_VOLUME_COMMAND:
106             ProcessVolumeControlCommand(jsonValue);
107             break;
108         case SYNC_AVAIL_DEVICES_LIST:
109             ProcessAvailableDevices(jsonValue);
110             break;
111         case SYNC_CURRENT_DEVICE:
112             ProcessPreferredOutputDevice(jsonValue);
113             break;
114         default:
115             SLOGE("OnBytesReceived with unknow infoType:%{public}d", infoType);
116             break;
117     }
118 }
119 //LCOV_EXCL_STOP
120 
HandlePlay()121 void MigrateAVSessionProxy::HandlePlay()
122 {
123     SendControlCommandMsg(AVControlCommand::SESSION_CMD_PLAY, DEFAULT_STRING);
124 }
125 
HandlePause()126 void MigrateAVSessionProxy::HandlePause()
127 {
128     SendControlCommandMsg(AVControlCommand::SESSION_CMD_PAUSE, DEFAULT_STRING);
129 }
130 
HandlePlayNext()131 void MigrateAVSessionProxy::HandlePlayNext()
132 {
133     SendControlCommandMsg(AVControlCommand::SESSION_CMD_PLAY_NEXT, DEFAULT_STRING);
134 }
135 
HandlePlayPrevious()136 void MigrateAVSessionProxy::HandlePlayPrevious()
137 {
138     SendControlCommandMsg(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS, DEFAULT_STRING);
139 }
140 
HandleToggleFavorite(const std::string & mediaId)141 void MigrateAVSessionProxy::HandleToggleFavorite(const std::string& mediaId)
142 {
143     SendControlCommandMsg(AVControlCommand::SESSION_CMD_TOGGLE_FAVORITE, mediaId);
144 }
145 
HandleCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)146 void MigrateAVSessionProxy::HandleCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
147 {
148     SLOGI("HandleCommonCommand with command:%{public}s", commonCommand.c_str());
149 }
150 
GetDistributedSessionControllerList(std::vector<sptr<IRemoteObject>> & controllerList)151 void MigrateAVSessionProxy::GetDistributedSessionControllerList(std::vector<sptr<IRemoteObject>>& controllerList)
152 {
153     CHECK_AND_RETURN_LOG(preSetController_ != nullptr, "GetDistributedSessionControllerList with controller null");
154     controllerList.insert(controllerList.begin(), preSetController_);
155 }
156 
PrepareSessionFromRemote()157 void MigrateAVSessionProxy::PrepareSessionFromRemote()
158 {
159     SLOGI("PrepareSessionFromRemote in");
160     AVSessionDescriptor descriptor;
161     descriptor.sessionId_ = DEFAULT_STRING;
162     descriptor.sessionTag_ = DEFAULT_STRING;
163     descriptor.sessionType_ = AVSession::SESSION_TYPE_AUDIO;
164     descriptor.elementName_.SetBundleName(DEFAULT_STRING);
165     descriptor.elementName_.SetAbilityName(DEFAULT_STRING);
166     descriptor.isThirdPartyApp_ = false;
167 
168     remoteSession_ = new(std::nothrow) AVSessionItem(descriptor);
169     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "create avsession but get nullptr");
170     remoteSession_->SetPid(DEFAULT_NUM);
171     remoteSession_->SetUid(DEFAULT_NUM);
172 
173     OutputDeviceInfo outputDeviceInfo;
174     DeviceInfo deviceInfo;
175     deviceInfo.castCategory_ = AVCastCategory::CATEGORY_REMOTE;
176     deviceInfo.deviceId_ = DEFAULT_STRING;
177     deviceInfo.deviceName_ = DEFAULT_STRING;
178     outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
179     remoteSession_->SetOutputDevice(outputDeviceInfo);
180 
181     std::weak_ptr<MigrateAVSessionProxy> migrateProxyWeak(shared_from_this());
182     std::shared_ptr<AVSessionObserver> callback =
183         std::make_shared<AVSessionObserver>(remoteSession_->GetSessionId(), migrateProxyWeak);
184     remoteSession_->RegisterAVSessionCallback(callback);
185     PrepareControllerOfRemoteSession(remoteSession_);
186     SLOGI("PrepareSessionFromRemote done");
187 }
188 
PrepareControllerOfRemoteSession(sptr<AVSessionItem> sessionItem)189 void MigrateAVSessionProxy::PrepareControllerOfRemoteSession(sptr<AVSessionItem> sessionItem)
190 {
191     CHECK_AND_RETURN_LOG(sessionItem != nullptr, "PrepareControllerOfRemoteSession with remote session null");
192     preSetController_ = new(std::nothrow) AVControllerItem(DEFAULT_NUM, sessionItem);
193     CHECK_AND_RETURN_LOG(preSetController_ != nullptr, "PrepareControllerOfRemoteSession with controller create null");
194     migrateProxyCallback_ = MigrateAVSessionProxyControllerCallback();
195     preSetController_->RegisterMigrateAVSessionProxyCallback(migrateProxyCallback_);
196     sessionItem->AddController(DEFAULT_NUM, preSetController_);
197 }
198 
MigrateAVSessionProxyControllerCallback()199 const MigrateAVSessionProxyControllerCallbackFunc MigrateAVSessionProxy::MigrateAVSessionProxyControllerCallback()
200 {
201     return [this](const std::string& extraEvent, AAFwk::WantParams& extras) {
202         const auto& it = AUDIO_EVENT_MAPS.find(extraEvent);
203         if (it == AUDIO_EVENT_MAPS.end()) {
204             SLOGE("extraEvent %{public}s not support", extraEvent.c_str());
205             return ERR_COMMAND_NOT_SUPPORT;
206         }
207         switch (it->second) {
208             case AUDIO_NUM_SET_VOLUME:
209                 SetVolume(extras);
210                 break;
211             case AUDIO_NUM_SELECT_OUTPUT_DEVICE:
212                 SelectOutputDevice(extras);
213                 break;
214             case AUDIO_NUM_GET_VOLUME:
215                 GetVolume(extras);
216                 break;
217             case AUDIO_NUM_GET_AVAILABLE_DEVICES:
218                 GetAvailableDevices(extras);
219                 break;
220             case AUDIO_NUM_GET_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO:
221                 GetPreferredOutputDeviceForRendererInfo(extras);
222                 break;
223             case SESSION_NUM_COLD_START_FROM_PROXY:
224                 ColdStartFromProxy();
225                 break;
226             default:
227                 break;
228         }
229         return AVSESSION_SUCCESS;
230     };
231 }
232 
SetVolume(const AAFwk::WantParams & extras)233 void MigrateAVSessionProxy::SetVolume(const AAFwk::WantParams& extras)
234 {
235     SLOGI("proxy send in SetVolume case");
236     CHECK_AND_RETURN_LOG(extras.HasParam(AUDIO_SET_VOLUME), "extras not have event");
237     auto volume = extras.GetParam(AUDIO_SET_VOLUME);
238     AAFwk::IInteger* ao = AAFwk::IInteger::Query(volume);
239     CHECK_AND_RETURN_LOG(ao != nullptr, "extras have no value");
240 
241     volumeNum_ = OHOS::AAFwk::Integer::Unbox(ao);
242     Json::Value value;
243     std::string msg = std::string({MSG_HEAD_MODE, SYNC_SET_VOLUME_COMMAND});
244     value[AUDIO_VOLUME] = volumeNum_;
245     SoftbusSessionUtils::TransferJsonToStr(value, msg);
246     SendByte(deviceId_, msg);
247 }
248 
SelectOutputDevice(const AAFwk::WantParams & extras)249 void MigrateAVSessionProxy::SelectOutputDevice(const AAFwk::WantParams& extras)
250 {
251     SLOGI("proxy send in SelectOutputDevice case");
252     CHECK_AND_RETURN_LOG(extras.HasParam(AUDIO_SELECT_OUTPUT_DEVICE), "extras not have event");
253     auto value = extras.GetParam(AUDIO_SELECT_OUTPUT_DEVICE);
254     AAFwk::IString* stringValue = AAFwk::IString::Query(value);
255     CHECK_AND_RETURN_LOG(stringValue != nullptr, "extras have no value");
256 
257     std::string deviceValue = AAFwk::String::Unbox(stringValue);
258     std::string msg = std::string({MSG_HEAD_MODE, SYNC_SWITCH_AUDIO_DEVICE_COMMAND});
259     SendJsonStringByte(deviceId_, msg + deviceValue);
260 }
261 
GetVolume(AAFwk::WantParams & extras)262 void MigrateAVSessionProxy::GetVolume(AAFwk::WantParams& extras)
263 {
264     SLOGI("proxy send in GetVolume case");
265     extras.SetParam(AUDIO_GET_VOLUME, OHOS::AAFwk::Integer::Box(volumeNum_));
266 }
267 
GetAvailableDevices(AAFwk::WantParams & extras)268 void MigrateAVSessionProxy::GetAvailableDevices(AAFwk::WantParams& extras)
269 {
270     SLOGI("proxy send in GetAvailableDevices case");
271     Json::Value jsonData = MigrateAVSessionServer::ConvertAudioDeviceDescriptorsToJson(availableDevices_);
272     Json::Value jsonArray = jsonData[MEDIA_AVAILABLE_DEVICES_LIST];
273     std::string jsonStr;
274     SoftbusSessionUtils::TransferJsonToStr(jsonArray, jsonStr);
275     extras.SetParam(AUDIO_GET_AVAILABLE_DEVICES, OHOS::AAFwk::String::Box(jsonStr));
276 }
277 
GetPreferredOutputDeviceForRendererInfo(AAFwk::WantParams & extras)278 void MigrateAVSessionProxy::GetPreferredOutputDeviceForRendererInfo(AAFwk::WantParams& extras)
279 {
280     SLOGI("proxy send in GetPreferredOutputDeviceForRendererInfo case");
281     Json::Value jsonData = MigrateAVSessionServer::ConvertAudioDeviceDescriptorsToJson(preferredOutputDevice_);
282     Json::Value jsonArray = jsonData[MEDIA_AVAILABLE_DEVICES_LIST];
283     std::string jsonStr;
284     SoftbusSessionUtils::TransferJsonToStr(jsonArray, jsonStr);
285     extras.SetParam(AUDIO_GET_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO, OHOS::AAFwk::String::Box(jsonStr));
286 }
287 
ColdStartFromProxy()288 void MigrateAVSessionProxy::ColdStartFromProxy()
289 {
290     SLOGI("proxy send in ColdStartFromProxy case with bundleName:%{public}s", elementName_.GetAbilityName().c_str());
291     std::string msg = std::string({MSG_HEAD_MODE, COLD_START});
292     Json::Value controlMsg;
293     controlMsg[MIGRATE_BUNDLE_NAME] = elementName_.GetAbilityName();
294     SoftbusSessionUtils::TransferJsonToStr(controlMsg, msg);
295     SendByte(deviceId_, msg);
296 }
297 
ProcessSessionInfo(Json::Value jsonValue)298 void MigrateAVSessionProxy::ProcessSessionInfo(Json::Value jsonValue)
299 {
300     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "ProcessSessionInfo with remote session null");
301     std::string sessionId;
302 
303     if (jsonValue.isMember(MIGRATE_SESSION_ID)) {
304         sessionId = jsonValue[MIGRATE_SESSION_ID].isString() ?
305             jsonValue[MIGRATE_SESSION_ID].asString() : DEFAULT_STRING;
306     }
307     if (jsonValue.isMember(MIGRATE_BUNDLE_NAME)) {
308         std::string bundleName = jsonValue[MIGRATE_BUNDLE_NAME].isString() ?
309             jsonValue[MIGRATE_BUNDLE_NAME].asString() : DEFAULT_STRING;
310         elementName_.SetBundleName(bundleName);
311     }
312     if (jsonValue.isMember(MIGRATE_ABILITY_NAME)) {
313         std::string abilityName = jsonValue[MIGRATE_ABILITY_NAME].isString() ?
314             jsonValue[MIGRATE_ABILITY_NAME].asString() : DEFAULT_STRING;
315         elementName_.SetAbilityName(abilityName);
316     }
317     SLOGI("ProcessSessionInfo with sessionId:%{public}s|bundleName:%{public}s done",
318         SoftbusSessionUtils::AnonymizeDeviceId(sessionId).c_str(), elementName_.GetBundleName().c_str());
319     if (sessionId.empty() || sessionId == DEFAULT_STRING || sessionId == EMPTY_SESSION) {
320         remoteSession_->Deactivate();
321         elementName_.SetAbilityName(elementName_.GetBundleName());
322         elementName_.SetBundleName("");
323     } else {
324         remoteSession_->Activate();
325     }
326     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "ProcessSessionInfo find service ptr null!");
327     servicePtr_->NotifyRemoteBundleChange(elementName_.GetBundleName());
328 }
329 
CheckMediaAlive()330 bool MigrateAVSessionProxy::CheckMediaAlive()
331 {
332     return !elementName_.GetBundleName().empty();
333 }
334 
ProcessMetaData(Json::Value jsonValue)335 void MigrateAVSessionProxy::ProcessMetaData(Json::Value jsonValue)
336 {
337     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "ProcessMetaData with remote session null");
338     AVMetaData metaData;
339     if (AVSESSION_SUCCESS != remoteSession_->GetAVMetaData(metaData)) {
340         SLOGE("ProcessMetaData GetAVMetaData fail");
341     }
342     metaData.SetAssetId(DEFAULT_STRING);
343     if (jsonValue.isMember(METADATA_TITLE)) {
344         std::string title = jsonValue[METADATA_TITLE].isString() ?
345             jsonValue[METADATA_TITLE].asString() : DEFAULT_STRING;
346         metaData.SetTitle(title);
347     }
348     if (jsonValue.isMember(METADATA_ARTIST)) {
349         std::string artist = jsonValue[METADATA_ARTIST].isString() ?
350             jsonValue[METADATA_ARTIST].asString() : DEFAULT_STRING;
351         metaData.SetArtist(artist);
352     }
353     remoteSession_->SetAVMetaData(metaData);
354     SLOGI("ProcessMetaData set title:%{public}s", metaData.GetTitle().c_str());
355 }
356 
ProcessPlaybackState(Json::Value jsonValue)357 void MigrateAVSessionProxy::ProcessPlaybackState(Json::Value jsonValue)
358 {
359     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "ProcessPlaybackState with remote session null");
360     AVPlaybackState playbackState;
361     if (AVSESSION_SUCCESS != remoteSession_->GetAVPlaybackState(playbackState)) {
362         SLOGE("ProcessPlaybackState GetAVPlaybackState fail");
363     }
364     if (jsonValue.isMember(PLAYBACK_STATE)) {
365         int state = jsonValue[PLAYBACK_STATE].isInt() ?
366             jsonValue[PLAYBACK_STATE].asInt() : DEFAULT_NUM;
367         playbackState.SetState(state);
368     }
369     if (jsonValue.isMember(FAVOR_STATE)) {
370         int isFavor = jsonValue[FAVOR_STATE].isBool() ?
371             jsonValue[FAVOR_STATE].asBool() : false;
372         playbackState.SetFavorite(isFavor);
373     }
374     remoteSession_->SetAVPlaybackState(playbackState);
375     SLOGI("ProcessPlaybackState set state:%{public}d | isFavor:%{public}d",
376         playbackState.GetState(), playbackState.GetFavorite());
377 }
378 
ProcessValidCommands(Json::Value jsonValue)379 void MigrateAVSessionProxy::ProcessValidCommands(Json::Value jsonValue)
380 {
381     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "ProcessValidCommands with remote session null");
382     std::vector<int32_t> commands;
383     if (jsonValue.isMember(VALID_COMMANDS)) {
384         std::string commandsStr = jsonValue[VALID_COMMANDS].isString() ?
385             jsonValue[VALID_COMMANDS].asString() : "";
386         for (unsigned long i = 0; i < commandsStr.length(); i++) {
387             commands.insert(commands.begin(), static_cast<int>(commandsStr[i] - '0'));
388         }
389         remoteSession_->SetSupportCommand(commands);
390     }
391     SLOGI("ProcessValidCommands set cmd size:%{public}d", static_cast<int>(commands.size()));
392 }
393 
ProcessVolumeControlCommand(Json::Value jsonValue)394 void MigrateAVSessionProxy::ProcessVolumeControlCommand(Json::Value jsonValue)
395 {
396     SLOGI("proxy recv in ProcessVolumeControlCommand case");
397     if (!jsonValue.isMember(AUDIO_VOLUME)) {
398         SLOGE("json parse with error member");
399         return;
400     }
401 
402     volumeNum_ = jsonValue[AUDIO_VOLUME].isInt() ? jsonValue[AUDIO_VOLUME].asInt() : -1;
403     AudioAdapter::GetInstance().SetVolume(volumeNum_);
404 
405     AAFwk::WantParams args;
406     args.SetParam(AUDIO_CALLBACK_VOLUME, OHOS::AAFwk::Integer::Box(volumeNum_));
407     preSetController_->HandleSetSessionEvent(AUDIO_CALLBACK_VOLUME, args);
408 }
409 
DevicesJsonArrayToVector(Json::Value & jsonArray,AudioDeviceDescriptorsWithSptr & devices)410 void DevicesJsonArrayToVector(Json::Value& jsonArray, AudioDeviceDescriptorsWithSptr& devices)
411 {
412     devices.clear();
413     for (const Json::Value& jsonObject : jsonArray) {
414         int deviceCategory = jsonObject[AUDIO_DEVICE_CATEGORY].asInt();
415         int deviceType = jsonObject[AUDIO_DEVICE_TYPE].asInt();
416         int deviceRole = jsonObject[AUDIO_DEVICE_ROLE].asInt();
417         std::string networkId = jsonObject[AUDIO_NETWORK_ID].asString();
418         std::string deviceName = jsonObject[AUDIO_DEVICE_NAME].asString();
419         std::string macAddress = jsonObject[AUDIO_MAC_ADDRESS].asString();
420 
421         std::shared_ptr<AudioDeviceDescriptor> device = std::make_shared<AudioDeviceDescriptor>();
422         device->deviceCategory_ = static_cast<AudioStandard::DeviceCategory>(deviceCategory);
423         device->deviceType_ = static_cast<AudioStandard::DeviceType>(deviceType);
424         device->deviceRole_ = static_cast<AudioStandard::DeviceRole>(deviceRole);
425         device->networkId_ = networkId;
426         device->deviceName_ = deviceName;
427         device->macAddress_ = macAddress;
428         devices.push_back(device);
429     }
430 }
431 
ProcessAvailableDevices(Json::Value jsonValue)432 void MigrateAVSessionProxy::ProcessAvailableDevices(Json::Value jsonValue)
433 {
434     SLOGI("proxy recv in ProcessAvailableDevices case");
435     CHECK_AND_RETURN_LOG(jsonValue.isMember(MEDIA_AVAILABLE_DEVICES_LIST), "json parse with error member");
436     CHECK_AND_RETURN_LOG(jsonValue[MEDIA_AVAILABLE_DEVICES_LIST].isArray(), "json object is not array");
437 
438     Json::Value jsonArray = jsonValue[MEDIA_AVAILABLE_DEVICES_LIST];
439     DevicesJsonArrayToVector(jsonArray, availableDevices_);
440 
441     std::string jsonStr;
442     SoftbusSessionUtils::TransferJsonToStr(jsonArray, jsonStr);
443     AAFwk::WantParams args;
444     args.SetParam(AUDIO_CALLBACK_AVAILABLE_DEVICES, OHOS::AAFwk::String::Box(jsonStr));
445     preSetController_->HandleSetSessionEvent(AUDIO_CALLBACK_AVAILABLE_DEVICES, args);
446 }
447 
ProcessPreferredOutputDevice(Json::Value jsonValue)448 void MigrateAVSessionProxy::ProcessPreferredOutputDevice(Json::Value jsonValue)
449 {
450     SLOGI("proxy recv in ProcessPreferredOutputDevice case");
451     CHECK_AND_RETURN_LOG(jsonValue.isMember(MEDIA_AVAILABLE_DEVICES_LIST), "json parse with error member");
452     CHECK_AND_RETURN_LOG(jsonValue[MEDIA_AVAILABLE_DEVICES_LIST].isArray(), "json object is not array");
453 
454     Json::Value jsonArray = jsonValue[MEDIA_AVAILABLE_DEVICES_LIST];
455     DevicesJsonArrayToVector(jsonArray, preferredOutputDevice_);
456 
457     std::string jsonStr;
458     SoftbusSessionUtils::TransferJsonToStr(jsonArray, jsonStr);
459     AAFwk::WantParams args;
460     args.SetParam(AUDIO_CALLBACK_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO, OHOS::AAFwk::String::Box(jsonStr));
461     preSetController_->HandleSetSessionEvent(AUDIO_CALLBACK_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO, args);
462 }
463 
ProcessBundleImg(std::string bundleIconStr)464 void MigrateAVSessionProxy::ProcessBundleImg(std::string bundleIconStr)
465 {
466     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "ProcessBundleImg with remote session null");
467     AVMetaData metaData;
468     if (AVSESSION_SUCCESS != remoteSession_->GetAVMetaData(metaData)) {
469         SLOGE("ProcessBundleImg GetAVMetaData fail");
470     }
471     metaData.SetAssetId(DEFAULT_STRING);
472     std::vector<uint8_t> imgVec(bundleIconStr.begin(), bundleIconStr.end());
473     if (imgVec.size() <= 0) {
474         SLOGE("ProcessBundleImg with empty img, return");
475         return;
476     } else {
477         std::shared_ptr<AVSessionPixelMap> innerPixelMap = std::make_shared<AVSessionPixelMap>();
478         innerPixelMap->SetInnerImgBuffer(imgVec);
479         metaData.SetBundleIcon(innerPixelMap);
480     }
481     remoteSession_->SetAVMetaData(metaData);
482     SLOGI("ProcessBundleImg set img size:%{public}d", static_cast<int>(metaData.GetBundleIcon() == nullptr ?
483         -1 : metaData.GetBundleIcon()->GetInnerImgBuffer().size()));
484 }
485 
ProcessMediaImage(std::string mediaImageStr)486 void MigrateAVSessionProxy::ProcessMediaImage(std::string mediaImageStr)
487 {
488     CHECK_AND_RETURN_LOG(remoteSession_ != nullptr, "ProcessMediaImage with remote session null");
489     AVMetaData metaData;
490     if (AVSESSION_SUCCESS != remoteSession_->GetAVMetaData(metaData)) {
491         SLOGE("ProcessMediaImage GetAVMetaData fail");
492     }
493     metaData.SetAssetId(DEFAULT_STRING);
494     std::vector<uint8_t> imgVec(mediaImageStr.begin(), mediaImageStr.end());
495     if (imgVec.size() <= 0) {
496         metaData.SetMediaImageUri(DEFAULT_STRING);
497         metaData.SetMediaImage(nullptr);
498     } else {
499         std::shared_ptr<AVSessionPixelMap> innerPixelMap = std::make_shared<AVSessionPixelMap>();
500         innerPixelMap->SetInnerImgBuffer(imgVec);
501         metaData.SetMediaImageUri("");
502         metaData.SetMediaImage(innerPixelMap);
503     }
504     remoteSession_->SetAVMetaData(metaData);
505     SLOGI("ProcessMediaImage set img size:%{public}d", static_cast<int>(metaData.GetMediaImage() == nullptr ?
506         -1 : metaData.GetMediaImage()->GetInnerImgBuffer().size()));
507 }
508 
SendControlCommandMsg(int32_t commandCode,std::string commandArgsStr)509 void MigrateAVSessionProxy::SendControlCommandMsg(int32_t commandCode, std::string commandArgsStr)
510 {
511     SLOGI("SendControlCommandMsg with code:%{public}d", commandCode);
512     std::string msg = std::string({MSG_HEAD_MODE, SYNC_COMMAND});
513     Json::Value controlMsg;
514     controlMsg[COMMAND_CODE] = commandCode;
515     controlMsg[COMMAND_ARGS] = commandArgsStr;
516     SoftbusSessionUtils::TransferJsonToStr(controlMsg, msg);
517     SendByte(deviceId_, msg);
518 }
519 
SendSpecialKeepAliveData()520 void MigrateAVSessionProxy::SendSpecialKeepAliveData()
521 {
522     std::thread([this]() {
523         while (!this->deviceId_.empty()) {
524             std::this_thread::sleep_for(std::chrono::milliseconds(HEART_BEAT_TIME_FOR_NEXT));
525             if (this->deviceId_.empty()) {
526                 SLOGE("SendSpecialKeepAliveData without deviceId, return");
527                 return;
528             }
529             SLOGI("SendSpecialKeepAliveData for deviceId:%{public}s",
530                 SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
531             std::string data = std::string({MSG_HEAD_MODE, SYNC_HEARTBEAT});
532             SendByteToAll(data);
533         }
534         SLOGI("SendSpecialKeepAliveData exit");
535     }).detach();
536 }
537 
AVSessionObserver(const std::string & playerId,std::weak_ptr<MigrateAVSessionProxy> migrateProxy)538 AVSessionObserver::AVSessionObserver(const std::string &playerId, std::weak_ptr<MigrateAVSessionProxy> migrateProxy)
539 {
540     playerId_ = playerId;
541     migrateProxy_ = migrateProxy;
542 }
543 
OnPlay()544 void AVSessionObserver::OnPlay()
545 {
546     std::shared_ptr<MigrateAVSessionProxy> proxy = migrateProxy_.lock();
547     CHECK_AND_RETURN_LOG(proxy != nullptr, "check migrate proxy nullptr!");
548     proxy->HandlePlay();
549 }
550 
OnPause()551 void AVSessionObserver::OnPause()
552 {
553     std::shared_ptr<MigrateAVSessionProxy> proxy = migrateProxy_.lock();
554     CHECK_AND_RETURN_LOG(proxy != nullptr, "check migrate proxy nullptr!");
555     proxy->HandlePause();
556 }
557 
OnPlayNext()558 void AVSessionObserver::OnPlayNext()
559 {
560     std::shared_ptr<MigrateAVSessionProxy> proxy = migrateProxy_.lock();
561     CHECK_AND_RETURN_LOG(proxy != nullptr, "check migrate proxy nullptr!");
562     proxy->HandlePlayNext();
563 }
564 
OnPlayPrevious()565 void AVSessionObserver::OnPlayPrevious()
566 {
567     std::shared_ptr<MigrateAVSessionProxy> proxy = migrateProxy_.lock();
568     CHECK_AND_RETURN_LOG(proxy != nullptr, "check migrate proxy nullptr!");
569     proxy->HandlePlayPrevious();
570 }
571 
OnToggleFavorite(const std::string & mediaId)572 void AVSessionObserver::OnToggleFavorite(const std::string& mediaId)
573 {
574     std::shared_ptr<MigrateAVSessionProxy> proxy = migrateProxy_.lock();
575     CHECK_AND_RETURN_LOG(proxy != nullptr, "check migrate proxy nullptr!");
576     proxy->HandleToggleFavorite(mediaId);
577 }
578 
OnCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)579 void AVSessionObserver::OnCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
580 {
581     std::shared_ptr<MigrateAVSessionProxy> proxy = migrateProxy_.lock();
582     CHECK_AND_RETURN_LOG(proxy != nullptr, "check migrate proxy nullptr!");
583     proxy->HandleCommonCommand(commonCommand, commandArgs);
584 }
585 } // namespace OHOS::AVSession