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