1 /* 2 * Copyright (c) 2022-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_ITEM_H 17 #define OHOS_AVSESSION_ITEM_H 18 19 #include <string> 20 #include <map> 21 22 #include "avsession_stub.h" 23 #include "avsession_callback_proxy.h" 24 #include "avcontrol_command.h" 25 #include "audio_info.h" 26 #include "avcast_control_command.h" 27 28 #ifdef CASTPLUS_CAST_ENGINE_ENABLE 29 #include "i_avcast_controller_proxy.h" 30 #include "avcast_controller_item.h" 31 #endif 32 33 namespace OHOS::AVSession { 34 class AVControllerItem; 35 class RemoteSessionSink; 36 class RemoteSessionSource; 37 class AVSessionItem : public AVSessionStub { 38 #ifdef CASTPLUS_CAST_ENGINE_ENABLE 39 class CssListener : public IAVCastSessionStateListener { 40 public: CssListener(AVSessionItem * ptr)41 explicit CssListener(AVSessionItem *ptr) 42 { 43 ptr_ = ptr; 44 } 45 OnCastStateChange(int32_t castState,DeviceInfo deviceInfo)46 void OnCastStateChange(int32_t castState, DeviceInfo deviceInfo) 47 { 48 ptr_->OnCastStateChange(castState, deviceInfo); 49 } 50 OnCastEventRecv(int32_t errorCode,std::string & errorMsg)51 void OnCastEventRecv(int32_t errorCode, std::string& errorMsg) 52 { 53 ptr_->OnCastEventRecv(errorCode, errorMsg); 54 } 55 56 AVSessionItem *ptr_; 57 }; 58 #endif 59 public: 60 explicit AVSessionItem(const AVSessionDescriptor& descriptor); 61 62 ~AVSessionItem() override; 63 64 #ifdef CASTPLUS_CAST_ENGINE_ENABLE 65 bool IsCastSinkSession(int32_t castState); 66 67 void OnCastStateChange(int32_t castState, DeviceInfo deviceInfo); 68 69 void OnCastEventRecv(int32_t errorCode, std::string& errorMsg); 70 #endif 71 72 std::string GetSessionId() override; 73 74 std::string GetSessionType() override; 75 76 int32_t SetAVCallMetaData(const AVCallMetaData& avCallMetaData) override; 77 78 int32_t SetAVCallState(const AVCallState& avCallState) override; 79 80 int32_t GetAVMetaData(AVMetaData& meta) override; 81 82 int32_t SetAVMetaData(const AVMetaData& meta) override; 83 84 int32_t GetAVQueueItems(std::vector<AVQueueItem>& items) override; 85 86 int32_t SetAVQueueItems(const std::vector<AVQueueItem>& items) override; 87 88 int32_t GetAVQueueTitle(std::string& title) override; 89 90 int32_t SetAVQueueTitle(const std::string& title) override; 91 92 int32_t GetAVPlaybackState(AVPlaybackState& state) override; 93 94 int32_t SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability) override; 95 96 int32_t GetExtras(AAFwk::WantParams& extras) override; 97 98 int32_t SetExtras(const AAFwk::WantParams& extras) override; 99 100 int32_t Activate() override; 101 102 int32_t Deactivate() override; 103 104 bool IsActive() override; 105 106 int32_t Destroy() override; 107 108 int32_t AddSupportCommand(int32_t cmd) override; 109 110 int32_t DeleteSupportCommand(int32_t cmd) override; 111 112 AVSessionDescriptor GetDescriptor(); 113 114 int32_t SetAVPlaybackState(const AVPlaybackState& state) override; 115 116 AVCallState GetAVCallState(); 117 118 AVCallMetaData GetAVCallMetaData(); 119 120 AVPlaybackState GetPlaybackState(); 121 122 AVMetaData GetMetaData(); 123 124 std::vector<AVQueueItem> GetQueueItems(); 125 126 std::string GetQueueTitle(); 127 128 AAFwk::WantParams GetExtras(); 129 130 std::vector<int32_t> GetSupportCommand(); 131 132 AbilityRuntime::WantAgent::WantAgent GetLaunchAbility(); 133 134 void HandleMediaKeyEvent(const MMI::KeyEvent& keyEvent); 135 136 void HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo); 137 138 void HandleSkipToQueueItem(const int32_t& itemId); 139 140 void ExecuteControllerCommand(const AVControlCommand& cmd); 141 142 void ExecueCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs); 143 144 int32_t AddController(pid_t pid, sptr<AVControllerItem>& controller); 145 146 void SetPid(pid_t pid); 147 148 void SetUid(pid_t uid); 149 150 pid_t GetPid() const; 151 152 pid_t GetUid() const; 153 154 std::string GetAbilityName() const; 155 156 std::string GetBundleName() const; 157 158 void SetTop(bool top); 159 160 std::shared_ptr<RemoteSessionSource> GetRemoteSource(); 161 162 void HandleControllerRelease(pid_t pid); 163 164 void SetServiceCallbackForRelease(const std::function<void(AVSessionItem&)>& callback); 165 166 void SetServiceCallbackForCallStart(const std::function<void(AVSessionItem&)>& callback); 167 168 void SetOutputDevice(const OutputDeviceInfo& info); 169 170 void GetOutputDevice(OutputDeviceInfo& info); 171 172 int32_t CastAudioToRemote(const std::string& sourceDevice, const std::string& sinkDevice, 173 const std::string& sinkCapability); 174 175 int32_t SourceCancelCastAudio(const std::string& sinkDevice); 176 177 int32_t CastAudioFromRemote(const std::string& sourceSessionId, const std::string& sourceDevice, 178 const std::string& sinkDevice, const std::string& sourceCapability); 179 180 int32_t SinkCancelCastAudio(); 181 182 int32_t SetSessionEvent(const std::string& event, const AAFwk::WantParams& args) override; 183 184 void SetServiceCallbackForAVQueueInfo(const std::function<void(AVSessionItem&)>& callback); 185 186 #ifdef CASTPLUS_CAST_ENGINE_ENABLE 187 int32_t AddSupportCastCommand(int32_t cmd); 188 189 int32_t DeleteSupportCastCommand(int32_t cmd); 190 191 int32_t ReleaseCast() override; 192 193 int32_t StartCast(const OutputDeviceInfo& outputDeviceInfo); 194 195 int32_t AddDevice(const int64_t castHandle, const OutputDeviceInfo& outputDeviceInfo); 196 197 int32_t StopCast(); 198 199 sptr<IRemoteObject> GetAVCastControllerInner() override; 200 201 void ReleaseAVCastControllerInner(); 202 203 void UpdateCastDeviceMap(DeviceInfo deviceInfo); 204 205 void SetCastHandle(int64_t castHandle); 206 207 void RegisterDeviceStateCallback(); 208 209 void UnRegisterDeviceStateCallback(); 210 211 void StopCastSession(); 212 #endif 213 214 protected: 215 int32_t RegisterCallbackInner(const sptr<IAVSessionCallback>& callback) override; 216 sptr<IRemoteObject> GetControllerInner() override; 217 218 private: 219 bool HasAvQueueInfo(); 220 void HandleOnAVCallAnswer(const AVControlCommand& cmd); 221 void HandleOnAVCallHangUp(const AVControlCommand& cmd); 222 void HandleOnAVCallToggleCallMute(const AVControlCommand& cmd); 223 void HandleOnPlay(const AVControlCommand& cmd); 224 void HandleOnPause(const AVControlCommand& cmd); 225 void HandleOnStop(const AVControlCommand& cmd); 226 void HandleOnPlayNext(const AVControlCommand& cmd); 227 void HandleOnPlayPrevious(const AVControlCommand& cmd); 228 void HandleOnFastForward(const AVControlCommand& cmd); 229 void HandleOnRewind(const AVControlCommand& cmd); 230 void HandleOnSeek(const AVControlCommand& cmd); 231 void HandleOnSetSpeed(const AVControlCommand& cmd); 232 void HandleOnSetLoopMode(const AVControlCommand& cmd); 233 void HandleOnToggleFavorite(const AVControlCommand& cmd); 234 void HandleOnPlayFromAssetId(const AVControlCommand& cmd); 235 236 using HandlerFuncType = void(AVSessionItem::*)(const AVControlCommand&); 237 static inline HandlerFuncType cmdHandlers[] = { 238 &AVSessionItem::HandleOnPlay, 239 &AVSessionItem::HandleOnPause, 240 &AVSessionItem::HandleOnStop, 241 &AVSessionItem::HandleOnPlayNext, 242 &AVSessionItem::HandleOnPlayPrevious, 243 &AVSessionItem::HandleOnFastForward, 244 &AVSessionItem::HandleOnRewind, 245 &AVSessionItem::HandleOnSeek, 246 &AVSessionItem::HandleOnSetSpeed, 247 &AVSessionItem::HandleOnSetLoopMode, 248 &AVSessionItem::HandleOnToggleFavorite, 249 &AVSessionItem::HandleOnPlayFromAssetId, 250 &AVSessionItem::HandleOnAVCallAnswer, 251 &AVSessionItem::HandleOnAVCallHangUp, 252 &AVSessionItem::HandleOnAVCallToggleCallMute, 253 }; 254 255 std::recursive_mutex controllersLock_; 256 std::map<pid_t, sptr<AVControllerItem>> controllers_; 257 AVCallMetaData avCallMetaData_; 258 AVCallState avCallState_; 259 260 AVSessionDescriptor descriptor_; 261 AVPlaybackState playbackState_; 262 AVMetaData metaData_; 263 std::recursive_mutex queueItemsLock_; 264 std::vector<AVQueueItem> queueItems_; 265 std::string queueTitle_; 266 AbilityRuntime::WantAgent::WantAgent launchAbility_; 267 AAFwk::WantParams extras_; 268 std::vector<int32_t> supportedCmd_; 269 std::vector<int32_t> supportedCastCmds_; 270 std::recursive_mutex callbackLock_; 271 sptr<IAVSessionCallback> callback_; 272 std::recursive_mutex remoteCallbackLock_; 273 std::shared_ptr<AVSessionCallback> remoteCallback_; 274 std::function<void(AVSessionItem&)> serviceCallback_; 275 std::function<void(AVSessionItem&)> callStartCallback_; 276 friend class AVSessionDumper; 277 278 std::recursive_mutex remoteSourceLock_; 279 std::shared_ptr<RemoteSessionSource> remoteSource_; 280 std::recursive_mutex remoteSinkLock_; 281 std::shared_ptr<RemoteSessionSink> remoteSink_; 282 283 std::function<void(AVSessionItem&)> serviceCallbackForAddAVQueueInfo_; 284 285 int32_t castConnectStateForDisconnect_ = 5; 286 int32_t castConnectStateForConnected_ = 6; 287 int32_t removeCmdStep_ = 1000; 288 289 std::recursive_mutex destroyLock_; 290 volatile bool isDestroyed_ = false; 291 292 std::recursive_mutex metaDataLock_; 293 #ifdef CASTPLUS_CAST_ENGINE_ENABLE 294 std::recursive_mutex castHandleLock_; 295 int64_t castHandle_ = 0; 296 297 std::recursive_mutex castControllerProxyLock_; 298 std::shared_ptr<IAVCastControllerProxy> castControllerProxy_; 299 std::recursive_mutex castControllersLock_; 300 std::vector<std::shared_ptr<AVCastControllerItem>> castControllers_; 301 std::shared_ptr<CssListener> cssListener_; 302 std::shared_ptr<IAVCastSessionStateListener> iAVCastSessionStateListener_; 303 304 std::map<std::string, DeviceInfo> castDeviceInfoMap_; 305 #endif 306 }; 307 } // namespace OHOS::AVSession 308 #endif // OHOS_AVSESSION_ITEM_H 309