1 /*
2 * Copyright (C) 2021-2024 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 "player_server_state.h"
17 #include "media_errors.h"
18 #include "media_log.h"
19 #include "media_dfx.h"
20 #include "account_subscriber.h"
21 #include "os_account_manager.h"
22 #include "plugin/plugin_time.h"
23
24 namespace {
25 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_PLAYER, "PlayerServerState"};
26 constexpr int32_t COMPLETED_PLAY_REPORT_MS = 3000;
27 }
28
29 namespace OHOS {
30 namespace Media {
ReportInvalidOperation() const31 void PlayerServer::BaseState::ReportInvalidOperation() const
32 {
33 MEDIA_LOGE("invalid operation for %{public}s", GetStateName().c_str());
34 (void)server_.taskMgr_.MarkTaskDone("ReportInvalidOperation");
35 }
36
Prepare()37 int32_t PlayerServer::BaseState::Prepare()
38 {
39 ReportInvalidOperation();
40 return MSERR_INVALID_STATE;
41 }
42
Play()43 int32_t PlayerServer::BaseState::Play()
44 {
45 ReportInvalidOperation();
46 return MSERR_INVALID_STATE;
47 }
48
Pause(bool isSystemOperation)49 int32_t PlayerServer::BaseState::Pause(bool isSystemOperation)
50 {
51 (void)isSystemOperation;
52 ReportInvalidOperation();
53 return MSERR_INVALID_STATE;
54 }
55
Freeze()56 int32_t PlayerServer::BaseState::Freeze()
57 {
58 return server_.HandleLiteFreeze();
59 }
60
UnFreeze()61 int32_t PlayerServer::BaseState::UnFreeze()
62 {
63 return server_.HandleLiteUnFreeze();
64 }
65
PauseDemuxer()66 int32_t PlayerServer::BaseState::PauseDemuxer()
67 {
68 ReportInvalidOperation();
69 return MSERR_INVALID_STATE;
70 }
71
ResumeDemuxer()72 int32_t PlayerServer::BaseState::ResumeDemuxer()
73 {
74 ReportInvalidOperation();
75 return MSERR_INVALID_STATE;
76 }
77
Seek(int32_t mSeconds,PlayerSeekMode mode)78 int32_t PlayerServer::BaseState::Seek(int32_t mSeconds, PlayerSeekMode mode)
79 {
80 (void)mSeconds;
81 (void)mode;
82
83 ReportInvalidOperation();
84 return MSERR_INVALID_STATE;
85 }
86
Stop()87 int32_t PlayerServer::BaseState::Stop()
88 {
89 ReportInvalidOperation();
90 return MSERR_INVALID_STATE;
91 }
92
SetPlaybackSpeed(PlaybackRateMode mode)93 int32_t PlayerServer::BaseState::SetPlaybackSpeed(PlaybackRateMode mode)
94 {
95 (void)mode;
96
97 ReportInvalidOperation();
98 return MSERR_INVALID_STATE;
99 }
100
SetPlaybackRate(float rate)101 int32_t PlayerServer::BaseState::SetPlaybackRate(float rate)
102 {
103 (void)rate;
104
105 ReportInvalidOperation();
106 return MSERR_INVALID_STATE;
107 }
108
SeekContinous(int32_t mSeconds,int64_t batchNo)109 int32_t PlayerServer::BaseState::SeekContinous(int32_t mSeconds, int64_t batchNo)
110 {
111 (void)mSeconds;
112 (void)batchNo;
113
114 ReportInvalidOperation();
115 return MSERR_INVALID_STATE;
116 }
117
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)118 int32_t PlayerServer::BaseState::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
119 {
120 (void)start;
121 (void)end;
122 (void)mode;
123
124 ReportInvalidOperation();
125 return MSERR_INVALID_STATE;
126 }
127
MessageSeekDone(int32_t extra)128 int32_t PlayerServer::BaseState::MessageSeekDone(int32_t extra)
129 {
130 int32_t ret = MSERR_OK;
131 (void)server_.taskMgr_.MarkTaskDone("seek done");
132 MediaTrace::TraceEnd("PlayerServer::Seek", FAKE_POINTER(&server_));
133 MediaTrace::TraceEnd("PlayerServer::track", FAKE_POINTER(&server_));
134 if (server_.disableNextSeekDone_ && extra == 0) {
135 ret = MSERR_UNSUPPORT;
136 }
137 server_.disableNextSeekDone_ = false;
138 return ret;
139 }
140
MessageTrackDone(int32_t extra)141 int32_t PlayerServer::BaseState::MessageTrackDone(int32_t extra)
142 {
143 (void)extra;
144 (void)server_.taskMgr_.MarkTaskDone("track done");
145 MediaTrace::TraceEnd("PlayerServer::track", FAKE_POINTER(&server_));
146 return MSERR_OK;
147 }
148
MessageTrackInfoUpdate()149 int32_t PlayerServer::BaseState::MessageTrackInfoUpdate()
150 {
151 (void)server_.taskMgr_.MarkTaskDone("addsubtitle done");
152 MediaTrace::TraceEnd("PlayerServer::AddSubSource", FAKE_POINTER(&server_));
153 return MSERR_OK;
154 }
155
MessageSpeedDone()156 int32_t PlayerServer::BaseState::MessageSpeedDone()
157 {
158 (void)server_.taskMgr_.MarkTaskDone("speed done");
159 MediaTrace::TraceEnd("PlayerServer::SetPlaybackSpeed", FAKE_POINTER(&server_));
160 return MSERR_OK;
161 }
162
MessageRateDone()163 int32_t PlayerServer::BaseState::MessageRateDone()
164 {
165 (void)server_.taskMgr_.MarkTaskDone("rate done");
166 MediaTrace::TraceEnd("PlayerServer::SetPlaybackRate", FAKE_POINTER(&server_));
167 return MSERR_OK;
168 }
169
MessageStateChange(int32_t extra)170 int32_t PlayerServer::BaseState::MessageStateChange(int32_t extra)
171 {
172 if (extra == PLAYER_PLAYBACK_COMPLETE) {
173 HandlePlaybackComplete(extra);
174 } else {
175 HandleStateChange(extra);
176 MEDIA_LOGI("0x%{public}06" PRIXPTR " Callback State change, currentState is %{public}s",
177 FAKE_POINTER(this), server_.GetStatusDescription(extra).c_str());
178 }
179
180 if (extra == PLAYER_STOPPED && server_.disableStoppedCb_) {
181 MEDIA_LOGI("0x%{public}06" PRIXPTR " Callback State change disable StoppedCb", FAKE_POINTER(this));
182 server_.disableStoppedCb_ = false;
183 return MSERR_UNSUPPORT;
184 }
185 return MSERR_OK;
186 }
187
OnMessageReceived(PlayerOnInfoType type,int32_t extra,const Format & infoBody)188 int32_t PlayerServer::BaseState::OnMessageReceived(PlayerOnInfoType type, int32_t extra, const Format &infoBody)
189 {
190 MEDIA_LOGD("message received, type = %{public}d, extra = %{public}d", type, extra);
191 (void)infoBody;
192
193 int32_t ret = MSERR_OK;
194 switch (type) {
195 case INFO_TYPE_SEEKDONE:
196 ret = MessageSeekDone(extra);
197 break;
198
199 case INFO_TYPE_SPEEDDONE:
200 ret = MessageSpeedDone();
201 break;
202
203 case INFO_TYPE_RATEDONE:
204 ret = MessageRateDone();
205 break;
206
207 case INFO_TYPE_EOS:
208 HandleEos();
209 break;
210
211 case INFO_TYPE_STATE_CHANGE:
212 ret = MessageStateChange(extra);
213 break;
214
215 case INFO_TYPE_TRACK_DONE:
216 ret = MessageTrackDone(extra);
217 break;
218
219 case INFO_TYPE_ADD_SUBTITLE_DONE:
220 ret = MessageTrackInfoUpdate();
221 break;
222
223 case INFO_TYPE_TRACK_INFO_UPDATE:
224 ret = MessageTrackInfoUpdate();
225 break;
226 case INFO_TYPE_INTERRUPT_EVENT:
227 HandleInterruptEvent(infoBody);
228 break;
229
230 case INFO_TYPE_AUDIO_DEVICE_CHANGE:
231 HandleAudioDeviceChangeEvent(infoBody);
232 break;
233
234 default:
235 break;
236 }
237
238 return ret;
239 }
240
StateEnter()241 void PlayerServer::IdleState::StateEnter()
242 {
243 (void)server_.HandleReset();
244 }
245
Prepare()246 int32_t PlayerServer::InitializedState::Prepare()
247 {
248 server_.ChangeState(server_.preparingState_);
249 return MSERR_OK;
250 }
251
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)252 int32_t PlayerServer::InitializedState::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
253 {
254 return server_.HandleSetPlayRange(start, end, mode);
255 }
256
StateEnter()257 void PlayerServer::PreparingState::StateEnter()
258 {
259 (void)server_.HandlePrepare();
260 MEDIA_LOGD("PlayerServer::PreparingState::StateEnter finished");
261 }
262
Stop()263 int32_t PlayerServer::PreparingState::Stop()
264 {
265 (void)server_.HandleStop();
266 server_.ChangeState(server_.stoppedState_);
267 return MSERR_OK;
268 }
269
HandleStateChange(int32_t newState)270 void PlayerServer::PreparingState::HandleStateChange(int32_t newState)
271 {
272 if (newState == PLAYER_PREPARED || newState == PLAYER_STATE_ERROR) {
273 MediaTrace::TraceEnd("PlayerServer::PrepareAsync", FAKE_POINTER(&server_));
274 if (newState == PLAYER_STATE_ERROR) {
275 server_.lastOpStatus_ = PLAYER_STATE_ERROR;
276 server_.ChangeState(server_.initializedState_);
277 } else {
278 server_.ChangeState(server_.preparedState_);
279 }
280 (void)server_.taskMgr_.MarkTaskDone("preparing->prepared done");
281 }
282 }
283
Prepare()284 int32_t PlayerServer::PreparedState::Prepare()
285 {
286 (void)server_.taskMgr_.MarkTaskDone("double prepare");
287 return MSERR_OK;
288 }
289
Play()290 int32_t PlayerServer::PreparedState::Play()
291 {
292 return server_.HandlePlay();
293 }
294
Seek(int32_t mSeconds,PlayerSeekMode mode)295 int32_t PlayerServer::PreparedState::Seek(int32_t mSeconds, PlayerSeekMode mode)
296 {
297 return server_.HandleSeek(mSeconds, mode);
298 }
299
Stop()300 int32_t PlayerServer::PreparedState::Stop()
301 {
302 return server_.HandleStop();
303 }
304
SetPlaybackSpeed(PlaybackRateMode mode)305 int32_t PlayerServer::PreparedState::SetPlaybackSpeed(PlaybackRateMode mode)
306 {
307 return server_.HandleSetPlaybackSpeed(mode);
308 }
309
SetPlaybackRate(float rate)310 int32_t PlayerServer::PreparedState::SetPlaybackRate(float rate)
311 {
312 return server_.HandleSetPlaybackRate(rate);
313 }
314
SeekContinous(int32_t mSeconds,int64_t batchNo)315 int32_t PlayerServer::PreparedState::SeekContinous(int32_t mSeconds, int64_t batchNo)
316 {
317 return server_.HandleSeekContinous(mSeconds, batchNo);
318 }
319
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)320 int32_t PlayerServer::PreparedState::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
321 {
322 return server_.HandleSetPlayRange(start, end, mode);
323 }
324
HandleStateChange(int32_t newState)325 void PlayerServer::PreparedState::HandleStateChange(int32_t newState)
326 {
327 if (newState == PLAYER_STARTED) {
328 MediaTrace::TraceEnd("PlayerServer::Play", FAKE_POINTER(&server_));
329 server_.ChangeState(server_.playingState_);
330 (void)server_.taskMgr_.MarkTaskDone("prepared->started done");
331 } else if (newState == PLAYER_STOPPED) {
332 MediaTrace::TraceEnd("PlayerServer::Stop", FAKE_POINTER(&server_));
333 server_.ChangeState(server_.stoppedState_);
334 (void)server_.taskMgr_.MarkTaskDone("prepared->stopped done");
335 } else if (newState == PLAYER_STATE_ERROR) {
336 server_.lastOpStatus_ = PLAYER_STATE_ERROR;
337 server_.ChangeState(server_.initializedState_);
338 (void)server_.taskMgr_.MarkTaskDone("prepared->error done");
339 }
340 }
341
HandleEos()342 void PlayerServer::PreparedState::HandleEos()
343 {
344 server_.PreparedHandleEos();
345 }
346
Play()347 int32_t PlayerServer::PlayingState::Play()
348 {
349 (void)server_.taskMgr_.MarkTaskDone("double play");
350 return MSERR_OK;
351 }
352
Pause(bool isSystemOperation)353 int32_t PlayerServer::PlayingState::Pause(bool isSystemOperation)
354 {
355 return server_.HandlePause(isSystemOperation);
356 }
357
Freeze()358 int32_t PlayerServer::PlayingState::Freeze()
359 {
360 return server_.HandleFreeze();
361 }
362
UnFreeze()363 int32_t PlayerServer::PlayingState::UnFreeze()
364 {
365 return server_.HandleUnFreeze();
366 }
367
PauseDemuxer()368 int32_t PlayerServer::PlayingState::PauseDemuxer()
369 {
370 return server_.HandlePauseDemuxer();
371 }
372
ResumeDemuxer()373 int32_t PlayerServer::PlayingState::ResumeDemuxer()
374 {
375 return server_.HandleResumeDemuxer();
376 }
377
Seek(int32_t mSeconds,PlayerSeekMode mode)378 int32_t PlayerServer::PlayingState::Seek(int32_t mSeconds, PlayerSeekMode mode)
379 {
380 return server_.HandleSeek(mSeconds, mode);
381 }
382
Stop()383 int32_t PlayerServer::PlayingState::Stop()
384 {
385 return server_.HandleStop();
386 }
387
SetPlaybackSpeed(PlaybackRateMode mode)388 int32_t PlayerServer::PlayingState::SetPlaybackSpeed(PlaybackRateMode mode)
389 {
390 return server_.HandleSetPlaybackSpeed(mode);
391 }
392
SetPlaybackRate(float rate)393 int32_t PlayerServer::PlayingState::SetPlaybackRate(float rate)
394 {
395 return server_.HandleSetPlaybackRate(rate);
396 }
397
SeekContinous(int32_t mSeconds,int64_t batchNo)398 int32_t PlayerServer::PlayingState::SeekContinous(int32_t mSeconds, int64_t batchNo)
399 {
400 return server_.HandleSeekContinous(mSeconds, batchNo);
401 }
402
HandleStateChange(int32_t newState)403 void PlayerServer::PlayingState::HandleStateChange(int32_t newState)
404 {
405 if (newState == PLAYER_PAUSED) {
406 MediaTrace::TraceEnd("PlayerServer::Pause", FAKE_POINTER(&server_));
407 server_.ChangeState(server_.pausedState_);
408 (void)server_.taskMgr_.MarkTaskDone("started->paused done");
409 } else if (newState == PLAYER_STOPPED) {
410 MediaTrace::TraceEnd("PlayerServer::Stop", FAKE_POINTER(&server_));
411 server_.ChangeState(server_.stoppedState_);
412 (void)server_.taskMgr_.MarkTaskDone("started->stopped done");
413 }
414 }
415
HandlePlaybackComplete(int32_t extra)416 void PlayerServer::PlayingState::HandlePlaybackComplete(int32_t extra)
417 {
418 (void)extra;
419 server_.lastOpStatus_ = PLAYER_PLAYBACK_COMPLETE;
420 server_.ChangeState(server_.playbackCompletedState_);
421 (void)server_.taskMgr_.MarkTaskDone("playing->completed done");
422 }
423
HandleEos()424 void PlayerServer::PlayingState::HandleEos()
425 {
426 server_.HandleEos();
427 }
428
HandleInterruptEvent(const Format & infoBody)429 void PlayerServer::PlayingState::HandleInterruptEvent(const Format &infoBody)
430 {
431 server_.HandleInterruptEvent(infoBody);
432 }
433
HandleAudioDeviceChangeEvent(const Format & infoBody)434 void PlayerServer::PlayingState::HandleAudioDeviceChangeEvent(const Format &infoBody)
435 {
436 (void)infoBody;
437 }
438
StateEnter()439 void PlayerServer::PlayingState::StateEnter()
440 {
441 int32_t userId = server_.GetUserId();
442 bool isBootCompleted = server_.IsBootCompleted();
443 if (userId <= 0 || !isBootCompleted) {
444 MEDIA_LOGI("PlayingState::StateEnter userId = %{public}d, isBootCompleted = %{public}d, return",
445 userId, isBootCompleted);
446 return;
447 }
448
449 bool isForeground = true;
450 AccountSA::OsAccountManager::IsOsAccountForeground(userId, isForeground);
451 MEDIA_LOGI("PlayingState::StateEnter userId = %{public}d isForeground = %{public}d isBootCompleted = %{public}d",
452 userId, isForeground, isBootCompleted);
453 if (!isForeground && !server_.GetInterruptState()) {
454 server_.OnSystemOperation(
455 PlayerOnSystemOperationType::OPERATION_TYPE_PAUSE, PlayerOperationReason::OPERATION_REASON_USER_BACKGROUND);
456 return;
457 }
458 std::shared_ptr<CommonEventReceiver> receiver = server_.GetCommonEventReceiver();
459 AccountSubscriber::GetInstance()->RegisterCommonEventReceiver(userId, receiver);
460 }
461
StateExit()462 void PlayerServer::PlayingState::StateExit()
463 {
464 std::shared_ptr<CommonEventReceiver> receiver = server_.GetCommonEventReceiver();
465 AccountSubscriber::GetInstance()->UnregisterCommonEventReceiver(server_.GetUserId(), receiver);
466 }
467
Play()468 int32_t PlayerServer::PausedState::Play()
469 {
470 return server_.HandlePlay();
471 }
472
Pause(bool isSystemOperation)473 int32_t PlayerServer::PausedState::Pause(bool isSystemOperation)
474 {
475 (void)server_.taskMgr_.MarkTaskDone("double pause");
476 return MSERR_OK;
477 }
478
Seek(int32_t mSeconds,PlayerSeekMode mode)479 int32_t PlayerServer::PausedState::Seek(int32_t mSeconds, PlayerSeekMode mode)
480 {
481 return server_.HandleSeek(mSeconds, mode);
482 }
483
Stop()484 int32_t PlayerServer::PausedState::Stop()
485 {
486 return server_.HandleStop();
487 }
488
UnFreeze()489 int32_t PlayerServer::PausedState::UnFreeze()
490 {
491 return server_.HandleUnFreeze();
492 }
493
SetPlaybackSpeed(PlaybackRateMode mode)494 int32_t PlayerServer::PausedState::SetPlaybackSpeed(PlaybackRateMode mode)
495 {
496 return server_.HandleSetPlaybackSpeed(mode);
497 }
498
SetPlaybackRate(float rate)499 int32_t PlayerServer::PausedState::SetPlaybackRate(float rate)
500 {
501 return server_.HandleSetPlaybackRate(rate);
502 }
503
SeekContinous(int32_t mSeconds,int64_t batchNo)504 int32_t PlayerServer::PausedState::SeekContinous(int32_t mSeconds, int64_t batchNo)
505 {
506 return server_.HandleSeekContinous(mSeconds, batchNo);
507 }
508
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)509 int32_t PlayerServer::PausedState::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
510 {
511 return server_.HandleSetPlayRange(start, end, mode);
512 }
513
HandleStateChange(int32_t newState)514 void PlayerServer::PausedState::HandleStateChange(int32_t newState)
515 {
516 if (newState == PLAYER_STARTED) {
517 MediaTrace::TraceEnd("PlayerServer::Play", FAKE_POINTER(&server_));
518 server_.ChangeState(server_.playingState_);
519 (void)server_.taskMgr_.MarkTaskDone("paused->started done");
520 } else if (newState == PLAYER_STOPPED) {
521 MediaTrace::TraceEnd("PlayerServer::Stop", FAKE_POINTER(&server_));
522 server_.ChangeState(server_.stoppedState_);
523 (void)server_.taskMgr_.MarkTaskDone("paused->stopped done");
524 }
525 }
526
HandleEos()527 void PlayerServer::PausedState::HandleEos()
528 {
529 server_.HandleEos();
530 }
531
Prepare()532 int32_t PlayerServer::StoppedState::Prepare()
533 {
534 server_.ChangeState(server_.preparingState_);
535 return MSERR_OK;
536 }
537
Stop()538 int32_t PlayerServer::StoppedState::Stop()
539 {
540 (void)server_.taskMgr_.MarkTaskDone("double stop");
541 return MSERR_OK;
542 }
543
HandleStateChange(int32_t newState)544 void PlayerServer::StoppedState::HandleStateChange(int32_t newState)
545 {
546 if (newState == PLAYER_STATE_ERROR) {
547 (void)server_.taskMgr_.MarkTaskDone("stopped->error done");
548 } else if (newState == PLAYER_STOPPED) {
549 (void)server_.taskMgr_.MarkTaskDone("double stop");
550 }
551 }
552
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)553 int32_t PlayerServer::StoppedState::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
554 {
555 return server_.HandleSetPlayRange(start, end, mode);
556 }
557
StateEnter()558 void PlayerServer::PlaybackCompletedState::StateEnter()
559 {
560 MEDIA_LOGD("state enter completed");
561 stateEnterTimeMs_ = Plugins::GetCurrentMillisecond();
562 }
563
Play()564 int32_t PlayerServer::PlaybackCompletedState::Play()
565 {
566 auto res = server_.HandlePlay();
567 auto timeNow = Plugins::GetCurrentMillisecond();
568 auto timeDiff = timeNow - stateEnterTimeMs_;
569 MEDIA_LOGD("timeNow %{public}" PRId64 " timeStart %{public}" PRId64 " timeDiff %{public}" PRId64,
570 timeNow, stateEnterTimeMs_, timeDiff);
571 CHECK_AND_RETURN_RET(timeDiff < COMPLETED_PLAY_REPORT_MS, res);
572 return res;
573 }
574
Seek(int32_t mSeconds,PlayerSeekMode mode)575 int32_t PlayerServer::PlaybackCompletedState::Seek(int32_t mSeconds, PlayerSeekMode mode)
576 {
577 return server_.HandleSeek(mSeconds, mode);
578 }
579
SeekContinous(int32_t mSeconds,int64_t batchNo)580 int32_t PlayerServer::PlaybackCompletedState::SeekContinous(int32_t mSeconds, int64_t batchNo)
581 {
582 return server_.HandleSeekContinous(mSeconds, batchNo);
583 }
584
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)585 int32_t PlayerServer::PlaybackCompletedState::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
586 {
587 return server_.HandleSetPlayRange(start, end, mode);
588 }
589
Stop()590 int32_t PlayerServer::PlaybackCompletedState::Stop()
591 {
592 return server_.HandleStop();
593 }
594
UnFreeze()595 int32_t PlayerServer::PlaybackCompletedState::UnFreeze()
596 {
597 return server_.HandleUnFreeze();
598 }
599
HandleStateChange(int32_t newState)600 void PlayerServer::PlaybackCompletedState::HandleStateChange(int32_t newState)
601 {
602 if (newState == PLAYER_STARTED) {
603 MediaTrace::TraceEnd("PlayerServer::Play", FAKE_POINTER(&server_));
604 server_.ChangeState(server_.playingState_);
605 (void)server_.taskMgr_.MarkTaskDone("completed->started done");
606 } else if (newState == PLAYER_STOPPED) {
607 MediaTrace::TraceEnd("PlayerServer::Stop", FAKE_POINTER(&server_));
608 server_.ChangeState(server_.stoppedState_);
609 server_.lastOpStatus_ = PLAYER_STOPPED;
610 (void)server_.taskMgr_.MarkTaskDone("completed->stopped done");
611 }
612 }
613
SetPlaybackSpeed(PlaybackRateMode mode)614 int32_t PlayerServer::PlaybackCompletedState::SetPlaybackSpeed(PlaybackRateMode mode)
615 {
616 return server_.HandleSetPlaybackSpeed(mode);
617 }
618
SetPlaybackRate(float rate)619 int32_t PlayerServer::PlaybackCompletedState::SetPlaybackRate(float rate)
620 {
621 return server_.HandleSetPlaybackRate(rate);
622 }
623 }
624 }
625