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