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