1 /*
2  * Copyright (C) 2021 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 PLAYER_SERVER_STATE_H
17 #define PLAYER_SERVER_STATE_H
18 
19 #include "player_server.h"
20 
21 namespace OHOS {
22 namespace Media {
23 class PlayerServer::BaseState : public PlayerServerState {
24 public:
BaseState(PlayerServer & server,const std::string & name)25     BaseState(PlayerServer &server, const std::string &name) : PlayerServerState(name), server_(server) {}
26     virtual ~BaseState() = default;
27 
28     virtual int32_t Prepare();
29     virtual int32_t Play();
30     virtual int32_t Pause(bool isSystemOperation);
31     virtual int32_t Seek(int32_t mSeconds, PlayerSeekMode mode);
32     virtual int32_t SetPlaybackSpeed(PlaybackRateMode mode);
33     virtual int32_t Stop();
34     virtual int32_t SeekContinous(int32_t mSeconds, int64_t batchNo);
35     virtual int32_t PauseDemuxer();
36     virtual int32_t ResumeDemuxer();
37     virtual int32_t SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode);
38 protected:
39     int32_t OnMessageReceived(PlayerOnInfoType type, int32_t extra, const Format &infoBody) override;
HandleStateChange(int32_t newState)40     virtual void HandleStateChange(int32_t newState)
41     {
42         (void)newState;
43     }
HandlePlaybackComplete(int32_t extra)44     virtual void HandlePlaybackComplete(int32_t extra)
45     {
46         (void)extra;
47     }
48     void ReportInvalidOperation() const;
HandleEos()49     virtual void HandleEos() {}
HandleInterruptEvent(const Format & infoBody)50     virtual void HandleInterruptEvent(const Format &infoBody)
51     {
52         (void)infoBody;
53     }
HandleAudioDeviceChangeEvent(const Format & infoBody)54     virtual void HandleAudioDeviceChangeEvent(const Format &infoBody)
55     {
56         (void)infoBody;
57     }
58     int32_t MessageSeekDone(int32_t extra);
59     int32_t MessageTrackDone(int32_t extra);
60     int32_t MessageTrackInfoUpdate();
61     int32_t MessageSpeedDone();
62     int32_t MessageStateChange(int32_t extra);
63 
64     PlayerServer &server_;
65 };
66 
67 class PlayerServer::IdleState : public PlayerServer::BaseState {
68 public:
IdleState(PlayerServer & server)69     explicit IdleState(PlayerServer &server) : BaseState(server, "idle_state") {}
70     ~IdleState() = default;
71 
72 protected:
73     void StateEnter() override;
74 };
75 
76 class PlayerServer::InitializedState : public PlayerServer::BaseState {
77 public:
InitializedState(PlayerServer & server)78     explicit InitializedState(PlayerServer &server) : BaseState(server, "inited_state") {}
79     ~InitializedState() = default;
80 
81     int32_t Prepare() override;
82     int32_t SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode) override;
83 };
84 
85 class PlayerServer::PreparingState : public PlayerServer::BaseState {
86 public:
PreparingState(PlayerServer & server)87     explicit PreparingState(PlayerServer &server) : BaseState(server, "preparing_state") {}
88     ~PreparingState() = default;
89 
90     int32_t Stop() override;
91 
92 protected:
93     void HandleStateChange(int32_t newState) override;
94     void StateEnter() override;
95 };
96 
97 class PlayerServer::PreparedState : public PlayerServer::BaseState {
98 public:
PreparedState(PlayerServer & server)99     explicit PreparedState(PlayerServer &server) : BaseState(server, "prepared_state") {}
100     ~PreparedState() = default;
101 
102     int32_t Prepare() override;
103     int32_t Play() override;
104     int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override;
105     int32_t Stop() override;
106     int32_t SetPlaybackSpeed(PlaybackRateMode mode) override;
107     int32_t SeekContinous(int32_t mSeconds, int64_t batchNo) override;
108     int32_t SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode) override;
109 
110 protected:
111     void HandleStateChange(int32_t newState) override;
112     void HandleEos() override;
113 };
114 
115 class PlayerServer::PlayingState : public PlayerServer::BaseState {
116 public:
PlayingState(PlayerServer & server)117     explicit PlayingState(PlayerServer &server) : BaseState(server, "playing_state") {}
118     ~PlayingState() = default;
119 
120     int32_t Play() override;
121     int32_t Pause(bool isSystemOperation) override;
122     int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override;
123     int32_t Stop() override;
124     int32_t SetPlaybackSpeed(PlaybackRateMode mode) override;
125     int32_t SeekContinous(int32_t mSeconds, int64_t batchNo) override;
126     int32_t PauseDemuxer() override;
127     int32_t ResumeDemuxer() override;
128 
129 protected:
130     void HandleStateChange(int32_t newState) override;
131     void HandlePlaybackComplete(int32_t extra) override;
132     void HandleInterruptEvent(const Format &infoBody) override;
133     void HandleAudioDeviceChangeEvent(const Format &infoBody) override;
134     void HandleEos() override;
135     void StateEnter() override;
136     void StateExit() override;
137 };
138 
139 class PlayerServer::PausedState : public PlayerServer::BaseState {
140 public:
PausedState(PlayerServer & server)141     explicit PausedState(PlayerServer &server) : BaseState(server, "paused_state") {}
142     ~PausedState() = default;
143 
144     int32_t Play() override;
145     int32_t Pause(bool isSystemOperation) override;
146     int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override;
147     int32_t Stop() override;
148     int32_t SetPlaybackSpeed(PlaybackRateMode mode) override;
149     int32_t SeekContinous(int32_t mSeconds, int64_t batchNo) override;
150     int32_t SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode) override;
151 
152 protected:
153     void HandleStateChange(int32_t newState) override;
154     void HandleEos() override;
155 };
156 
157 class PlayerServer::StoppedState : public PlayerServer::BaseState {
158 public:
StoppedState(PlayerServer & server)159     explicit StoppedState(PlayerServer &server) : BaseState(server, "stopped_state") {}
160     ~StoppedState() = default;
161 
162     int32_t Prepare() override;
163     int32_t Stop() override;
164     void HandleStateChange(int32_t newState) override;
165     int32_t SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode) override;
166 };
167 
168 class PlayerServer::PlaybackCompletedState : public PlayerServer::BaseState {
169 public:
PlaybackCompletedState(PlayerServer & server)170     explicit PlaybackCompletedState(PlayerServer &server) : BaseState(server, "playbackCompleted_state") {}
171     ~PlaybackCompletedState() = default;
172 
173     int32_t Play() override;
174     int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override;
175     int32_t Stop() override;
176     int32_t SetPlaybackSpeed(PlaybackRateMode mode) override;
177     int32_t SeekContinous(int32_t mSeconds, int64_t batchNo) override;
178     int32_t SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode) override;
179     void StateEnter() override;
180 
181 protected:
182     void HandleStateChange(int32_t newState) override;
183 
184 private:
185     int64_t stateEnterTimeMs_ = 0;
186 };
187 }
188 }
189 #endif // PLAYER_SERVER_STATE_H
190