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 #ifndef OHOS_AVSESSION_SERVER_H
17 #define OHOS_AVSESSION_SERVER_H
18 
19 #include <map>
20 #include <mutex>
21 
22 #include "json/json.h"
23 #include "app_manager_adapter.h"
24 #include "avcontroller_item.h"
25 #include "avsession_info.h"
26 #include "softbus/softbus_session_server.h"
27 
28 namespace OHOS::AVSession {
29 class AVSessionService;
30 class AVControllerObserver;
31 constexpr size_t BUFFER_MAX_SIZE = 1024 * 1024;
32 constexpr size_t DEFAULT_QUALITY = 100;
33 constexpr int64_t DELAY_TIME = 2000;
34 
35 class MigrateAVSessionServer : public SessionListener, public SoftbusSessionServer,
36     public std::enable_shared_from_this<MigrateAVSessionServer> {
37 public:
MigrateAVSessionServer()38     MigrateAVSessionServer() {}
~MigrateAVSessionServer()39     ~MigrateAVSessionServer() {}
40 
41     void OnConnectProxy(const std::string &deviceId) override;
42     void OnDisconnectProxy(const std::string &deviceId) override;
43     int32_t GetCharacteristic() override;
44     void OnBytesReceived(const std::string &deviceId, const std::string &data) override;
45 
46     void Init(AVSessionService *ptr);
47 
48     void OnSessionCreate(const AVSessionDescriptor &descriptor) override;
49     void OnSessionRelease(const AVSessionDescriptor &descriptor) override;
50     void OnTopSessionChange(const AVSessionDescriptor &descriptor) override;
OnAudioSessionChecked(const int32_t uid)51     void OnAudioSessionChecked(const int32_t uid) override {}
52 
53     void OnMetaDataChange(const std::string &playerId, const AVMetaData &data);
54     void OnPlaybackStateChanged(const std::string &playerId, const AVPlaybackState &state);
55     void StopObserveControllerChanged(const std::string &deviceId);
56 
57 private:
58     std::map<std::string, sptr<AVControllerItem>> playerIdToControllerMap_;
59     std::map<std::string, std::shared_ptr<AVControllerObserver>> playerIdToControllerCallbackMap_;
60     std::list<sptr<AVControllerItem>> sortControllerList_;
61 
62     void ObserveControllerChanged(const std::string &deviceId);
63     void CreateController(const std::string &sessionId);
64     void UpdateCache(const std::string &sessionId, sptr<AVControllerItem> avcontroller,
65         std::shared_ptr<AVControllerObserver> callback, bool isAdd);
66     void ClearCacheBySessionId(const std::string &sessionId);
67     void SendRemoteControllerList(const std::string &deviceId);
68     int32_t ConvertStateFromSingleToDouble(int32_t state);
69 
70     int32_t GetControllerById(const std::string &sessionId, sptr<AVControllerItem> &controller);
71 
72     std::string ConvertControllersToStr(sptr<AVControllerItem> avcontroller);
73 
74     Json::Value ConvertControllerToJson(sptr<AVControllerItem> avcontroller);
75 
76     Json::Value ConvertMetadataToJson(const AVMetaData &metadata);
77 
78     std::string ConvertMetadataInfoToStr(const std::string playerId, int32_t controlCommand,
79         const AVMetaData &metadata);
80 
81     std::string RebuildPlayState(const AVPlaybackState &playbackState);
82     void SortControllers(std::list<sptr<AVControllerItem>> avcontrollerList);
83 
84     void ProcControlCommand(const std::string &data);
85     void SendCommandProc(const std::string &command, sptr<AVControllerItem> controller);
86     void MediaButtonEventProc(const std::string &command, sptr<AVControllerItem> controller);
87     void CommandWithExtrasProc(int mediaCommand, const std::string &extrasCommand, const std::string &extras,
88         sptr<AVControllerItem> controller);
89     void PlaybackCommandDataProc(int mediaCommand, const std::string &extrasCommand, sptr<AVControllerItem> controller);
90     void SendSpecialKeepaliveData();
91     std::string GetBundleName(std::string sessionId);
92     bool CompressToJPEG(const AVMetaData &metadata, std::vector<uint8_t> &outputData);
93     void DelaySendMetaData();
94 
95     AVSessionService *servicePtr_ = nullptr;
96     bool isSoftbusConnecting_ = false;
97     std::string deviceId_;
98     std::string topSessionId_;
99     std::recursive_mutex migrateControllerLock_;
100     std::recursive_mutex topSessionLock_;
101 };
102 
103 class AVControllerObserver : public AVControllerCallback {
104 public:
AVControllerObserver(const std::string & playerId)105     explicit AVControllerObserver(const std::string &playerId) : playerId_(playerId){};
AVControllerObserver()106     AVControllerObserver() {};
~AVControllerObserver()107     ~AVControllerObserver() {};
108 
109     void Init(std::weak_ptr<MigrateAVSessionServer> migrateServer);
110 
111     void OnSessionDestroy() override;
112     void OnPlaybackStateChange(const AVPlaybackState &state) override;
113     void OnMetaDataChange(const AVMetaData &data) override;
OnAVCallMetaDataChange(const AVCallMetaData & avCallMetaData)114     void OnAVCallMetaDataChange(const AVCallMetaData &avCallMetaData) override {}
OnAVCallStateChange(const AVCallState & avCallState)115     void OnAVCallStateChange(const AVCallState &avCallState) override {}
OnActiveStateChange(bool isActive)116     void OnActiveStateChange(bool isActive) override {}
OnValidCommandChange(const std::vector<int32_t> & cmds)117     void OnValidCommandChange(const std::vector<int32_t> &cmds) override {}
OnOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)118     void OnOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo &outputDeviceInfo) override {}
OnSessionEventChange(const std::string & event,const AAFwk::WantParams & args)119     void OnSessionEventChange(const std::string &event, const AAFwk::WantParams &args) override {}
OnQueueItemsChange(const std::vector<AVQueueItem> & items)120     void OnQueueItemsChange(const std::vector<AVQueueItem> &items) override {}
OnQueueTitleChange(const std::string & title)121     void OnQueueTitleChange(const std::string &title) override {}
OnExtrasChange(const AAFwk::WantParams & extras)122     void OnExtrasChange(const AAFwk::WantParams &extras) override {}
123 
124 private:
125     std::weak_ptr<MigrateAVSessionServer> migrateServer_;
126     std::string playerId_ = "";
127 };
128 } // namespace OHOS::AVSession
129 #endif // OHOS_AVSESSION_SERVER_H