1 /* 2 * Copyright (c) 2025 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_MIGRATE_AVSESSION_PROXY_H 17 #define OHOS_MIGRATE_AVSESSION_PROXY_H 18 19 #include <atomic> 20 #include <mutex> 21 #include <thread> 22 23 #include "softbus/softbus_session_proxy.h" 24 #include "migrate_avsession_constant.h" 25 #include "avcontroller_item.h" 26 #include "avsession_item.h" 27 #include "cJSON.h" 28 #include "audio_adapter.h" 29 #include "avsession_info.h" 30 31 namespace OHOS::AVSession { 32 using MigrateAVSessionProxyControllerCallbackFunc = std::function<int32_t(const std::string&, AAFwk::WantParams&)>; 33 34 class AVSessionService; 35 class MigrateAVSessionProxy : public SoftbusSessionProxy, 36 public std::enable_shared_from_this<MigrateAVSessionProxy> { 37 public: 38 explicit MigrateAVSessionProxy(AVSessionService *ptr, int32_t mode = MSG_HEAD_MODE_FOR_NEXT, 39 std::string deviceId = ""); 40 ~MigrateAVSessionProxy(); 41 42 void OnConnectServer(const std::string &deviceId) override; 43 void OnDisconnectServer(const std::string &deviceId) override; 44 int32_t GetCharacteristic() override; 45 void OnBytesReceived(const std::string &deviceId, const std::string &data) override; 46 47 void HandlePlay(); 48 void HandlePause(); 49 void HandlePlayNext(); 50 void HandlePlayPrevious(); 51 void HandleToggleFavorite(const std::string& mediaId); 52 void HandleCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs); 53 void GetDistributedSessionControllerList(std::vector<sptr<IRemoteObject>>& controllerList); 54 bool CheckMediaAlive(); 55 56 enum { 57 AUDIO_NUM_SET_VOLUME = 0, 58 AUDIO_NUM_SELECT_OUTPUT_DEVICE = 1, 59 AUDIO_NUM_GET_VOLUME = 2, 60 AUDIO_NUM_GET_AVAILABLE_DEVICES = 3, 61 AUDIO_NUM_GET_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO = 4, 62 SESSION_NUM_COLD_START_FROM_PROXY = 5, 63 SESSION_NUM_SET_MEDIACONTROL_NEED_STATE = 6, 64 }; 65 66 const std::map<const std::string, int32_t> AUDIO_EVENT_MAPS = { 67 {AUDIO_SET_VOLUME, AUDIO_NUM_SET_VOLUME}, 68 {AUDIO_SELECT_OUTPUT_DEVICE, AUDIO_NUM_SELECT_OUTPUT_DEVICE}, 69 {AUDIO_GET_VOLUME, AUDIO_NUM_GET_VOLUME}, 70 {AUDIO_GET_AVAILABLE_DEVICES, AUDIO_NUM_GET_AVAILABLE_DEVICES}, 71 {AUDIO_GET_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO, 72 AUDIO_NUM_GET_PREFERRED_OUTPUT_DEVICE_FOR_RENDERER_INFO}, 73 {SESSION_COLD_START_FROM_PROXY, SESSION_NUM_COLD_START_FROM_PROXY}, 74 {SESSION_SET_MEDIACONTROL_NEED_STATE, SESSION_NUM_SET_MEDIACONTROL_NEED_STATE}, 75 }; 76 77 private: 78 void PrepareSessionFromRemote(); 79 void ReleaseSessionFromRemote(); 80 void ReleaseControllerOfRemoteSession(); 81 void PrepareControllerOfRemoteSession(sptr<AVSessionItem> sessionItem); 82 void ProcessSessionInfo(cJSON* jsonValue); 83 void ProcessMetaData(cJSON* jsonValue); 84 void ProcessPlaybackState(cJSON* jsonValue); 85 void ProcessValidCommands(cJSON* jsonValue); 86 void ProcessVolumeControlCommand(cJSON* jsonValue); 87 void ProcessAvailableDevices(cJSON* jsonValue); 88 void ProcessPreferredOutputDevice(cJSON* jsonValue); 89 void ProcessBundleImg(std::string bundleIconStr); 90 void ProcessMediaImage(std::string mediaImageStr); 91 void SendControlCommandMsg(int32_t commandCode, std::string commandArgsStr); 92 void SendSpecialKeepAliveData(); 93 void SendMediaControlNeedStateMsg(); 94 95 const MigrateAVSessionProxyControllerCallbackFunc MigrateAVSessionProxyControllerCallback(); 96 97 void SetVolume(const AAFwk::WantParams& extras); 98 void SelectOutputDevice(const AAFwk::WantParams& extras); 99 100 void GetVolume(AAFwk::WantParams& extras); 101 void GetAvailableDevices(AAFwk::WantParams& extras); 102 void GetPreferredOutputDeviceForRendererInfo(AAFwk::WantParams& extras); 103 void ColdStartFromProxy(); 104 void NotifyMediaControlNeedStateChange(AAFwk::WantParams& extras); 105 106 int32_t mMode_ = 0; 107 std::string deviceId_; 108 std::string localDeviceId_; 109 sptr<AVSessionItem> remoteSession_ = nullptr; 110 sptr<AVControllerItem> preSetController_ = nullptr; 111 AVSessionService *servicePtr_ = nullptr; 112 AppExecFwk::ElementName elementName_; 113 114 int32_t volumeNum_ = 0; 115 AudioDeviceDescriptors availableDevices_; 116 AudioDeviceDescriptors preferredOutputDevice_; 117 MigrateAVSessionProxyControllerCallbackFunc migrateProxyCallback_; 118 119 std::atomic<bool> isNeedByMediaControl = false; 120 std::thread keepAliveworker_; 121 std::recursive_mutex migrateProxyDeviceIdLock_; 122 std::mutex keepAliveMtx_; 123 std::condition_variable keepAliveCv_; 124 }; 125 126 class AVSessionObserver : public AVSessionCallback { 127 public: 128 explicit AVSessionObserver(const std::string &playerId, std::weak_ptr<MigrateAVSessionProxy> migrateProxy); AVSessionObserver()129 AVSessionObserver() {} ~AVSessionObserver()130 ~AVSessionObserver() {} 131 132 void OnPlay() override; 133 void OnPause() override; OnStop()134 void OnStop() override {} 135 void OnPlayNext() override; 136 void OnPlayPrevious() override; OnFastForward(int64_t time)137 void OnFastForward(int64_t time) override {} OnRewind(int64_t time)138 void OnRewind(int64_t time) override {} OnSeek(int64_t time)139 void OnSeek(int64_t time) override {} OnSetSpeed(double speed)140 void OnSetSpeed(double speed) override {} OnSetLoopMode(int32_t loopMode)141 void OnSetLoopMode(int32_t loopMode) override {} OnSetTargetLoopMode(int32_t targetLoopMode)142 void OnSetTargetLoopMode(int32_t targetLoopMode) override {} 143 void OnToggleFavorite(const std::string& mediaId) override; OnMediaKeyEvent(const MMI::KeyEvent & keyEvent)144 void OnMediaKeyEvent(const MMI::KeyEvent& keyEvent) override {} OnOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)145 void OnOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo) override {} 146 void OnCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs) override; OnSkipToQueueItem(int32_t itemId)147 void OnSkipToQueueItem(int32_t itemId) override {} OnAVCallAnswer()148 void OnAVCallAnswer() override {} OnAVCallHangUp()149 void OnAVCallHangUp() override {} OnAVCallToggleCallMute()150 void OnAVCallToggleCallMute() override {} OnPlayFromAssetId(int64_t assetId)151 void OnPlayFromAssetId(int64_t assetId) override {} OnPlayWithAssetId(const std::string & assetId)152 void OnPlayWithAssetId(const std::string& assetId) override {} OnCastDisplayChange(const CastDisplayInfo & castDisplayInfo)153 void OnCastDisplayChange(const CastDisplayInfo& castDisplayInfo) override {} OnCastDisplaySizeChange(const CastDisplayInfo & castDisplayInfo)154 void OnCastDisplaySizeChange(const CastDisplayInfo& castDisplayInfo) override {} OnCustomData(const AAFwk::WantParams & data)155 void OnCustomData(const AAFwk::WantParams& data) override {} 156 157 private: 158 std::weak_ptr<MigrateAVSessionProxy> migrateProxy_; 159 std::string playerId_ = ""; 160 }; 161 } // namespace OHOS::AVSession 162 163 #endif //OHOS_MIGRATE_AVSESSION_PROXY_H