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 #include "avcontrol_command.h"
17 #include "avplayback_state.h"
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20
21 namespace OHOS::AVSession {
AVControlCommand()22 AVControlCommand::AVControlCommand()
23 : cmd_(SESSION_CMD_INVALID)
24 {
25 }
26
~AVControlCommand()27 AVControlCommand::~AVControlCommand()
28 {
29 }
30
Unmarshalling(Parcel & data)31 AVControlCommand *AVControlCommand::Unmarshalling(Parcel& data)
32 {
33 auto result = new (std::nothrow) AVControlCommand();
34 if (result != nullptr) {
35 int32_t cmd = data.ReadInt32();
36 result->SetCommand(cmd);
37 switch (cmd) {
38 case SESSION_CMD_FAST_FORWARD:
39 result->SetForwardTime(data.ReadInt64());
40 break;
41 case SESSION_CMD_REWIND:
42 result->SetRewindTime(data.ReadInt64());
43 break;
44 case SESSION_CMD_SEEK:
45 result->SetSeekTime(data.ReadInt64());
46 break;
47 case SESSION_CMD_SET_SPEED:
48 result->SetSpeed(data.ReadDouble());
49 break;
50 case SESSION_CMD_SET_LOOP_MODE:
51 result->SetLoopMode(data.ReadInt32());
52 break;
53 case SESSION_CMD_TOGGLE_FAVORITE:
54 result->SetAssetId(data.ReadString());
55 break;
56 case SESSION_CMD_AVCALL_TOGGLE_CALL_MUTE:
57 result->SetAVCallMuted(data.ReadBool());
58 break;
59 case SESSION_CMD_PLAY_FROM_ASSETID:
60 result->SetPlayFromAssetId(data.ReadInt64());
61 break;
62 default:
63 break;
64 }
65 }
66 return result;
67 }
68
Marshalling(Parcel & parcel) const69 bool AVControlCommand::Marshalling(Parcel& parcel) const
70 {
71 if (!parcel.WriteInt32(cmd_)) {
72 return false;
73 }
74 switch (cmd_) {
75 case SESSION_CMD_FAST_FORWARD:
76 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<int64_t>(param_)
77 && parcel.WriteInt64(std::get<int64_t>(param_)), false, "write fast forward time failed");
78 break;
79 case SESSION_CMD_REWIND:
80 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<int64_t>(param_)
81 && parcel.WriteInt64(std::get<int64_t>(param_)), false, "write rewind time failed");
82 break;
83 case SESSION_CMD_SEEK:
84 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<int64_t>(param_)
85 && parcel.WriteInt64(std::get<int64_t>(param_)), false, "write seek time failed");
86 break;
87 case SESSION_CMD_SET_SPEED:
88 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<double>(param_)
89 && parcel.WriteDouble(std::get<double>(param_)), false, "write speed failed");
90 break;
91 case SESSION_CMD_SET_LOOP_MODE:
92 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<int32_t>(param_)
93 && parcel.WriteInt32(std::get<int32_t>(param_)), false, "write loop mode failed");
94 break;
95 case SESSION_CMD_TOGGLE_FAVORITE:
96 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<std::string>(param_)
97 && parcel.WriteString(std::get<std::string>(param_)), false, "write toggle favorite failed");
98 break;
99 case SESSION_CMD_PLAY_FROM_ASSETID:
100 CHECK_AND_RETURN_RET_LOG(std::holds_alternative<int64_t>(param_)
101 && parcel.WriteInt64(std::get<int64_t>(param_)), false, "write play from assetId failed");
102 break;
103 default:
104 break;
105 }
106 return true;
107 }
108
IsValid() const109 bool AVControlCommand::IsValid() const
110 {
111 return cmd_ > SESSION_CMD_INVALID && cmd_ < SESSION_CMD_MAX;
112 }
113
SetCommand(int32_t cmd)114 int32_t AVControlCommand::SetCommand(int32_t cmd)
115 {
116 if (cmd <= SESSION_CMD_INVALID || cmd >= SESSION_CMD_MAX) {
117 return ERR_INVALID_PARAM;
118 }
119 cmd_ = cmd;
120 return AVSESSION_SUCCESS;
121 }
122
GetCommand() const123 int32_t AVControlCommand::GetCommand() const
124 {
125 return cmd_;
126 }
127
SetSpeed(double speed)128 int32_t AVControlCommand::SetSpeed(double speed)
129 {
130 if (speed <= 0) {
131 return ERR_INVALID_PARAM;
132 }
133 param_ = speed;
134 return AVSESSION_SUCCESS;
135 }
136
GetSpeed(double & speed) const137 int32_t AVControlCommand::GetSpeed(double& speed) const
138 {
139 if (!std::holds_alternative<double>(param_)) {
140 return AVSESSION_ERROR;
141 }
142 speed = std::get<double>(param_);
143 return AVSESSION_SUCCESS;
144 }
145
SetForwardTime(int64_t forwardTime)146 int32_t AVControlCommand::SetForwardTime(int64_t forwardTime)
147 {
148 SLOGD("SetForwardTime with time %{public}jd", static_cast<int64_t>(forwardTime));
149 if (forwardTime < 0) {
150 SLOGE("SetForwardTime error");
151 return ERR_INVALID_PARAM;
152 }
153 param_ = forwardTime;
154 return AVSESSION_SUCCESS;
155 }
156
GetForwardTime(int64_t & forwardTime) const157 int32_t AVControlCommand::GetForwardTime(int64_t& forwardTime) const
158 {
159 if (!std::holds_alternative<int64_t>(param_)) {
160 SLOGE("GetForwardTime error");
161 return AVSESSION_ERROR;
162 }
163 forwardTime = std::get<int64_t>(param_);
164 SLOGE("GetForwardTime with time %{public}jd", static_cast<int64_t>(forwardTime));
165 return AVSESSION_SUCCESS;
166 }
167
SetRewindTime(int64_t rewindTime)168 int32_t AVControlCommand::SetRewindTime(int64_t rewindTime)
169 {
170 SLOGD("SetRewindTime with time %{public}jd", static_cast<int64_t>(rewindTime));
171 if (rewindTime < 0) {
172 SLOGE("SetRewindTime error");
173 return ERR_INVALID_PARAM;
174 }
175 param_ = rewindTime;
176 return AVSESSION_SUCCESS;
177 }
178
GetRewindTime(int64_t & rewindTime) const179 int32_t AVControlCommand::GetRewindTime(int64_t& rewindTime) const
180 {
181 if (!std::holds_alternative<int64_t>(param_)) {
182 SLOGE("GetRewindTime error");
183 return AVSESSION_ERROR;
184 }
185 rewindTime = std::get<int64_t>(param_);
186 SLOGE("GetRewindTime with time %{public}jd", static_cast<int64_t>(rewindTime));
187 return AVSESSION_SUCCESS;
188 }
189
SetSeekTime(int64_t time)190 int32_t AVControlCommand::SetSeekTime(int64_t time)
191 {
192 if (time < 0) {
193 return ERR_INVALID_PARAM;
194 }
195 param_ = time;
196 return AVSESSION_SUCCESS;
197 }
198
GetSeekTime(int64_t & time) const199 int32_t AVControlCommand::GetSeekTime(int64_t& time) const
200 {
201 if (!std::holds_alternative<int64_t>(param_)) {
202 return AVSESSION_ERROR;
203 }
204 time = std::get<int64_t>(param_);
205 return AVSESSION_SUCCESS;
206 }
207
SetLoopMode(int32_t mode)208 int32_t AVControlCommand::SetLoopMode(int32_t mode)
209 {
210 if (mode < AVPlaybackState::LOOP_MODE_UNDEFINED || mode > AVPlaybackState::LOOP_MODE_CUSTOM) {
211 return ERR_INVALID_PARAM;
212 }
213 param_ = mode;
214 return AVSESSION_SUCCESS;
215 }
216
GetLoopMode(int32_t & mode) const217 int32_t AVControlCommand::GetLoopMode(int32_t& mode) const
218 {
219 if (!std::holds_alternative<int32_t>(param_)) {
220 return AVSESSION_ERROR;
221 }
222 mode = std::get<int32_t>(param_);
223 return AVSESSION_SUCCESS;
224 }
225
SetAssetId(const std::string & assetId)226 int32_t AVControlCommand::SetAssetId(const std::string& assetId)
227 {
228 if (assetId.empty()) {
229 return ERR_INVALID_PARAM;
230 }
231 param_ = assetId;
232 return AVSESSION_SUCCESS;
233 }
234
GetAssetId(std::string & assetId) const235 int32_t AVControlCommand::GetAssetId(std::string& assetId) const
236 {
237 if (!std::holds_alternative<std::string>(param_)) {
238 return AVSESSION_ERROR;
239 }
240 assetId = std::get<std::string>(param_);
241 return AVSESSION_SUCCESS;
242 }
243
SetAVCallMuted(const bool isAVCallMuted)244 int32_t AVControlCommand::SetAVCallMuted(const bool isAVCallMuted)
245 {
246 param_ = isAVCallMuted;
247 return AVSESSION_SUCCESS;
248 }
249
IsAVCallMuted(bool & isAVCallMuted) const250 int32_t AVControlCommand::IsAVCallMuted(bool& isAVCallMuted) const
251 {
252 if (!std::holds_alternative<bool>(param_)) {
253 return AVSESSION_ERROR;
254 }
255 isAVCallMuted = std::get<bool>(param_);
256 return AVSESSION_SUCCESS;
257 }
258
SetPlayFromAssetId(int64_t playFromAssetId)259 int32_t AVControlCommand::SetPlayFromAssetId(int64_t playFromAssetId)
260 {
261 param_ = playFromAssetId;
262 return AVSESSION_SUCCESS;
263 }
264
GetPlayFromAssetId(int64_t & playFromAssetId) const265 int32_t AVControlCommand::GetPlayFromAssetId(int64_t& playFromAssetId) const
266 {
267 if (!std::holds_alternative<int64_t>(param_)) {
268 return AVSESSION_ERROR;
269 }
270 playFromAssetId = std::get<int64_t>(param_);
271 return AVSESSION_SUCCESS;
272 }
273 } // namespace OHOS::AVSession
274