Move filepush from lib/base to lib/dvb
[openblackhole/openblackhole-enigma2.git] / lib / dvb / filepush.h
1 #ifndef __lib_base_filepush_h
2 #define __lib_base_filepush_h
3
4 #include <lib/base/thread.h>
5 #include <lib/base/ioprio.h>
6 #include <libsig_comp.h>
7 #include <lib/base/message.h>
8 #include <sys/types.h>
9 #include <lib/base/rawfile.h>
10
11 class iFilePushScatterGather
12 {
13 public:
14         virtual void getNextSourceSpan(off_t current_offset, size_t bytes_read, off_t &start, size_t &size, int blocksize)=0;
15         virtual ~iFilePushScatterGather() {}
16 };
17
18 class eFilePushThread: public eThread, public Object
19 {
20 public:
21         eFilePushThread(int blocksize, size_t buffersize);
22         ~eFilePushThread();
23         void thread();
24         void stop();
25         void start(ePtr<iTsSource> &source, int destfd);
26
27         void pause();
28         void resume();
29
30         void enablePVRCommit(int);
31         /* stream mode will wait on EOF until more data is available. */
32         void setStreamMode(int);
33         void setScatterGather(iFilePushScatterGather *);
34
35         enum { evtEOF, evtReadError, evtWriteError, evtUser, evtStopped };
36         Signal1<void,int> m_event;
37
38                 /* you can send private events if you want */
39         void sendEvent(int evt);
40 protected:
41         virtual void filterRecordData(const unsigned char *data, int len);
42 private:
43         iFilePushScatterGather *m_sg;
44         int m_stop;
45         int m_fd_dest;
46         int m_send_pvr_commit;
47         int m_stream_mode;
48         int m_blocksize;
49         size_t m_buffersize;
50         unsigned char* m_buffer;
51         off_t m_current_position;
52
53         ePtr<iTsSource> m_source;
54
55         eFixedMessagePump<int> m_messagepump;
56         eSingleLock m_run_mutex;
57         eCondition m_run_cond;
58         int m_run_state;
59
60         void recvEvent(const int &evt);
61 };
62
63 class eFilePushThreadRecorder: public eThread, public Object
64 {
65 public:
66         eFilePushThreadRecorder(unsigned char* buffer, size_t buffersize);
67         void thread();
68         void stop();
69         void start(int sourcefd);
70
71         enum { evtEOF, evtReadError, evtWriteError, evtUser, evtStopped };
72         Signal1<void,int> m_event;
73
74         void sendEvent(int evt);
75 protected:
76         // This method should write the data out and return the number of bytes written.
77         // If result <0, set 'errno'. The simplest implementation is just "::write(m_buffer, ...)"
78         // The method may freely modify m_buffer and m_buffersize
79         virtual int writeData(int len) = 0;
80         // Called when terminating the recording thread. Allows to clean up memory and
81         // flush buffers, terminate outstanding IO requests.
82         virtual void flush() = 0;
83
84         int m_fd_source;
85         size_t m_buffersize;
86         unsigned char* m_buffer;
87         unsigned int m_overflow_count;
88 private:
89         int m_stop;
90         eFixedMessagePump<int> m_messagepump;
91         void recvEvent(const int &evt);
92 };
93
94 #endif