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