• 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 #ifndef OHOS_AVSESSION_SERVER_H
17 #define OHOS_AVSESSION_SERVER_H
18 
19 #include <atomic>
20 #include <map>
21 #include <mutex>
22 
23 #include "cJSON.h"
24 #include "audio_adapter.h"
25 #include "app_manager_adapter.h"
26 #include "avcontroller_item.h"
27 #include "avsession_info.h"
28 #include "softbus/softbus_session_server.h"
29 
30 #define MIGRATE_MODE_CROSS 0
31 #define MIGRATE_MODE_NEXT 1
32 
33 namespace OHOS::AVSession {
34 class AVSessionService;
35 class AVControllerObserver;
36 constexpr size_t BUFFER_MAX_SIZE = 1024 * 1024;
37 constexpr size_t DEFAULT_QUALITY = 100;
38 constexpr size_t UNMASK_CHAR_NUM = 3;
39 constexpr int64_t DELAY_TIME = 2000;
40 constexpr int64_t DELAY_METADATA_TIME = 100;
41 constexpr int64_t DELAY_PLAY_COM_TIME = 500;
42 constexpr int32_t MAX_SESSION_NUMS = 2;
43 constexpr int32_t MAX_HISTORY_SESSION_NUMS = 6;
44 const std::string ANCO_AUDIO_BUNDLE_NAME = "anco_audio";
45 
46 class MigrateAVSessionServer : public SessionListener, public SoftbusSessionServer,
47     public HistoricalRecordListener,
48     public std::enable_shared_from_this<MigrateAVSessionServer> {
49 public:
50     explicit MigrateAVSessionServer(int32_t migrateMode = 0, std::string deviceId = "");
51     ~MigrateAVSessionServer();
52 
53     void OnConnectProxy(const std::string &deviceId) override;
54     void OnDisconnectProxy(const std::string &deviceId) override;
55     int32_t GetCharacteristic() override;
56     void OnBytesReceived(const std::string &deviceId, const std::string &data) override;
57 
58     void Init(AVSessionService *ptr);
59 
60     void OnSessionCreate(const AVSessionDescriptor &descriptor) override;
61     void OnSessionRelease(const AVSessionDescriptor &descriptor) override;
62     void OnTopSessionChange(const AVSessionDescriptor &descriptor) override;
OnAudioSessionChecked(const int32_t uid)63     void OnAudioSessionChecked(const int32_t uid) override {}
64 
65     void OnHistoricalRecordChange() override;
66 
67     void OnMetaDataChange(const std::string &playerId, const AVMetaData &data);
68     void OnPlaybackStateChanged(const std::string &playerId, const AVPlaybackState &state);
69     void StopObserveControllerChanged(const std::string &deviceId);
70     void SendRemoteControllerList(const std::string &deviceId);
71     void SendRemoteControllerInfo(const std::string &deviceId, std::string msg);
72     void SendRemoteHistorySessionList(const std::string &deviceId);
73     void ClearRemoteControllerList(const std::string &deviceId);
74     void ClearRemoteHistorySessionList(const std::string &deviceId);
75 
76     void ResetSupportCrossMediaPlay(const std::string &extraInfo);
77 
78     void LocalFrontSessionArrive(std::string &sessionId);
79     void LocalFrontSessionChange(std::string &sessionId);
80     void LocalFrontSessionLeave(std::string &sessionId);
81     void HandleFocusPlaybackStateChange(const std::string &sessionId, const AVPlaybackState &state);
82     void HandleFocusMetaDataChange(const std::string &sessionId, const AVMetaData &data);
83     void HandleFocusValidCommandChange(const std::string &sessionId, const std::vector<int32_t> &cmds);
84     void DoMetaDataSyncToRemote(const AVMetaData& data);
85     void DoMediaImageSyncToRemote(std::shared_ptr<AVSessionPixelMap> innerPixelMap);
86     void DoPlaybackStateSyncToRemote(const AVPlaybackState& state);
87     void DoValidCommandsSyncToRemote(const std::vector<int32_t>& commands);
88     void DoBundleInfoSyncToRemote(sptr<AVControllerItem> controller);
89     void DoPostTasksClear();
90     bool MigratePostTask(const AppExecFwk::EventHandler::Callback &callback, const std::string &name,
91         int64_t delayTime = 0);
92     void RefreshDeviceId(std::string deviceId);
93 
94     static cJSON* ConvertAudioDeviceDescriptorToJson(const AudioDeviceDescriptorWithSptr& device);
95     static cJSON* ConvertAudioDeviceDescriptorsToJson(const AudioDeviceDescriptors& devices);
96 
97 private:
98     std::map<std::string, sptr<AVControllerItem>> playerIdToControllerMap_;
99     std::map<std::string, std::shared_ptr<AVControllerObserver>> playerIdToControllerCallbackMap_;
100     std::list<sptr<AVControllerItem>> sortControllerList_;
101 
102     void ObserveControllerChanged(const std::string &deviceId);
103     void CreateController(const std::string &sessionId);
104     void UpdateCache(const std::string &sessionId, sptr<AVControllerItem> avcontroller,
105         std::shared_ptr<AVControllerObserver> callback, bool isAdd);
106     void ClearCacheBySessionId(const std::string &sessionId);
107     int32_t ConvertStateFromSingleToDouble(int32_t state);
108 
109     int32_t GetControllerById(const std::string &sessionId, sptr<AVControllerItem> &controller);
110     int32_t GetAllControllers(std::vector<sptr<AVControllerItem>> &controller);
111 
112     std::string ConvertControllersToStr(std::vector<sptr<AVControllerItem>> avcontrollers);
113 
114     cJSON* ConvertControllerToJson(sptr<AVControllerItem> avcontroller);
115 
116     cJSON* ConvertMetadataToJson(const AVMetaData &metadata);
117 
118     cJSON* ConvertMetadataToJson(const AVMetaData &metadata, bool includeImage);
119 
120     std::string ConvertMetadataInfoToStr(const std::string playerId, int32_t controlCommand,
121         const AVMetaData &metadata);
122 
123     std::string RebuildPlayState(const AVPlaybackState &playbackState);
124     void SortControllers(std::list<sptr<AVControllerItem>> avcontrollerList);
125 
126     void ProcControlCommand(const std::string &data);
127     void ProcControlCommandFromNext(cJSON* commandJsonValue);
128     void VolumeControlCommand(cJSON* commandJsonValue);
129     void SwitchAudioDeviceCommand(cJSON* jsonObject);
130     void ProcessColdStartFromNext(cJSON* commandJsonValue);
131     void ProcessMediaControlNeedStateFromNext(cJSON* commandJsonValue);
132     void SendCommandProc(const std::string &command, sptr<AVControllerItem> controller);
133     void MediaButtonEventProc(const std::string &command, sptr<AVControllerItem> controller);
134     void CommandWithExtrasProc(int mediaCommand, const std::string &extrasCommand, const std::string &extras,
135         sptr<AVControllerItem> controller);
136     void PlaybackCommandDataProc(int mediaCommand, const std::string &extrasCommand, sptr<AVControllerItem> controller);
137     void SendSpecialKeepaliveData();
138     std::string GetBundleName(std::string sessionId);
139     bool CompressToJPEG(const AVMetaData &metadata, std::vector<uint8_t> &outputData);
140     void DelaySendMetaData();
141     bool GetVehicleRelatingState(std::string playerId);
142     void UpdateFrontSessionInfoToRemote(sptr<AVControllerItem> controller);
143     void UpdateSessionInfoToRemote(sptr<AVControllerItem> controller);
144     void UpdateEmptyInfoToRemote();
145     void ProcFromNext(const std::string &deviceId, const std::string &data);
146 
147     void RegisterAudioCallbackAndTrigger();
148     void TriggerAudioCallback();
149     void UnregisterAudioCallback();
150 
151     std::function<void(int32_t)> GetVolumeKeyEventCallbackFunc();
152     AudioDeviceDescriptorsCallbackFunc GetAvailableDeviceChangeCallbackFunc();
153     AudioDeviceDescriptorsCallbackFunc GetPreferredDeviceChangeCallbackFunc();
154 
155     bool ConvertSessionDescriptorsToCJSON(cJSON* jsonArray, int32_t& descriptorNums);
156     bool ConvertReleaseSessionToCJSON(cJSON* jsonArray, std::vector<AVSessionDescriptor>& sessionDescriptors,
157         int32_t& descriptorNums);
158     bool ConvertHisSessionDescriptorsToCJSON(cJSON* jsonArray, std::vector<AVSessionDescriptor>& hisSessionDescriptors,
159         int32_t& descriptorNums);
160     std::string ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,
161         std::vector<AVSessionDescriptor> hisSessionDescriptors);
162     void StartConfigHistorySession(const std::string &data);
163     std::string GenerateClearHistorySessionMsg();
164 
165     AVSessionService *servicePtr_ = nullptr;
166     bool isSoftbusConnecting_ = false;
167     std::string deviceId_;
168     std::string topSessionId_;
169     std::string lastSessionId_;
170     std::string releaseSessionId_;
171     std::string releaseSessionBundleName_;
172     bool supportCrossMediaPlay_ = false;
173     std::recursive_mutex migrateControllerLock_;
174     std::recursive_mutex topSessionLock_;
175     std::recursive_mutex historySessionLock_;
176     std::recursive_mutex migrateDeviceChangeLock_;
177     int32_t migrateMode_ = MIGRATE_MODE_CROSS;
178     std::string curAssetId_;
179 
180     std::function<void(int32_t)> volumeKeyEventCallbackFunc_ = GetVolumeKeyEventCallbackFunc();
181     AudioDeviceDescriptorsCallbackFunc availableDeviceChangeCallbackFunc_ = GetAvailableDeviceChangeCallbackFunc();
182     AudioDeviceDescriptorsCallbackFunc preferredDeviceChangeCallbackFunc_ = GetPreferredDeviceChangeCallbackFunc();
183     AVMetaData metaDataCache_;
184     AVPlaybackState playbackStateCache_;
185     std::recursive_mutex cacheJsonLock_;
186 
187     std::string GenerateClearAVSessionMsg();
188     std::atomic<bool> isNeedByRemote = false;
189 };
190 
191 class AVControllerObserver : public AVControllerCallback {
192 public:
AVControllerObserver(const std::string & playerId)193     explicit AVControllerObserver(const std::string &playerId) : playerId_(playerId){};
AVControllerObserver()194     AVControllerObserver() {};
~AVControllerObserver()195     ~AVControllerObserver() {};
196 
197     void Init(std::weak_ptr<MigrateAVSessionServer> migrateServer, int32_t migrateMode = MIGRATE_MODE_CROSS);
198     void Release();
199 
200     void OnSessionDestroy() override;
201     void OnPlaybackStateChange(const AVPlaybackState &state) override;
202     void OnMetaDataChange(const AVMetaData &data) override;
OnAVCallMetaDataChange(const AVCallMetaData & avCallMetaData)203     void OnAVCallMetaDataChange(const AVCallMetaData &avCallMetaData) override {}
OnAVCallStateChange(const AVCallState & avCallState)204     void OnAVCallStateChange(const AVCallState &avCallState) override {}
OnActiveStateChange(bool isActive)205     void OnActiveStateChange(bool isActive) override {}
206     void OnValidCommandChange(const std::vector<int32_t> &cmds) override;
OnOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)207     void OnOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo &outputDeviceInfo) override {}
OnSessionEventChange(const std::string & event,const AAFwk::WantParams & args)208     void OnSessionEventChange(const std::string &event, const AAFwk::WantParams &args) override {}
OnQueueItemsChange(const std::vector<AVQueueItem> & items)209     void OnQueueItemsChange(const std::vector<AVQueueItem> &items) override {}
OnQueueTitleChange(const std::string & title)210     void OnQueueTitleChange(const std::string &title) override {}
OnExtrasChange(const AAFwk::WantParams & extras)211     void OnExtrasChange(const AAFwk::WantParams &extras) override {}
OnCustomData(const AAFwk::WantParams & data)212     void OnCustomData(const AAFwk::WantParams& data) override {}
213 
214 private:
215     std::weak_ptr<MigrateAVSessionServer> migrateServer_;
216     std::string playerId_ = "";
217     int32_t migrateMode_ = MIGRATE_MODE_CROSS;
218 };
219 } // namespace OHOS::AVSession
220 #endif // OHOS_AVSESSION_SERVER_H