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 "avsession_errors.h"
22 #include "avsession_item.h"
23 #include "avsession_log.h"
24 #include "avsession_service.h"
25 #include "softbus/softbus_session_utils.h"
26 #include "migrate_avsession_constant.h"
27 #include "base64_utils.h"
28
29 namespace OHOS::AVSession {
OnConnectProxy(const std::string & deviceId)30 void MigrateAVSessionServer::OnConnectProxy(const std::string &deviceId)
31 {
32 SLOGI("OnConnectProxy: %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
33 isSoftbusConnecting_ = true;
34 deviceId_ = deviceId;
35 ObserveControllerChanged(deviceId);
36 SendSpecialKeepaliveData();
37 SendRemoteControllerList(deviceId);
38 }
39
OnDisconnectProxy(const std::string & deviceId)40 void MigrateAVSessionServer::OnDisconnectProxy(const std::string &deviceId)
41 {
42 SLOGI("OnDisConnectProxy: %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
43 isSoftbusConnecting_ = false;
44 StopObserveControllerChanged(deviceId);
45 }
46
GetCharacteristic()47 int32_t MigrateAVSessionServer::GetCharacteristic()
48 {
49 return MSG_HEAD_MODE;
50 }
51
ObserveControllerChanged(const std::string & deviceId)52 void MigrateAVSessionServer::ObserveControllerChanged(const std::string &deviceId)
53 {
54 std::vector<AVSessionDescriptor> descriptors;
55 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
56 if (res != AVSESSION_SUCCESS) {
57 SLOGW("GetAllSessionDescriptors fail");
58 return;
59 }
60
61 for (auto &item : descriptors) {
62 if (item.isTopSession_) {
63 std::lock_guard lockGuard(topSessionLock_);
64 topSessionId_ = item.sessionId_;
65 }
66 CreateController(item.sessionId_);
67 }
68 }
69
CreateController(const std::string & sessionId)70 void MigrateAVSessionServer::CreateController(const std::string &sessionId)
71 {
72 std::lock_guard lockGuard(migrateControllerLock_);
73 auto it = playerIdToControllerCallbackMap_.find(sessionId);
74 if (it != playerIdToControllerCallbackMap_.end()) {
75 SLOGW("CreateControlller has registered");
76 return;
77 }
78 sptr<IRemoteObject> proxyObject;
79 int32_t ret = servicePtr_->CreateControllerInner(sessionId, proxyObject);
80 if (ret != AVSESSION_SUCCESS && !(ret == ERR_CONTROLLER_IS_EXIST && proxyObject != nullptr)) {
81 SLOGW("CreateControllerInner fail");
82 return;
83 }
84 sptr<AVControllerItem> controller = iface_cast<AVControllerItem>(proxyObject);
85 if (controller == nullptr) {
86 SLOGW("controller is null");
87 return;
88 }
89 std::shared_ptr<AVControllerObserver> callback = std::make_shared<AVControllerObserver>(sessionId);
90 std::weak_ptr<MigrateAVSessionServer> migrageServerWeak(shared_from_this());
91 callback->Init(migrageServerWeak);
92 ret = controller->RegisterAVControllerCallback(callback);
93 if (ret != AVSESSION_SUCCESS) {
94 SLOGW("RegisteAVControllerCallback fail");
95 return;
96 }
97 AVMetaData::MetaMaskType metaDataFilter(METADATA_MASK_ALL);
98 AVPlaybackState::PlaybackStateMaskType playFilter(PLAYBACK_MASK_ALL);
99 controller->SetMetaFilter(metaDataFilter);
100 controller->SetPlaybackFilter(playFilter);
101 UpdateCache(sessionId, controller, callback, true);
102 }
103
ClearCacheBySessionId(const std::string & sessionId)104 void MigrateAVSessionServer::ClearCacheBySessionId(const std::string &sessionId)
105 {
106 std::lock_guard lockGuard(migrateControllerLock_);
107 auto it = playerIdToControllerMap_.find(sessionId);
108 if (it != playerIdToControllerMap_.end()) {
109 playerIdToControllerMap_.erase(it);
110 sortControllerList_.remove(it->second);
111 }
112
113 auto item = playerIdToControllerCallbackMap_.find(sessionId);
114 if (item != playerIdToControllerCallbackMap_.end()) {
115 playerIdToControllerCallbackMap_.erase(item);
116 }
117 }
118
UpdateCache(const std::string & sessionId,sptr<AVControllerItem> avcontroller,std::shared_ptr<AVControllerObserver> callback,bool isAdd)119 void MigrateAVSessionServer::UpdateCache(const std::string &sessionId, sptr<AVControllerItem> avcontroller,
120 std::shared_ptr<AVControllerObserver> callback, bool isAdd)
121 {
122 if (isAdd) {
123 if (avcontroller == nullptr) {
124 return;
125 }
126 std::lock_guard lockGuard(migrateControllerLock_);
127 playerIdToControllerMap_.insert({sessionId, avcontroller});
128 playerIdToControllerCallbackMap_.insert({sessionId, callback});
129 sortControllerList_.push_back(avcontroller);
130 } else {
131 ClearCacheBySessionId(sessionId);
132 }
133 }
134
StopObserveControllerChanged(const std::string & deviceId)135 void MigrateAVSessionServer::StopObserveControllerChanged(const std::string &deviceId)
136 {
137 SLOGI("StopObserveControllerChanged");
138 std::lock_guard lockGuard(migrateControllerLock_);
139 for (auto it = sortControllerList_.begin(); it != sortControllerList_.end(); it++) {
140 (*it)->Destroy();
141 SLOGI("Controller destroy");
142 }
143 deviceId_ = "";
144 playerIdToControllerMap_.clear();
145 sortControllerList_.clear();
146 playerIdToControllerCallbackMap_.clear();
147 }
148
OnBytesReceived(const std::string & deviceId,const std::string & data)149 void MigrateAVSessionServer::OnBytesReceived(const std::string &deviceId, const std::string &data)
150 {
151 SLOGI("OnBytesReceived: %{public}s", data.c_str());
152 if (data.length() < MSG_HEAD_LENGTH) {
153 SLOGW("OnBytesReceived: invalid data");
154 return;
155 }
156 if (data[1] == SYNC_COMMAND) {
157 ProcControlCommand(data);
158 } else if (data[1] == COLD_START) {
159 SLOGW("COLD_START not support");
160 }
161 }
162
ProcControlCommand(const std::string & data)163 void MigrateAVSessionServer::ProcControlCommand(const std::string &data)
164 {
165 std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
166 SLOGI("ProcControlCommand: %{public}s", jsonStr.c_str());
167 Json::Reader reader;
168 Json::Value root;
169 if (!reader.parse(jsonStr, root)) {
170 SLOGE("json parse fail");
171 return;
172 }
173
174 std::string playerId = root[PLAYER_ID].asString();
175 sptr<AVControllerItem> avcontroller{nullptr};
176 auto res = GetControllerById(playerId, avcontroller);
177 if (res != AVSESSION_SUCCESS || avcontroller == nullptr) {
178 SLOGW("GetControllerById fail");
179 return;
180 }
181
182 int mediaCommand = root[MEDIA_COMMAND].asInt();
183 std::string command = root[COMMAND].asString();
184 SLOGI("ProcContolCommand mediaCommand: %{public}d", mediaCommand);
185 std::string extras = root[EXTRAS].asString();
186 switch (mediaCommand) {
187 case SYNC_MEDIASESSION_CALLBACK_ON_COMMAND:
188 SendCommandProc(command, avcontroller);
189 break;
190 case SYNC_MEDIASESSION_CALLBACK_ON_MEDIABUTTON_EVENT:
191 MediaButtonEventProc(command, avcontroller);
192 break;
193 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
194 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
195 case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
196 CommandWithExtrasProc(mediaCommand, command, extras, avcontroller);
197 break;
198 default:
199 PlaybackCommandDataProc(mediaCommand, command, avcontroller);
200 break;
201 }
202 }
203
GetControllerById(const std::string & sessionId,sptr<AVControllerItem> & controller)204 int32_t MigrateAVSessionServer::GetControllerById(const std::string &sessionId, sptr<AVControllerItem> &controller)
205 {
206 if (sessionId.empty()) {
207 SLOGW("empty sessionId");
208 return AVSESSION_ERROR;
209 }
210
211 std::lock_guard lockGuard(migrateControllerLock_);
212 for (auto it = playerIdToControllerMap_.begin(); it != playerIdToControllerMap_.end(); it++) {
213 std::string foundId = it->first;
214 if (it->first == sessionId) {
215 controller = it->second;
216 return AVSESSION_SUCCESS;
217 }
218 }
219 SLOGW("controller not found");
220 return AVSESSION_ERROR;
221 }
222
Init(AVSessionService * ptr)223 void MigrateAVSessionServer::Init(AVSessionService *ptr)
224 {
225 servicePtr_ = ptr;
226 }
227
OnSessionCreate(const AVSessionDescriptor & descriptor)228 void MigrateAVSessionServer::OnSessionCreate(const AVSessionDescriptor &descriptor)
229 {
230 SLOGI("OnSessionCreate");
231 std::string sessionId = descriptor.sessionId_;
232 if (sessionId.empty()) {
233 SLOGW("no valid avsession");
234 return;
235 }
236 CreateController(sessionId);
237 SendRemoteControllerList(deviceId_);
238 }
239
OnSessionRelease(const AVSessionDescriptor & descriptor)240 void MigrateAVSessionServer::OnSessionRelease(const AVSessionDescriptor &descriptor)
241 {
242 std::string sessionId = descriptor.sessionId_;
243 if (sessionId.empty()) {
244 SLOGW("no valid avsession");
245 return;
246 }
247 SLOGI("OnSessionRelease : %{public}s", sessionId.c_str());
248 ClearCacheBySessionId(sessionId);
249 SendRemoteControllerList(deviceId_);
250 }
251
OnTopSessionChange(const AVSessionDescriptor & descriptor)252 void MigrateAVSessionServer::OnTopSessionChange(const AVSessionDescriptor &descriptor)
253 {
254 SLOGI("OnTopSessionChange sessionId_: %{public}s", descriptor.sessionId_.c_str());
255 std::lock_guard lockGuard(topSessionLock_);
256 topSessionId_ = descriptor.sessionId_;
257 }
258
SortControllers(std::list<sptr<AVControllerItem>> controllers)259 void MigrateAVSessionServer::SortControllers(std::list<sptr<AVControllerItem>> controllers)
260 {
261 SLOGI("SortControllers");
262 std::lock_guard topSessionLockGuard(topSessionLock_);
263 if (topSessionId_.empty()) {
264 SLOGE("SortControllers topSessionId is null");
265 return;
266 }
267 std::lock_guard lockGuard(migrateControllerLock_);
268 for (auto iter = controllers.begin(); iter != controllers.end(); iter++) {
269 if ((*iter)->GetSessionId() == topSessionId_) {
270 controllers.splice(controllers.begin(), controllers, iter);
271 break;
272 }
273 }
274 }
275
SendRemoteControllerList(const std::string & deviceId)276 void MigrateAVSessionServer::SendRemoteControllerList(const std::string &deviceId)
277 {
278 SLOGI("SendRemoteControllerList");
279 SortControllers(sortControllerList_);
280 sptr<AVControllerItem> avcontroller{nullptr};
281 std::lock_guard lockGuard(topSessionLock_);
282 auto res = GetControllerById(topSessionId_, avcontroller);
283 if (res != AVSESSION_SUCCESS) {
284 SLOGE("SendRemoteControllerList no top session");
285 return;
286 }
287 if (avcontroller == nullptr) {
288 SLOGE("SendRemoteControllerList avcontroller is null");
289 return;
290 }
291 std::string msg = ConvertControllersToStr(avcontroller);
292
293 if (!deviceId.empty()) {
294 SendByte(deviceId, msg);
295 } else {
296 SendByteToAll(msg);
297 }
298 }
299
ConvertControllersToStr(sptr<AVControllerItem> controller)300 std::string MigrateAVSessionServer::ConvertControllersToStr(sptr<AVControllerItem> controller)
301 {
302 SLOGI("ConvertControllersToStr");
303 Json::Value jsonArray;
304 jsonArray.resize(1);
305 std::string playerId = controller->GetSessionId();
306 Json::Value jsonObject = ConvertControllerToJson(controller);
307 jsonObject[PLAYER_ID] = playerId;
308 jsonArray[0] = jsonObject;
309 Json::Value jsonData;
310 jsonData[MEDIA_CONTROLLER_LIST] = jsonArray;
311
312 Json::FastWriter writer;
313 std::string jsonStr = writer.write(jsonData);
314 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST};
315 std::string msg = std::string(header) + jsonStr;
316 return msg;
317 }
318
ConvertControllerToJson(sptr<AVControllerItem> avcontroller)319 Json::Value MigrateAVSessionServer::ConvertControllerToJson(sptr<AVControllerItem> avcontroller)
320 {
321 SLOGI("ConvertControllerToJson");
322 Json::Value metadata;
323 AVMetaData data;
324 if (AVSESSION_SUCCESS == avcontroller->GetAVMetaData(data)) {
325 metadata = ConvertMetadataToJson(data);
326 }
327
328 AVPlaybackState state;
329 if (AVSESSION_SUCCESS == avcontroller->GetAVPlaybackState(state)) {
330 metadata[PLAYBACK_STATE] = RebuildPlayState(state);
331 }
332
333 metadata[SESSION_INFO] =
334 "OAAAAEJOREwBAAAAEwAAAEMAbwBuAHQAcgBvAGwAbABlAHIAVwBoAGkAdABlAEwAaQBzAHQAAAAU\nAAAAAQAAAA==\n";
335 metadata[VOLUME_INFO] = VOLUMN_INFO;
336 metadata[PACKAGE_NAME] = GetBundleName(avcontroller->GetSessionId());
337 return metadata;
338 }
339
GetBundleName(std::string sessionId)340 std::string MigrateAVSessionServer::GetBundleName(std::string sessionId)
341 {
342 std::vector<AVSessionDescriptor> descriptors;
343
344 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
345 if (res != AVSESSION_SUCCESS) {
346 SLOGW("GetAllSessionDescriptors fail");
347 return "";
348 }
349 for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
350 if (iter->sessionId_ == sessionId) {
351 std::string bundleName = iter->elementName_.GetBundleName();
352 std::string abilityName = iter->elementName_.GetAbilityName();
353 SLOGI("bundleName: %{public}s abilityName: %{public}s", bundleName.c_str(), abilityName.c_str());
354 return bundleName;
355 }
356 }
357 SLOGW("GetBundleName fail");
358 return "";
359 }
360
ConvertStateFromSingleToDouble(int32_t state)361 int32_t MigrateAVSessionServer::ConvertStateFromSingleToDouble(int32_t state)
362 {
363 switch (state) {
364 case AVPlaybackState::PLAYBACK_STATE_PLAY:
365 return MEDIA_SESSION_PLAYBACK_STATE_PLAY;
366 case AVPlaybackState::PLAYBACK_STATE_PAUSE:
367 return MEDIA_SESSION_PLAYBACK_STATE_PAUSE;
368 case AVPlaybackState::PLAYBACK_STATE_STOP:
369 return MEDIA_SESSION_PLAYBACK_STATE_STOP;
370 case AVPlaybackState::PLAYBACK_STATE_ERROR:
371 return MEDIA_SESSION_PLAYBACK_STATE_ERROR;
372 default:
373 SLOGW("unknowState: %{public}d", state);
374 break;
375 }
376 return state;
377 }
378
RebuildPlayState(const AVPlaybackState & playbackState)379 std::string MigrateAVSessionServer::RebuildPlayState(const AVPlaybackState &playbackState)
380 {
381 Parcel parcel;
382 parcel.WriteInt32(ConvertStateFromSingleToDouble(playbackState.GetState()))
383 && parcel.WriteInt64(playbackState.GetPosition().elapsedTime_)
384 && parcel.WriteFloat(playbackState.GetSpeed())
385 && parcel.WriteInt64(playbackState.GetPosition().updateTime_)
386 && parcel.WriteInt64(playbackState.GetBufferedTime())
387 && parcel.WriteInt64(-1)
388 && parcel.WriteInt32(-1)
389 && parcel.WriteInt64(playbackState.GetActiveItemId())
390 && parcel.WriteInt32(1)
391 && parcel.WriteCString("")
392 && parcel.WriteInt32(-1);
393
394 uintptr_t pointer = parcel.GetData();
395 std::string contentChar = reinterpret_cast<char *>(pointer);
396 std::string str = Base64Utils::Base64Encode(contentChar.c_str());
397 return str;
398 }
399
ConvertMetadataToJson(const AVMetaData & metadata)400 Json::Value MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata)
401 {
402 Json::Value result;
403 if (metadata.IsValid()) {
404 result[METADATA_TITLE] = metadata.GetTitle();
405 result[METADATA_ARTIST] = metadata.GetArtist();
406 if (metadata.GetMediaImage()) {
407 std::string str(metadata.GetMediaImage()->GetInnerImgBuffer().begin(),
408 metadata.GetMediaImage()->GetInnerImgBuffer().end());
409 result[METADATA_ART] = str;
410 } else {
411 SLOGW("GetMediaImage is null");
412 }
413 } else {
414 result[METADATA_TITLE] = "";
415 result[METADATA_ARTIST] = "";
416 result[METADATA_ART] = "";
417 }
418 return result;
419 }
420
ConvertMetadataInfoToStr(const std::string playerId,int32_t controlCommand,const AVMetaData & metadata)421 std::string MigrateAVSessionServer::ConvertMetadataInfoToStr(
422 const std::string playerId, int32_t controlCommand, const AVMetaData &metadata)
423 {
424 SLOGI("ConvertMetadataInfoToStr");
425 Json::Value metaDataJson = ConvertMetadataToJson(metadata);
426 metaDataJson[PLAYER_ID] = playerId;
427 metaDataJson[MEDIA_INFO] = controlCommand;
428 Json::FastWriter writer;
429 std::string msg = writer.write(metaDataJson);
430 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
431 return std::string(header) + msg;
432 }
433
SendSpecialKeepaliveData()434 void MigrateAVSessionServer::SendSpecialKeepaliveData()
435 {
436 std::thread([this]() {
437 std::this_thread::sleep_for(std::chrono::milliseconds(HEART_BEAT_TIME));
438 if (this->isSoftbusConnecting_) {
439 char header[] = {MSG_HEAD_MODE, SYNC_HEARTBEAT};
440 std::string data = std::string(header);
441 SendByteToAll(data);
442 SendSpecialKeepaliveData();
443 SLOGI("send special mediamession data to proxy connection");
444 } else {
445 SLOGI("send special mediamession data to proxy exit");
446 }
447 }).detach();
448 }
449
SendCommandProc(const std::string & command,sptr<AVControllerItem> controller)450 void MigrateAVSessionServer::SendCommandProc(const std::string &command, sptr<AVControllerItem> controller)
451 {
452 if (command == EVENT_COMMAND_UNLOCK_LYRIC || command == EVENT_COMMAND_SHOW_LYRIC ||
453 command == EVENT_COMMAND_HIDE_LYRIC) {
454 } else {
455 SLOGW("command is not support: %{public}s", command.c_str());
456 }
457 }
458
MediaButtonEventProc(const std::string & command,sptr<AVControllerItem> controller)459 void MigrateAVSessionServer::MediaButtonEventProc(const std::string &command, sptr<AVControllerItem> controller)
460 {
461 std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
462 keyEvent->SetKeyCode(atoi(command.c_str()));
463 controller->SendAVKeyEvent(*keyEvent.get());
464 }
465
CommandWithExtrasProc(int mediaCommand,const std::string & extrasCommand,const std::string & extras,sptr<AVControllerItem> controller)466 void MigrateAVSessionServer::CommandWithExtrasProc(int mediaCommand, const std::string &extrasCommand,
467 const std::string &extras, sptr<AVControllerItem> controller)
468 {
469 SLOGI("CommandWithExtrasProc mediaCommand is: %{public}d", mediaCommand);
470 switch (mediaCommand) {
471 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
472 break;
473 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
474 break;
475 case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
476 break;
477 default:
478 SLOGW("mediaCommand is not support: %{public}d", mediaCommand);
479 break;
480 }
481 }
482
PlaybackCommandDataProc(int mediaCommand,const std::string & command,sptr<AVControllerItem> controller)483 void MigrateAVSessionServer::PlaybackCommandDataProc(int mediaCommand, const std::string &command,
484 sptr<AVControllerItem> controller)
485 {
486 SLOGI("PlaybackComandDataProc Command is: %{public}d", mediaCommand);
487 AVControlCommand cmd;
488 switch (mediaCommand) {
489 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY:
490 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY);
491 controller->SendControlCommand(cmd);
492 break;
493 case SYNC_MEDIASESSION_CALLBACK_ON_PAUSE:
494 cmd.SetCommand(AVControlCommand::SESSION_CMD_PAUSE);
495 controller->SendControlCommand(cmd);
496 break;
497 case SYNC_MEDIASESSION_CALLBACK_ON_STOP:
498 cmd.SetCommand(AVControlCommand::SESSION_CMD_STOP);
499 controller->SendControlCommand(cmd);
500 break;
501 case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_PREVIOUS:
502 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
503 controller->SendControlCommand(cmd);
504 break;
505 case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_NEXT:
506 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
507 controller->SendControlCommand(cmd);
508 break;
509 case SYNC_MEDIASESSION_CALLBACK_ON_SET_RATING:
510 break;
511 case SYNC_CONTROLLER_CALLBACK_ON_AUDIOINFO_CHANGED:
512 break;
513 default:
514 SLOGI("mediaCommand is not support: %{public}s", command.c_str());
515 break;
516 }
517 }
518
OnMetaDataChange(const std::string & playerId,const AVMetaData & data)519 void MigrateAVSessionServer::OnMetaDataChange(const std::string & playerId, const AVMetaData &data)
520 {
521 std::string metaDataStr = ConvertMetadataInfoToStr(playerId, SYNC_CONTROLLER_CALLBACK_ON_METADATA_CHANNGED, data);
522 SLOGI("MigrateAVSessionServer OnMetaDataChange: %{public}s", metaDataStr.c_str());
523
524 SendByte(deviceId_, metaDataStr);
525 }
526
OnPlaybackStateChanged(const std::string & playerId,const AVPlaybackState & state)527 void MigrateAVSessionServer::OnPlaybackStateChanged(const std::string &playerId, const AVPlaybackState &state)
528 {
529 Json::Value value;
530 value[PLAYER_ID] = playerId;
531 value[MEDIA_INFO] = SYNC_CONTROLLER_CALLBACK_ON_PLAYBACKSTATE_CHANGED;
532 value[CALLBACK_INFO] = RebuildPlayState(state);
533 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER};
534 Json::FastWriter writer;
535 std::string msg = writer.write(value);
536 std::string result = std::string(header) + msg;
537 SendByte(deviceId_, result);
538 }
539
OnSessionDestroy()540 void AVControllerObserver::OnSessionDestroy()
541 {
542 SLOGI("OnSessionDestroy");
543 }
544
OnPlaybackStateChange(const AVPlaybackState & state)545 void AVControllerObserver::OnPlaybackStateChange(const AVPlaybackState &state)
546 {
547 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
548 if (server != nullptr) {
549 server->OnPlaybackStateChanged(playerId_, state);
550 }
551 }
552
OnMetaDataChange(const AVMetaData & data)553 void AVControllerObserver::OnMetaDataChange(const AVMetaData &data)
554 {
555 SLOGI("OnMetaDataChange");
556 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
557 if (server != nullptr) {
558 server->OnMetaDataChange(playerId_, data);
559 }
560 }
561
Init(std::weak_ptr<MigrateAVSessionServer> migrateServer)562 void AVControllerObserver::Init(std::weak_ptr<MigrateAVSessionServer> migrateServer)
563 {
564 migrateServer_ = migrateServer;
565 }
566 } // namespace OHOS::AVSession