• 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 "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