]> git.vomp.tv Git - vompclient.git/blob - player.h
New Windows remote stuff
[vompclient.git] / player.h
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #ifndef PLAYER_H
22 #define PLAYER_H
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #ifndef WIN32
27 #include <sys/time.h>
28 #endif
29 #include <time.h>
30
31 #include "audio.h"
32 #include "video.h"
33 #include "demuxervdr.h"
34 #include "vfeed.h"
35 #include "afeed.h"
36 #include "remote.h"
37 #include "vdr.h"
38 #include "callback.h"
39 #include "message.h"
40 #include "messagequeue.h"
41
42 #ifdef WIN32
43 #include "threadwin.h"
44 #else
45 #include "threadp.h"
46 #endif
47
48 class Player : public Thread_TYPE, public Callback
49 {
50   public:
51     Player(MessageQueue* messageQueue, void* messageReceiver, bool isRecording, bool isRadio);
52     virtual ~Player();
53
54     int init();
55     int shutdown();
56     void setStartFrame(ULONG frameNum);
57     void setLengthBytes(ULLONG length);
58     void setLengthFrames(ULONG length);
59
60     void play();
61     void stop();
62     void pause();
63     void fastForward();
64     void fastBackward();
65     void jumpToPercent(int percent);
66     void skipForward(int seconds);
67     void skipBackward(int seconds);
68
69     UCHAR getState() { return state; }
70     ULONG getCurrentFrameNum();
71     ULONG getLengthFrames();
72     UCHAR getIScanRate() { return ifactor; }
73
74     void call(void*); // for callback interface
75
76     const static UCHAR S_PLAY = 1;
77     const static UCHAR S_PAUSE_P = 2;
78     const static UCHAR S_PAUSE_I = 3;
79     const static UCHAR S_FFWD = 4;
80     const static UCHAR S_FBWD = 5;
81     const static UCHAR S_STOP = 6;
82     const static UCHAR S_JUMP = 7;
83
84     // Player events
85
86     // FIXME so far this just duplicates the old system + the wss
87
88     const static UCHAR CONNECTION_LOST = 1;
89     const static UCHAR STOP_PLAYBACK = 2;
90     const static UCHAR STREAM_END = 3;
91     const static UCHAR ASPECT43 = 4;
92     const static UCHAR ASPECT169 = 5;
93
94 #ifdef DEV
95     void test1();
96     void test2();
97 #endif
98
99   protected:
100     void threadMethod();
101     void threadPostStopCleanup();
102
103   private:
104     void switchState(UCHAR newState, ULONG jumpFrame=0);
105
106     void threadFeedLive();
107     void threadFeedPlay();
108     void threadFeedScan();
109
110     void doConnectionLost();
111     void restartAtFrame(ULONG newFrame);
112
113     MessageQueue* messageQueue;
114     void* messageReceiver;
115     Log* logger;
116     Audio* audio;
117     Video* video;
118     Demuxer* demuxer;
119     VDR* vdr;
120     VFeed vfeed;
121     AFeed afeed;
122
123     bool initted;
124     bool startup;
125     bool videoStartup;
126     bool isRecording;
127     bool isRadio;
128     bool preBuffering;
129
130 #ifndef WIN32
131     pthread_mutex_t mutex;
132 #else
133   HANDLE mutex;
134 #endif
135     void lock();
136     void unLock();
137
138     ULLONG lengthBytes;
139     ULONG lengthFrames;
140     ULONG currentFrameNumber;
141     UINT blockSize;
142     UINT startupBlockSize;
143     UINT preBufferSize;
144     UCHAR* threadBuffer;
145     UCHAR state;
146     UCHAR ifactor;
147 };
148
149 #endif
150
151
152 /*
153
154 Possible states:
155
156 Play, Pause, FFwd, FBwd, (Stop), [Jump]
157
158                     Possible  Working
159
160 Play   -> PauseP       *         *
161        -> PauseI
162        -> FFwd         *         *
163        -> FBwd         *         *
164        -> Stop         *         *
165        -> Jump         *         *
166
167 PauseP -> Play         *         *
168        -> PauseI
169        -> FFwd         *         *
170        -> FBwd         *         *
171        -> Stop         *         *
172        -> Jump         *         *
173
174 PauseI -> Play         *         *
175        -> PauseP
176        -> FFwd         *         *
177        -> FBwd         *         *
178        -> Stop         *         *
179        -> Jump         *         *
180
181 FFwd   -> Play         *         *
182        -> PauseP
183        -> PauseI       *         *
184        -> FBwd         *         *
185        -> Stop         *         *
186        -> Jump         *         *
187
188 FBwd   -> Play         *         *
189        -> PauseP
190        -> PauseI       *         *
191        -> FFwd         *         *
192        -> Stop         *         *
193        -> Jump         *         *
194
195 Stop   -> Play         *         *
196        -> PauseP
197        -> PauseI
198        -> FFwd
199        -> FBwd
200        -> Jump
201
202 Jump   -> Play
203        -> PauseP
204        -> PauseI
205        -> FFwd
206        -> FBwd
207        -> Stop
208
209 */