xref: /haiku/src/kits/media/BufferProducer.cpp (revision 52a380120846174213ccce9c4aab0dda17c72083)
1*52a38012Sejakowatz /***********************************************************************
2*52a38012Sejakowatz  * AUTHOR: Marcus Overhagen
3*52a38012Sejakowatz  *   FILE: BufferProducer.cpp
4*52a38012Sejakowatz  *  DESCR:
5*52a38012Sejakowatz  ***********************************************************************/
6*52a38012Sejakowatz #include <BufferProducer.h>
7*52a38012Sejakowatz #include <BufferGroup.h>
8*52a38012Sejakowatz #include <Buffer.h>
9*52a38012Sejakowatz #include "PortPool.h"
10*52a38012Sejakowatz #include "debug.h"
11*52a38012Sejakowatz #include "../server/headers/ServerInterface.h"
12*52a38012Sejakowatz 
13*52a38012Sejakowatz /*************************************************************
14*52a38012Sejakowatz  * protected BBufferProducer
15*52a38012Sejakowatz  *************************************************************/
16*52a38012Sejakowatz 
17*52a38012Sejakowatz BBufferProducer::~BBufferProducer()
18*52a38012Sejakowatz {
19*52a38012Sejakowatz 	CALLED();
20*52a38012Sejakowatz }
21*52a38012Sejakowatz 
22*52a38012Sejakowatz /*************************************************************
23*52a38012Sejakowatz  * public BBufferProducer
24*52a38012Sejakowatz  *************************************************************/
25*52a38012Sejakowatz 
26*52a38012Sejakowatz /* static */ status_t
27*52a38012Sejakowatz BBufferProducer::ClipDataToRegion(int32 format,
28*52a38012Sejakowatz 								  int32 size,
29*52a38012Sejakowatz 								  const void *data,
30*52a38012Sejakowatz 								  BRegion *region)
31*52a38012Sejakowatz {
32*52a38012Sejakowatz 	CALLED();
33*52a38012Sejakowatz 
34*52a38012Sejakowatz 	if (format != B_CLIP_SHORT_RUNS)
35*52a38012Sejakowatz 		return B_MEDIA_BAD_CLIP_FORMAT;
36*52a38012Sejakowatz 
37*52a38012Sejakowatz 	return clip_shorts_to_region((const int16 *)data, size / sizeof(int16), region);
38*52a38012Sejakowatz }
39*52a38012Sejakowatz 
40*52a38012Sejakowatz media_type
41*52a38012Sejakowatz BBufferProducer::ProducerType()
42*52a38012Sejakowatz {
43*52a38012Sejakowatz 	CALLED();
44*52a38012Sejakowatz 	return fProducerType;
45*52a38012Sejakowatz }
46*52a38012Sejakowatz 
47*52a38012Sejakowatz /*************************************************************
48*52a38012Sejakowatz  * protected BBufferProducer
49*52a38012Sejakowatz  *************************************************************/
50*52a38012Sejakowatz 
51*52a38012Sejakowatz /* explicit */
52*52a38012Sejakowatz BBufferProducer::BBufferProducer(media_type producer_type) :
53*52a38012Sejakowatz 	BMediaNode("called by BBufferProducer"),
54*52a38012Sejakowatz 	fProducerType(producer_type),
55*52a38012Sejakowatz 	fInitialLatency(0),
56*52a38012Sejakowatz 	fInitialFlags(0)
57*52a38012Sejakowatz {
58*52a38012Sejakowatz 	CALLED();
59*52a38012Sejakowatz 
60*52a38012Sejakowatz 	AddNodeKind(B_BUFFER_PRODUCER);
61*52a38012Sejakowatz }
62*52a38012Sejakowatz 
63*52a38012Sejakowatz 
64*52a38012Sejakowatz status_t
65*52a38012Sejakowatz BBufferProducer::VideoClippingChanged(const media_source &for_source,
66*52a38012Sejakowatz 									  int16 num_shorts,
67*52a38012Sejakowatz 									  int16 *clip_data,
68*52a38012Sejakowatz 									  const media_video_display_info &display,
69*52a38012Sejakowatz 									  int32 *_deprecated_)
70*52a38012Sejakowatz {
71*52a38012Sejakowatz 	CALLED();
72*52a38012Sejakowatz 	// may be implemented by derived classes
73*52a38012Sejakowatz 	return B_ERROR;
74*52a38012Sejakowatz }
75*52a38012Sejakowatz 
76*52a38012Sejakowatz 
77*52a38012Sejakowatz status_t
78*52a38012Sejakowatz BBufferProducer::GetLatency(bigtime_t *out_lantency)
79*52a38012Sejakowatz {
80*52a38012Sejakowatz 	UNIMPLEMENTED();
81*52a38012Sejakowatz 
82*52a38012Sejakowatz 	// XXX The default implementation of GetLatency() finds the maximum
83*52a38012Sejakowatz 	// latency of your currently-available outputs by iterating over
84*52a38012Sejakowatz 	// them, and returns that value in outLatency
85*52a38012Sejakowatz 
86*52a38012Sejakowatz 	return B_ERROR;
87*52a38012Sejakowatz }
88*52a38012Sejakowatz 
89*52a38012Sejakowatz 
90*52a38012Sejakowatz status_t
91*52a38012Sejakowatz BBufferProducer::SetPlayRate(int32 numer,
92*52a38012Sejakowatz 							 int32 denom)
93*52a38012Sejakowatz {
94*52a38012Sejakowatz 	CALLED();
95*52a38012Sejakowatz 	// may be implemented by derived classes
96*52a38012Sejakowatz 	return B_ERROR;
97*52a38012Sejakowatz }
98*52a38012Sejakowatz 
99*52a38012Sejakowatz 
100*52a38012Sejakowatz status_t
101*52a38012Sejakowatz BBufferProducer::HandleMessage(int32 message,
102*52a38012Sejakowatz 							   const void *rawdata,
103*52a38012Sejakowatz 							   size_t size)
104*52a38012Sejakowatz {
105*52a38012Sejakowatz 	CALLED();
106*52a38012Sejakowatz 	switch (message) {
107*52a38012Sejakowatz 
108*52a38012Sejakowatz 		case PRODUCER_FORMAT_SUGGESTION_REQUESTED:
109*52a38012Sejakowatz 		{
110*52a38012Sejakowatz 			const xfer_producer_format_suggestion_requested *data = (const xfer_producer_format_suggestion_requested *)rawdata;
111*52a38012Sejakowatz 			xfer_producer_format_suggestion_requested_reply reply;
112*52a38012Sejakowatz 			reply.result = FormatSuggestionRequested(data->type, data->quality, &reply.format);
113*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
114*52a38012Sejakowatz 			return B_OK;
115*52a38012Sejakowatz 		}
116*52a38012Sejakowatz 
117*52a38012Sejakowatz 		case PRODUCER_FORMAT_PROPOSAL:
118*52a38012Sejakowatz 		{
119*52a38012Sejakowatz 			const xfer_producer_format_proposal *data = (const xfer_producer_format_proposal *)rawdata;
120*52a38012Sejakowatz 			xfer_producer_format_proposal_reply reply;
121*52a38012Sejakowatz 			reply.result = FormatProposal(data->output, (media_format *)&data->format);
122*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
123*52a38012Sejakowatz 			return B_OK;
124*52a38012Sejakowatz 		}
125*52a38012Sejakowatz 
126*52a38012Sejakowatz 		case PRODUCER_PREPARE_TO_CONNECT:
127*52a38012Sejakowatz 		{
128*52a38012Sejakowatz 			const xfer_producer_prepare_to_connect *data = (const xfer_producer_prepare_to_connect *)rawdata;
129*52a38012Sejakowatz 			xfer_producer_prepare_to_connect_reply reply;
130*52a38012Sejakowatz 			reply.format = data->format;
131*52a38012Sejakowatz 			reply.name[0] = 0;
132*52a38012Sejakowatz 			reply.result = PrepareToConnect(data->source, data->destination, &reply.format, &reply.out_source, reply.name);
133*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
134*52a38012Sejakowatz 			return B_OK;
135*52a38012Sejakowatz 		}
136*52a38012Sejakowatz 
137*52a38012Sejakowatz 		case PRODUCER_CONNECT:
138*52a38012Sejakowatz 		{
139*52a38012Sejakowatz 			const xfer_producer_connect *data = (const xfer_producer_connect *)rawdata;
140*52a38012Sejakowatz 			xfer_producer_connect_reply reply;
141*52a38012Sejakowatz 			memcpy(reply.name, data->name, B_MEDIA_NAME_LENGTH);
142*52a38012Sejakowatz 			Connect(data->error, data->source, data->destination, data->format, reply.name);
143*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
144*52a38012Sejakowatz 			return B_OK;
145*52a38012Sejakowatz 		}
146*52a38012Sejakowatz 
147*52a38012Sejakowatz 		case PRODUCER_DISCONNECT:
148*52a38012Sejakowatz 		{
149*52a38012Sejakowatz 			const xfer_producer_disconnect *data = (const xfer_producer_disconnect *)rawdata;
150*52a38012Sejakowatz 			Disconnect(data->source, data->destination);
151*52a38012Sejakowatz 			return B_OK;
152*52a38012Sejakowatz 		}
153*52a38012Sejakowatz 
154*52a38012Sejakowatz 		case PRODUCER_GET_INITIAL_LATENCY:
155*52a38012Sejakowatz 		{
156*52a38012Sejakowatz 			const xfer_producer_get_initial_latency *data = (const xfer_producer_get_initial_latency *)rawdata;
157*52a38012Sejakowatz 			xfer_producer_get_initial_latency_reply reply;
158*52a38012Sejakowatz 			reply.initial_latency = fInitialLatency;
159*52a38012Sejakowatz 			reply.flags = fInitialFlags;
160*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
161*52a38012Sejakowatz 			return B_OK;
162*52a38012Sejakowatz 		}
163*52a38012Sejakowatz 
164*52a38012Sejakowatz 		case PRODUCER_SET_PLAY_RATE:
165*52a38012Sejakowatz 		{
166*52a38012Sejakowatz 			const xfer_producer_set_play_rate *data = (const xfer_producer_set_play_rate *)rawdata;
167*52a38012Sejakowatz 			xfer_producer_set_play_rate_reply reply;
168*52a38012Sejakowatz 			reply.result = SetPlayRate(data->numer, data->denom);
169*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
170*52a38012Sejakowatz 			return B_OK;
171*52a38012Sejakowatz 		}
172*52a38012Sejakowatz 
173*52a38012Sejakowatz 		case PRODUCER_GET_LATENCY:
174*52a38012Sejakowatz 		{
175*52a38012Sejakowatz 			const xfer_producer_get_latency *data = (const xfer_producer_get_latency *)rawdata;
176*52a38012Sejakowatz 			xfer_producer_get_latency_reply reply;
177*52a38012Sejakowatz 			reply.result = GetLatency(&reply.latency);
178*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
179*52a38012Sejakowatz 			return B_OK;
180*52a38012Sejakowatz 		}
181*52a38012Sejakowatz 
182*52a38012Sejakowatz 		case PRODUCER_GET_NEXT_OUTPUT:
183*52a38012Sejakowatz 		{
184*52a38012Sejakowatz 			const xfer_producer_get_next_output *data = (const xfer_producer_get_next_output *)rawdata;
185*52a38012Sejakowatz 			xfer_producer_get_next_output_reply reply;
186*52a38012Sejakowatz 			reply.cookie = data->cookie;
187*52a38012Sejakowatz 			reply.result = GetNextOutput(&reply.cookie, &reply.output);
188*52a38012Sejakowatz 			write_port(data->reply_port, 0, &reply, sizeof(reply));
189*52a38012Sejakowatz 			return B_OK;
190*52a38012Sejakowatz 		}
191*52a38012Sejakowatz 
192*52a38012Sejakowatz 		case PRODUCER_DISPOSE_OUTPUT_COOKIE:
193*52a38012Sejakowatz 		{
194*52a38012Sejakowatz 			const xfer_producer_dispose_output_cookie *data = (const xfer_producer_dispose_output_cookie *)rawdata;
195*52a38012Sejakowatz 			DisposeOutputCookie(data->cookie);
196*52a38012Sejakowatz 			return B_OK;
197*52a38012Sejakowatz 		}
198*52a38012Sejakowatz 
199*52a38012Sejakowatz 		case PRODUCER_SET_BUFFER_GROUP:
200*52a38012Sejakowatz 		{
201*52a38012Sejakowatz 			const xfer_producer_set_buffer_group *data = (const xfer_producer_set_buffer_group *)rawdata;
202*52a38012Sejakowatz 			xfer_node_request_completed reply;
203*52a38012Sejakowatz 			BBufferGroup *group;
204*52a38012Sejakowatz 			status_t rv;
205*52a38012Sejakowatz 			group = data->buffer_count != 0 ? new BBufferGroup(data->buffer_count, data->buffers) : NULL;
206*52a38012Sejakowatz 			rv = SetBufferGroup(data->source, group);
207*52a38012Sejakowatz 			if (data->destination == media_destination::null)
208*52a38012Sejakowatz 				return B_OK;
209*52a38012Sejakowatz 			reply.info.what = media_request_info::B_SET_OUTPUT_BUFFERS_FOR;
210*52a38012Sejakowatz 			reply.info.change_tag = data->change_tag;
211*52a38012Sejakowatz 			reply.info.status = rv;
212*52a38012Sejakowatz 			reply.info.cookie = (int32)group;
213*52a38012Sejakowatz 			reply.info.user_data = data->user_data;
214*52a38012Sejakowatz 			reply.info.source = data->source;
215*52a38012Sejakowatz 			reply.info.destination = data->destination;
216*52a38012Sejakowatz 			write_port(data->destination.port, NODE_REQUEST_COMPLETED, &reply, sizeof(reply));
217*52a38012Sejakowatz 			return B_OK;
218*52a38012Sejakowatz 		}
219*52a38012Sejakowatz 
220*52a38012Sejakowatz 		case PRODUCER_FORMAT_CHANGE_REQUESTED:
221*52a38012Sejakowatz 		{
222*52a38012Sejakowatz 			const xfer_producer_format_change_requested *data = (const xfer_producer_format_change_requested *)rawdata;
223*52a38012Sejakowatz 			xfer_node_request_completed reply;
224*52a38012Sejakowatz 			status_t rv;
225*52a38012Sejakowatz 			reply.info.format = data->format;
226*52a38012Sejakowatz 			rv = FormatChangeRequested(data->source, data->destination, &reply.info.format, NULL);
227*52a38012Sejakowatz 			if (data->destination == media_destination::null)
228*52a38012Sejakowatz 				return B_OK;
229*52a38012Sejakowatz 			reply.info.what = media_request_info::B_REQUEST_FORMAT_CHANGE;
230*52a38012Sejakowatz 			reply.info.change_tag = data->change_tag;
231*52a38012Sejakowatz 			reply.info.status = rv;
232*52a38012Sejakowatz 			//reply.info.cookie
233*52a38012Sejakowatz 			reply.info.user_data = data->user_data;
234*52a38012Sejakowatz 			reply.info.source = data->source;
235*52a38012Sejakowatz 			reply.info.destination = data->destination;
236*52a38012Sejakowatz 			write_port(data->destination.port, NODE_REQUEST_COMPLETED, &reply, sizeof(reply));
237*52a38012Sejakowatz 			return B_OK;
238*52a38012Sejakowatz 		}
239*52a38012Sejakowatz 
240*52a38012Sejakowatz 
241*52a38012Sejakowatz 		case PRODUCER_VIDEO_CLIPPING_CHANGED:
242*52a38012Sejakowatz 		{
243*52a38012Sejakowatz 			const xfer_producer_video_clipping_changed *data = (const xfer_producer_video_clipping_changed *)rawdata;
244*52a38012Sejakowatz 			xfer_node_request_completed reply;
245*52a38012Sejakowatz 			status_t rv;
246*52a38012Sejakowatz 			rv = VideoClippingChanged(data->source, data->short_count, (int16 *)data->shorts, data->display, NULL);
247*52a38012Sejakowatz 			if (data->destination == media_destination::null)
248*52a38012Sejakowatz 				return B_OK;
249*52a38012Sejakowatz 			reply.info.what = media_request_info::B_SET_VIDEO_CLIPPING_FOR;
250*52a38012Sejakowatz 			reply.info.change_tag = data->change_tag;
251*52a38012Sejakowatz 			reply.info.status = rv;
252*52a38012Sejakowatz 			//reply.info.cookie
253*52a38012Sejakowatz 			reply.info.user_data = data->user_data;
254*52a38012Sejakowatz 			reply.info.source = data->source;
255*52a38012Sejakowatz 			reply.info.destination = data->destination;
256*52a38012Sejakowatz 			reply.info.format.type = B_MEDIA_RAW_VIDEO;
257*52a38012Sejakowatz 			reply.info.format.u.raw_video.display = data->display;
258*52a38012Sejakowatz 			write_port(data->destination.port, NODE_REQUEST_COMPLETED, &reply, sizeof(reply));
259*52a38012Sejakowatz 			return B_OK;
260*52a38012Sejakowatz 		}
261*52a38012Sejakowatz 
262*52a38012Sejakowatz 		case PRODUCER_ADDITIONAL_BUFFER_REQUESTED:
263*52a38012Sejakowatz 		{
264*52a38012Sejakowatz 			const xfer_producer_additional_buffer_requested *data = (const xfer_producer_additional_buffer_requested *)rawdata;
265*52a38012Sejakowatz 			AdditionalBufferRequested(data->source, data->prev_buffer, data->prev_time, data->has_seek_tag ? &data->prev_tag : NULL);
266*52a38012Sejakowatz 			return B_OK;
267*52a38012Sejakowatz 		}
268*52a38012Sejakowatz 
269*52a38012Sejakowatz 		case PRODUCER_LATENCY_CHANGED:
270*52a38012Sejakowatz 		{
271*52a38012Sejakowatz 			const xfer_producer_latency_changed *data = (const xfer_producer_latency_changed *)rawdata;
272*52a38012Sejakowatz 			LatencyChanged(data->source, data->destination, data->latency, data->flags);
273*52a38012Sejakowatz 			return B_OK;
274*52a38012Sejakowatz 		}
275*52a38012Sejakowatz 
276*52a38012Sejakowatz 		case PRODUCER_LATE_NOTICE_RECEIVED:
277*52a38012Sejakowatz 		{
278*52a38012Sejakowatz 			const xfer_producer_late_notice_received *data = (const xfer_producer_late_notice_received *)rawdata;
279*52a38012Sejakowatz 			LateNoticeReceived(data->source, data->how_much, data->performance_time);
280*52a38012Sejakowatz 			return B_OK;
281*52a38012Sejakowatz 		}
282*52a38012Sejakowatz 
283*52a38012Sejakowatz 		case PRODUCER_ENABLE_OUTPUT:
284*52a38012Sejakowatz 		{
285*52a38012Sejakowatz 			const xfer_producer_enable_output *data = (const xfer_producer_enable_output *)rawdata;
286*52a38012Sejakowatz 			xfer_node_request_completed reply;
287*52a38012Sejakowatz 			EnableOutput(data->source, data->enabled, NULL);
288*52a38012Sejakowatz 			if (data->destination == media_destination::null)
289*52a38012Sejakowatz 				return B_OK;
290*52a38012Sejakowatz 			reply.info.what = media_request_info::B_SET_OUTPUT_ENABLED;
291*52a38012Sejakowatz 			reply.info.change_tag = data->change_tag;
292*52a38012Sejakowatz 			reply.info.status = B_OK;
293*52a38012Sejakowatz 			//reply.info.cookie
294*52a38012Sejakowatz 			reply.info.user_data = data->user_data;
295*52a38012Sejakowatz 			reply.info.source = data->source;
296*52a38012Sejakowatz 			reply.info.destination = data->destination;
297*52a38012Sejakowatz 			//reply.info.format
298*52a38012Sejakowatz 			write_port(data->destination.port, NODE_REQUEST_COMPLETED, &reply, sizeof(reply));
299*52a38012Sejakowatz 			return B_OK;
300*52a38012Sejakowatz 		}
301*52a38012Sejakowatz 
302*52a38012Sejakowatz 	};
303*52a38012Sejakowatz 	return B_ERROR;
304*52a38012Sejakowatz }
305*52a38012Sejakowatz 
306*52a38012Sejakowatz 
307*52a38012Sejakowatz void
308*52a38012Sejakowatz BBufferProducer::AdditionalBufferRequested(const media_source &source,
309*52a38012Sejakowatz 										   media_buffer_id prev_buffer,
310*52a38012Sejakowatz 										   bigtime_t prev_time,
311*52a38012Sejakowatz 										   const media_seek_tag *prev_tag)
312*52a38012Sejakowatz {
313*52a38012Sejakowatz 	CALLED();
314*52a38012Sejakowatz 	// may be implemented by derived classes
315*52a38012Sejakowatz }
316*52a38012Sejakowatz 
317*52a38012Sejakowatz 
318*52a38012Sejakowatz void
319*52a38012Sejakowatz BBufferProducer::LatencyChanged(const media_source &source,
320*52a38012Sejakowatz 								const media_destination &destination,
321*52a38012Sejakowatz 								bigtime_t new_latency,
322*52a38012Sejakowatz 								uint32 flags)
323*52a38012Sejakowatz {
324*52a38012Sejakowatz 	CALLED();
325*52a38012Sejakowatz 	// may be implemented by derived classes
326*52a38012Sejakowatz }
327*52a38012Sejakowatz 
328*52a38012Sejakowatz 
329*52a38012Sejakowatz status_t
330*52a38012Sejakowatz BBufferProducer::SendBuffer(BBuffer *buffer,
331*52a38012Sejakowatz 							const media_destination &destination)
332*52a38012Sejakowatz {
333*52a38012Sejakowatz 	CALLED();
334*52a38012Sejakowatz 	if (destination == media_destination::null)
335*52a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
336*52a38012Sejakowatz 	if (buffer == NULL)
337*52a38012Sejakowatz 		return B_BAD_VALUE;
338*52a38012Sejakowatz 
339*52a38012Sejakowatz 	xfer_consumer_buffer_received data;
340*52a38012Sejakowatz 	data.buffer = buffer->ID();
341*52a38012Sejakowatz 	data.header = *(buffer->Header());
342*52a38012Sejakowatz 	data.header.buffer = data.buffer;
343*52a38012Sejakowatz 	data.header.destination = destination.id;
344*52a38012Sejakowatz 
345*52a38012Sejakowatz 	return write_port(destination.port, CONSUMER_BUFFER_RECEIVED, &data, sizeof(data));
346*52a38012Sejakowatz }
347*52a38012Sejakowatz 
348*52a38012Sejakowatz 
349*52a38012Sejakowatz status_t
350*52a38012Sejakowatz BBufferProducer::SendDataStatus(int32 status,
351*52a38012Sejakowatz 								const media_destination &destination,
352*52a38012Sejakowatz 								bigtime_t at_time)
353*52a38012Sejakowatz {
354*52a38012Sejakowatz 	CALLED();
355*52a38012Sejakowatz 	if (destination == media_destination::null)
356*52a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
357*52a38012Sejakowatz 
358*52a38012Sejakowatz 	xfer_consumer_producer_data_status data;
359*52a38012Sejakowatz 	data.for_whom = destination;
360*52a38012Sejakowatz 	data.status = status;
361*52a38012Sejakowatz 	data.at_performance_time = at_time;
362*52a38012Sejakowatz 
363*52a38012Sejakowatz 	return write_port(destination.port, CONSUMER_PRODUCER_DATA_STATUS, &data, sizeof(data));
364*52a38012Sejakowatz }
365*52a38012Sejakowatz 
366*52a38012Sejakowatz 
367*52a38012Sejakowatz status_t
368*52a38012Sejakowatz BBufferProducer::ProposeFormatChange(media_format *format,
369*52a38012Sejakowatz 									 const media_destination &for_destination)
370*52a38012Sejakowatz {
371*52a38012Sejakowatz 	CALLED();
372*52a38012Sejakowatz 	if (for_destination == media_destination::null)
373*52a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
374*52a38012Sejakowatz 
375*52a38012Sejakowatz 	status_t rv;
376*52a38012Sejakowatz 	int32 code;
377*52a38012Sejakowatz 	xfer_consumer_accept_format data;
378*52a38012Sejakowatz 	xfer_consumer_accept_format_reply reply;
379*52a38012Sejakowatz 
380*52a38012Sejakowatz 	data.dest = for_destination;
381*52a38012Sejakowatz 	data.format = *format;
382*52a38012Sejakowatz 	data.reply_port = _PortPool->GetPort();
383*52a38012Sejakowatz 
384*52a38012Sejakowatz 	rv = write_port(for_destination.port, CONSUMER_ACCEPT_FORMAT, &data, sizeof(data));
385*52a38012Sejakowatz 	if (rv != B_OK) {
386*52a38012Sejakowatz 		_PortPool->PutPort(data.reply_port);
387*52a38012Sejakowatz 		return rv;
388*52a38012Sejakowatz 	}
389*52a38012Sejakowatz 
390*52a38012Sejakowatz 	rv = read_port(data.reply_port, &code, &reply, sizeof(reply));
391*52a38012Sejakowatz 	_PortPool->PutPort(data.reply_port);
392*52a38012Sejakowatz 	if (rv < B_OK)
393*52a38012Sejakowatz 		return rv;
394*52a38012Sejakowatz 
395*52a38012Sejakowatz 	*format = reply.format;
396*52a38012Sejakowatz 
397*52a38012Sejakowatz 	return reply.result;
398*52a38012Sejakowatz }
399*52a38012Sejakowatz 
400*52a38012Sejakowatz 
401*52a38012Sejakowatz status_t
402*52a38012Sejakowatz BBufferProducer::ChangeFormat(const media_source &for_source,
403*52a38012Sejakowatz 							  const media_destination &for_destination,
404*52a38012Sejakowatz 							  media_format *format)
405*52a38012Sejakowatz {
406*52a38012Sejakowatz 	CALLED();
407*52a38012Sejakowatz 	if (for_source == media_source::null)
408*52a38012Sejakowatz 		return B_MEDIA_BAD_SOURCE;
409*52a38012Sejakowatz 	if (for_destination == media_destination::null)
410*52a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
411*52a38012Sejakowatz 
412*52a38012Sejakowatz 	status_t rv;
413*52a38012Sejakowatz 	int32 code;
414*52a38012Sejakowatz 	xfer_consumer_format_changed data;
415*52a38012Sejakowatz 	xfer_consumer_format_changed_reply reply;
416*52a38012Sejakowatz 
417*52a38012Sejakowatz 	data.producer = for_source;
418*52a38012Sejakowatz 	data.consumer = for_destination;
419*52a38012Sejakowatz 	data.format = *format;
420*52a38012Sejakowatz 	data.reply_port = _PortPool->GetPort();
421*52a38012Sejakowatz 
422*52a38012Sejakowatz 	rv = write_port(for_destination.port, CONSUMER_FORMAT_CHANGED, &data, sizeof(data));
423*52a38012Sejakowatz 	if (rv != B_OK) {
424*52a38012Sejakowatz 		_PortPool->PutPort(data.reply_port);
425*52a38012Sejakowatz 		return rv;
426*52a38012Sejakowatz 	}
427*52a38012Sejakowatz 
428*52a38012Sejakowatz 	rv = read_port(data.reply_port, &code, &reply, sizeof(reply));
429*52a38012Sejakowatz 	_PortPool->PutPort(data.reply_port);
430*52a38012Sejakowatz 	if (rv < B_OK)
431*52a38012Sejakowatz 		return rv;
432*52a38012Sejakowatz 
433*52a38012Sejakowatz 	return reply.result;
434*52a38012Sejakowatz }
435*52a38012Sejakowatz 
436*52a38012Sejakowatz 
437*52a38012Sejakowatz status_t
438*52a38012Sejakowatz BBufferProducer::FindLatencyFor(const media_destination &for_destination,
439*52a38012Sejakowatz 								bigtime_t *out_latency,
440*52a38012Sejakowatz 								media_node_id *out_timesource)
441*52a38012Sejakowatz {
442*52a38012Sejakowatz 	CALLED();
443*52a38012Sejakowatz 	if (for_destination == media_destination::null)
444*52a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
445*52a38012Sejakowatz 
446*52a38012Sejakowatz 	status_t rv;
447*52a38012Sejakowatz 	int32 code;
448*52a38012Sejakowatz 	xfer_consumer_get_latency_for data;
449*52a38012Sejakowatz 	xfer_consumer_get_latency_for_reply reply;
450*52a38012Sejakowatz 
451*52a38012Sejakowatz 	data.for_whom = for_destination;
452*52a38012Sejakowatz 	data.reply_port = _PortPool->GetPort();
453*52a38012Sejakowatz 
454*52a38012Sejakowatz 	rv = write_port(for_destination.port, CONSUMER_GET_LATENCY_FOR, &data, sizeof(data));
455*52a38012Sejakowatz 	if (rv != B_OK) {
456*52a38012Sejakowatz 		_PortPool->PutPort(data.reply_port);
457*52a38012Sejakowatz 		return rv;
458*52a38012Sejakowatz 	}
459*52a38012Sejakowatz 
460*52a38012Sejakowatz 	rv = read_port(data.reply_port, &code, &reply, sizeof(reply));
461*52a38012Sejakowatz 	_PortPool->PutPort(data.reply_port);
462*52a38012Sejakowatz 	if (rv < B_OK)
463*52a38012Sejakowatz 		return rv;
464*52a38012Sejakowatz 
465*52a38012Sejakowatz 	*out_latency = reply.latency;
466*52a38012Sejakowatz 	*out_timesource = reply.timesource;
467*52a38012Sejakowatz 
468*52a38012Sejakowatz 	return reply.result;
469*52a38012Sejakowatz }
470*52a38012Sejakowatz 
471*52a38012Sejakowatz 
472*52a38012Sejakowatz status_t
473*52a38012Sejakowatz BBufferProducer::FindSeekTag(const media_destination &for_destination,
474*52a38012Sejakowatz 							 bigtime_t in_target_time,
475*52a38012Sejakowatz 							 media_seek_tag *out_tag,
476*52a38012Sejakowatz 							 bigtime_t *out_tagged_time,
477*52a38012Sejakowatz 							 uint32 *out_flags,
478*52a38012Sejakowatz 							 uint32 in_flags)
479*52a38012Sejakowatz {
480*52a38012Sejakowatz 	CALLED();
481*52a38012Sejakowatz 	if (for_destination == media_destination::null)
482*52a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
483*52a38012Sejakowatz 
484*52a38012Sejakowatz 	status_t rv;
485*52a38012Sejakowatz 	int32 code;
486*52a38012Sejakowatz 	xfer_consumer_seek_tag_requested data;
487*52a38012Sejakowatz 	xfer_consumer_seek_tag_requested_reply reply;
488*52a38012Sejakowatz 
489*52a38012Sejakowatz 	data.destination = for_destination;
490*52a38012Sejakowatz 	data.target_time = in_target_time;
491*52a38012Sejakowatz 	data.flags = in_flags;
492*52a38012Sejakowatz 	data.reply_port = _PortPool->GetPort();
493*52a38012Sejakowatz 
494*52a38012Sejakowatz 	rv = write_port(for_destination.port, CONSUMER_SEEK_TAG_REQUESTED, &data, sizeof(data));
495*52a38012Sejakowatz 	if (rv != B_OK) {
496*52a38012Sejakowatz 		_PortPool->PutPort(data.reply_port);
497*52a38012Sejakowatz 		return rv;
498*52a38012Sejakowatz 	}
499*52a38012Sejakowatz 
500*52a38012Sejakowatz 	rv = read_port(data.reply_port, &code, &reply, sizeof(reply));
501*52a38012Sejakowatz 	_PortPool->PutPort(data.reply_port);
502*52a38012Sejakowatz 	if (rv < B_OK)
503*52a38012Sejakowatz 		return rv;
504*52a38012Sejakowatz 
505*52a38012Sejakowatz 	*out_tag = reply.seek_tag;
506*52a38012Sejakowatz 	*out_tagged_time = reply.tagged_time;
507*52a38012Sejakowatz 	*out_flags = reply.flags;
508*52a38012Sejakowatz 
509*52a38012Sejakowatz 	return reply.result;
510*52a38012Sejakowatz }
511*52a38012Sejakowatz 
512*52a38012Sejakowatz 
513*52a38012Sejakowatz void
514*52a38012Sejakowatz BBufferProducer::SetInitialLatency(bigtime_t inInitialLatency,
515*52a38012Sejakowatz 								   uint32 flags)
516*52a38012Sejakowatz {
517*52a38012Sejakowatz 	fInitialLatency = inInitialLatency;
518*52a38012Sejakowatz 	fInitialFlags = flags;
519*52a38012Sejakowatz }
520*52a38012Sejakowatz 
521*52a38012Sejakowatz /*************************************************************
522*52a38012Sejakowatz  * private BBufferProducer
523*52a38012Sejakowatz  *************************************************************/
524*52a38012Sejakowatz 
525*52a38012Sejakowatz /*
526*52a38012Sejakowatz private unimplemented
527*52a38012Sejakowatz BBufferProducer::BBufferProducer()
528*52a38012Sejakowatz BBufferProducer::BBufferProducer(const BBufferProducer &clone)
529*52a38012Sejakowatz BBufferProducer & BBufferProducer::operator=(const BBufferProducer &clone)
530*52a38012Sejakowatz */
531*52a38012Sejakowatz 
532*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_0(void *) { return B_ERROR; }
533*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_1(void *) { return B_ERROR; }
534*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_2(void *) { return B_ERROR; }
535*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_3(void *) { return B_ERROR; }
536*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_4(void *) { return B_ERROR; }
537*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_5(void *) { return B_ERROR; }
538*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_6(void *) { return B_ERROR; }
539*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_7(void *) { return B_ERROR; }
540*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_8(void *) { return B_ERROR; }
541*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_9(void *) { return B_ERROR; }
542*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_10(void *) { return B_ERROR; }
543*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_11(void *) { return B_ERROR; }
544*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_12(void *) { return B_ERROR; }
545*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_13(void *) { return B_ERROR; }
546*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_14(void *) { return B_ERROR; }
547*52a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_15(void *) { return B_ERROR; }
548*52a38012Sejakowatz 
549*52a38012Sejakowatz 
550*52a38012Sejakowatz status_t
551*52a38012Sejakowatz BBufferProducer::clip_shorts_to_region(const int16 *data,
552*52a38012Sejakowatz 									   int count,
553*52a38012Sejakowatz 									   BRegion *output)
554*52a38012Sejakowatz {
555*52a38012Sejakowatz 	UNIMPLEMENTED();
556*52a38012Sejakowatz 
557*52a38012Sejakowatz 	return B_ERROR;
558*52a38012Sejakowatz }
559*52a38012Sejakowatz 
560*52a38012Sejakowatz 
561*52a38012Sejakowatz status_t
562*52a38012Sejakowatz BBufferProducer::clip_region_to_shorts(const BRegion *input,
563*52a38012Sejakowatz 									   int16 *data,
564*52a38012Sejakowatz 									   int max_count,
565*52a38012Sejakowatz 									   int *out_count)
566*52a38012Sejakowatz {
567*52a38012Sejakowatz 	UNIMPLEMENTED();
568*52a38012Sejakowatz 
569*52a38012Sejakowatz 	return B_ERROR;
570*52a38012Sejakowatz }
571*52a38012Sejakowatz 
572