• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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