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