1/*
2 * Copyright 2015, Dario Casalinuovo. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include <SimpleMediaClient.h>
7
8#include <MediaDebug.h>
9
10
11BSimpleMediaClient::BSimpleMediaClient(const char* name,
12	media_type type, media_client_kinds kinds)
13	:
14	BMediaClient(name, type, kinds),
15	fNotifyHook(NULL),
16	fNotifyCookie(NULL)
17{
18	CALLED();
19}
20
21
22BSimpleMediaClient::~BSimpleMediaClient()
23{
24	CALLED();
25}
26
27
28BSimpleMediaInput*
29BSimpleMediaClient::BeginInput()
30{
31	CALLED();
32
33	BSimpleMediaInput* input = new BSimpleMediaInput();
34	RegisterInput(input);
35	return input;
36}
37
38
39BSimpleMediaOutput*
40BSimpleMediaClient::BeginOutput()
41{
42	CALLED();
43
44	BSimpleMediaOutput* output = new BSimpleMediaOutput();
45	RegisterOutput(output);
46	return output;
47}
48
49
50void
51BSimpleMediaClient::SetHook(notify_hook notifyHook, void* cookie)
52{
53	CALLED();
54
55	fNotifyHook = notifyHook;
56	fNotifyCookie = cookie;
57}
58
59
60void
61BSimpleMediaClient::HandleStart(bigtime_t performanceTime)
62{
63	if (fNotifyHook != NULL) {
64		(*fNotifyHook)(BSimpleMediaClient::fNotifyCookie,
65			BSimpleMediaClient::B_WILL_START,
66			performanceTime);
67	}
68}
69
70
71void
72BSimpleMediaClient::HandleStop(bigtime_t performanceTime)
73{
74	if (fNotifyHook != NULL) {
75		(*fNotifyHook)(BSimpleMediaClient::fNotifyCookie,
76			BSimpleMediaClient::B_WILL_STOP,
77			performanceTime);
78	}
79}
80
81
82void
83BSimpleMediaClient::HandleSeek(bigtime_t mediaTime, bigtime_t performanceTime)
84{
85	if (fNotifyHook != NULL) {
86		(*fNotifyHook)(BSimpleMediaClient::fNotifyCookie,
87			BSimpleMediaClient::B_WILL_SEEK,
88			performanceTime, mediaTime);
89	}
90}
91
92
93status_t
94BSimpleMediaClient::FormatSuggestion(media_type type, int32 quality,
95	media_format* format)
96{
97	if (fNotifyHook != NULL) {
98		status_t result = B_ERROR;
99		(*fNotifyHook)(BSimpleMediaClient::fNotifyCookie,
100			BSimpleMediaClient::B_FORMAT_SUGGESTION,
101			type, quality, format, &result);
102		return result;
103	}
104	return B_ERROR;
105}
106
107
108void BSimpleMediaClient::_ReservedSimpleMediaClient0() {}
109void BSimpleMediaClient::_ReservedSimpleMediaClient1() {}
110void BSimpleMediaClient::_ReservedSimpleMediaClient2() {}
111void BSimpleMediaClient::_ReservedSimpleMediaClient3() {}
112void BSimpleMediaClient::_ReservedSimpleMediaClient4() {}
113void BSimpleMediaClient::_ReservedSimpleMediaClient5() {}
114
115
116BSimpleMediaConnection::BSimpleMediaConnection(media_connection_kinds kinds)
117	:
118	BMediaConnection(kinds),
119	fProcessHook(NULL),
120	fNotifyHook(NULL),
121	fBufferCookie(NULL)
122{
123}
124
125
126BSimpleMediaConnection::~BSimpleMediaConnection()
127{
128	CALLED();
129}
130
131
132void
133BSimpleMediaConnection::SetHooks(process_hook processHook,
134	notify_hook notifyHook, void* cookie)
135{
136	CALLED();
137
138	fProcessHook = processHook;
139	fNotifyHook = notifyHook;
140	fBufferCookie = cookie;
141}
142
143
144void*
145BSimpleMediaConnection::Cookie() const
146{
147	CALLED();
148
149	return fBufferCookie;
150}
151
152
153size_t
154BSimpleMediaConnection::BufferSize() const
155{
156	return fBufferSize;
157}
158
159
160void
161BSimpleMediaConnection::SetBufferSize(size_t bufferSize)
162{
163	fBufferSize = bufferSize;
164}
165
166
167void
168BSimpleMediaConnection::SetAcceptedFormat(const media_format& format)
169{
170	CALLED();
171
172	fAcceptedFormat = format;
173}
174
175
176const media_format&
177BSimpleMediaConnection::AcceptedFormat() const
178{
179	CALLED();
180
181	return fAcceptedFormat;
182}
183
184
185BSimpleMediaInput::BSimpleMediaInput()
186	:
187	BMediaConnection(B_MEDIA_INPUT),
188	BSimpleMediaConnection(B_MEDIA_INPUT),
189	BMediaInput()
190{
191}
192
193
194BSimpleMediaInput::~BSimpleMediaInput()
195{
196	CALLED();
197}
198
199
200status_t
201BSimpleMediaInput::AcceptFormat(media_format* format)
202{
203	CALLED();
204
205	// TODO: Add hooks
206
207	if (format_is_compatible(*format, AcceptedFormat()))
208		return B_OK;
209
210	*format = AcceptedFormat();
211
212	return B_MEDIA_BAD_FORMAT;
213}
214
215
216void
217BSimpleMediaInput::Connected(const media_format& format)
218{
219	if (fNotifyHook != NULL)
220		(*fNotifyHook)(this, BSimpleMediaConnection::B_INPUT_CONNECTED);
221
222	SetAcceptedFormat(format);
223
224	BMediaInput::Connected(format);
225}
226
227
228void
229BSimpleMediaInput::Disconnected()
230{
231	if (fNotifyHook != NULL)
232		(*fNotifyHook)(this, BSimpleMediaConnection::B_INPUT_DISCONNECTED);
233
234	BMediaInput::Disconnected();
235}
236
237
238void
239BSimpleMediaInput::HandleBuffer(BBuffer* buffer)
240{
241	CALLED();
242
243	if (fProcessHook != NULL)
244		(*fProcessHook)(this, buffer);
245}
246
247
248BSimpleMediaOutput::BSimpleMediaOutput()
249	:
250	BMediaConnection(B_MEDIA_OUTPUT),
251	BSimpleMediaConnection(B_MEDIA_OUTPUT),
252	BMediaOutput()
253{
254}
255
256
257BSimpleMediaOutput::~BSimpleMediaOutput()
258{
259	CALLED();
260}
261
262
263status_t
264BSimpleMediaOutput::PrepareToConnect(media_format* format)
265{
266	// TODO: Add hooks
267
268	if (!format_is_compatible(AcceptedFormat(), *format))
269		return B_ERROR;
270
271	return B_OK;
272}
273
274
275status_t
276BSimpleMediaOutput::FormatProposal(media_format* format)
277{
278	if (fNotifyHook != NULL) {
279		return (*fNotifyHook)(this,
280			BSimpleMediaConnection::B_FORMAT_PROPOSAL, format);
281	} else
282		*format = AcceptedFormat();
283
284	return B_OK;
285}
286
287
288void
289BSimpleMediaOutput::Connected(const media_format& format)
290{
291	if (fNotifyHook != NULL)
292		(*fNotifyHook)(this, BSimpleMediaConnection::B_OUTPUT_CONNECTED);
293
294	SetAcceptedFormat(format);
295
296	BMediaOutput::Connected(format);
297}
298
299
300void
301BSimpleMediaOutput::Disconnected()
302{
303	if (fNotifyHook != NULL)
304		(*fNotifyHook)(this, BSimpleMediaConnection::B_OUTPUT_DISCONNECTED);
305
306	BMediaOutput::Disconnected();
307}
308