forked from fishpond-haiku/Haiku-Radio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
StreamIO.h
152 lines (142 loc) · 4.35 KB
/
StreamIO.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
* Copyright (C) 2017 Kai Niessen <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* File: StreamIO.h
* Author: Kai Niessen <[email protected]>
*
* Created on April 11, 2017, 10:21 PM
*/
#ifndef STREAMIO_H
#define STREAMIO_H
#include <MediaIO.h>
#include <Url.h>
#include <HttpRequest.h>
#include <UrlProtocolRoster.h>
#include <Handler.h>
#include <AdapterIO.h>
#include <Looper.h>
#define MSG_META_CHANGE 'META'
class Station;
class StreamIO;
typedef void (StreamIO::*DataFunc)(BUrlRequest* request,
const char* data,
off_t position, ssize_t size,
int next);
class DataFuncs {
public:
DataFuncs()
: fSize(10),
fLast(-1)
{
for (int i = 0; i < fSize; i++)
fFuncs[i] = NULL;
};
int Add(DataFunc f) {
fFuncs[++fLast] = f;
}
void Add(DataFunc f, int before) {
for (int i = fLast; i >= before; i--)
fFuncs[i+1] = fFuncs[i];
fFuncs[before] = f;
fLast++;
};
DataFunc Remove(int index) {
DataFunc result = fFuncs[index];
for (int i = index; i < fLast; i++)
fFuncs[i] = fFuncs[i + 1];
fFuncs[fLast--] = NULL;
};
DataFunc Item(int index) {
return fFuncs[index];
};
DataFunc First() {
return fFuncs[0];
};
private:
DataFunc fFuncs[10];
int fSize;
int fLast;
};
class StreamIO : public BAdapterIO, protected BUrlProtocolListener {
public:
StreamIO(Station* station,
BLooper* MetaListener = NULL);
virtual ~StreamIO();
virtual void GetFlags(int32* flags) const;
virtual ssize_t WriteAt(off_t position,
const void* buffer, size_t size);
virtual ssize_t ReadAt(off_t position, void* buffer,
size_t size);
virtual status_t SetSize(off_t size);
virtual status_t Open();
virtual bool IsRunning() const;
void SetLimiter(size_t limit = 0);
size_t Buffered();
protected:
virtual status_t SeekRequested(off_t position);
virtual void HeadersReceived(BUrlRequest* request,
const BUrlResult& result);
virtual void DataRedirectReceived(BUrlRequest* request,
const char* data,
off_t position, ssize_t size,
int next);
virtual void DataWithMetaReceived(BUrlRequest* request,
const char* data,
off_t position, ssize_t size,
int next);
virtual void DataUnsyncedReceived(BUrlRequest* request,
const char* data,
off_t position, ssize_t size,
int next);
virtual void DataSyncedReceived(BUrlRequest* request,
const char* data,
off_t position, ssize_t size,
int next);
virtual void DataReceived(BUrlRequest* request,
const char* data,
off_t position, ssize_t size);
virtual void RequestCompleted(BUrlRequest* request,
bool success);
void UpdateSize();
void ProcessMeta();
private:
DataFuncs fDataFuncs;
Station* fStation;
BInputAdapter* fInputAdapter;
BHttpRequest* fReq;
thread_id fReqThread;
off_t fPosition;
off_t fTotalSize;
bool fIsMutable;
size_t fMetaInt;
char fMetaBuffer[512];
size_t fMetaSize;
off_t fUntilMetaStart;
off_t fUntilMetaEnd;
bigtime_t fReqStartTime;
BLooper* fMetaListener;
BString fStreamTitle;
enum FrameSync {
none,
first,
done
};
FrameSync fFrameSync;
size_t fLimit;
size_t fBuffered;
};
#endif /* STREAMIO_H */