xref: /haiku/src/kits/media/BufferProducer.cpp (revision dfb2ad6148f303a0ee57faecc282953d11156067)
152a38012Sejakowatz /***********************************************************************
252a38012Sejakowatz  * AUTHOR: Marcus Overhagen
352a38012Sejakowatz  *   FILE: BufferProducer.cpp
452a38012Sejakowatz  *  DESCR:
552a38012Sejakowatz  ***********************************************************************/
652a38012Sejakowatz #include <BufferProducer.h>
752a38012Sejakowatz #include <BufferGroup.h>
852a38012Sejakowatz #include <Buffer.h>
9570f7d04Sbeveloper #define DEBUG 3
1052a38012Sejakowatz #include "debug.h"
118c6a6096Sbeveloper #include "DataExchange.h"
1252a38012Sejakowatz 
1352a38012Sejakowatz /*************************************************************
1452a38012Sejakowatz  * protected BBufferProducer
1552a38012Sejakowatz  *************************************************************/
1652a38012Sejakowatz 
1752a38012Sejakowatz BBufferProducer::~BBufferProducer()
1852a38012Sejakowatz {
1952a38012Sejakowatz 	CALLED();
2052a38012Sejakowatz }
2152a38012Sejakowatz 
2252a38012Sejakowatz /*************************************************************
2352a38012Sejakowatz  * public BBufferProducer
2452a38012Sejakowatz  *************************************************************/
2552a38012Sejakowatz 
2652a38012Sejakowatz /* static */ status_t
2752a38012Sejakowatz BBufferProducer::ClipDataToRegion(int32 format,
2852a38012Sejakowatz 								  int32 size,
2963ffaa3eSbeveloper 								  const void *data,
3052a38012Sejakowatz 								  BRegion *region)
3152a38012Sejakowatz {
3252a38012Sejakowatz 	CALLED();
3352a38012Sejakowatz 
3452a38012Sejakowatz 	if (format != B_CLIP_SHORT_RUNS)
3552a38012Sejakowatz 		return B_MEDIA_BAD_CLIP_FORMAT;
3652a38012Sejakowatz 
3763ffaa3eSbeveloper 	return clip_shorts_to_region((const int16 *)data, size / sizeof(int16), region);
3852a38012Sejakowatz }
3952a38012Sejakowatz 
4052a38012Sejakowatz media_type
4152a38012Sejakowatz BBufferProducer::ProducerType()
4252a38012Sejakowatz {
4352a38012Sejakowatz 	CALLED();
4452a38012Sejakowatz 	return fProducerType;
4552a38012Sejakowatz }
4652a38012Sejakowatz 
4752a38012Sejakowatz /*************************************************************
4852a38012Sejakowatz  * protected BBufferProducer
4952a38012Sejakowatz  *************************************************************/
5052a38012Sejakowatz 
5152a38012Sejakowatz /* explicit */
5252a38012Sejakowatz BBufferProducer::BBufferProducer(media_type producer_type) :
5352a38012Sejakowatz 	BMediaNode("called by BBufferProducer"),
5452a38012Sejakowatz 	fProducerType(producer_type),
5552a38012Sejakowatz 	fInitialLatency(0),
5652a38012Sejakowatz 	fInitialFlags(0)
5752a38012Sejakowatz {
5852a38012Sejakowatz 	CALLED();
5952a38012Sejakowatz 
6052a38012Sejakowatz 	AddNodeKind(B_BUFFER_PRODUCER);
6152a38012Sejakowatz }
6252a38012Sejakowatz 
6352a38012Sejakowatz 
6452a38012Sejakowatz status_t
6552a38012Sejakowatz BBufferProducer::VideoClippingChanged(const media_source &for_source,
6652a38012Sejakowatz 									  int16 num_shorts,
6752a38012Sejakowatz 									  int16 *clip_data,
6852a38012Sejakowatz 									  const media_video_display_info &display,
6952a38012Sejakowatz 									  int32 *_deprecated_)
7052a38012Sejakowatz {
7152a38012Sejakowatz 	CALLED();
7252a38012Sejakowatz 	// may be implemented by derived classes
7352a38012Sejakowatz 	return B_ERROR;
7452a38012Sejakowatz }
7552a38012Sejakowatz 
7652a38012Sejakowatz 
7752a38012Sejakowatz status_t
7852a38012Sejakowatz BBufferProducer::GetLatency(bigtime_t *out_lantency)
7952a38012Sejakowatz {
8052a38012Sejakowatz 	UNIMPLEMENTED();
8152a38012Sejakowatz 
8252a38012Sejakowatz 	// XXX The default implementation of GetLatency() finds the maximum
8352a38012Sejakowatz 	// latency of your currently-available outputs by iterating over
8452a38012Sejakowatz 	// them, and returns that value in outLatency
8552a38012Sejakowatz 
8652a38012Sejakowatz 	return B_ERROR;
8752a38012Sejakowatz }
8852a38012Sejakowatz 
8952a38012Sejakowatz 
9052a38012Sejakowatz status_t
9152a38012Sejakowatz BBufferProducer::SetPlayRate(int32 numer,
9252a38012Sejakowatz 							 int32 denom)
9352a38012Sejakowatz {
9452a38012Sejakowatz 	CALLED();
9552a38012Sejakowatz 	// may be implemented by derived classes
9652a38012Sejakowatz 	return B_ERROR;
9752a38012Sejakowatz }
9852a38012Sejakowatz 
9952a38012Sejakowatz 
10052a38012Sejakowatz status_t
10152a38012Sejakowatz BBufferProducer::HandleMessage(int32 message,
102*dfb2ad61Sbeveloper 							   const void *data,
10352a38012Sejakowatz 							   size_t size)
10452a38012Sejakowatz {
105570f7d04Sbeveloper 	TRACE("BBufferProducer::HandleMessage %#lx, node %ld\n", message, fNodeID);
1068c6a6096Sbeveloper 	status_t rv;
10752a38012Sejakowatz 	switch (message) {
10852a38012Sejakowatz 
10952a38012Sejakowatz 		case PRODUCER_FORMAT_SUGGESTION_REQUESTED:
11052a38012Sejakowatz 		{
111*dfb2ad61Sbeveloper 			const producer_format_suggestion_requested_request *request = static_cast<const producer_format_suggestion_requested_request *>(data);
112*dfb2ad61Sbeveloper 			producer_format_suggestion_requested_reply reply;
113*dfb2ad61Sbeveloper 			rv = FormatSuggestionRequested(request->type, request->quality, &reply.format);
114*dfb2ad61Sbeveloper 			request->SendReply(rv, &reply, sizeof(reply));
11552a38012Sejakowatz 			return B_OK;
11652a38012Sejakowatz 		}
11752a38012Sejakowatz 
11852a38012Sejakowatz 		case PRODUCER_FORMAT_PROPOSAL:
11952a38012Sejakowatz 		{
120*dfb2ad61Sbeveloper 			const producer_format_proposal_request *request = static_cast<const producer_format_proposal_request *>(data);
1218c6a6096Sbeveloper 			producer_format_proposal_reply reply;
1228c6a6096Sbeveloper 			reply.format = request->format;
1238c6a6096Sbeveloper 			rv = FormatProposal(request->output, &reply.format);
1248c6a6096Sbeveloper 			request->SendReply(rv, &reply, sizeof(reply));
12552a38012Sejakowatz 			return B_OK;
12652a38012Sejakowatz 		}
12752a38012Sejakowatz 
12852a38012Sejakowatz 		case PRODUCER_PREPARE_TO_CONNECT:
12952a38012Sejakowatz 		{
130*dfb2ad61Sbeveloper 			const producer_prepare_to_connect_request *request = static_cast<const producer_prepare_to_connect_request *>(data);
1318c6a6096Sbeveloper 			producer_prepare_to_connect_reply reply;
1328c6a6096Sbeveloper 			reply.format = request->format;
1338c6a6096Sbeveloper 			memcpy(reply.name, request->name, B_MEDIA_NAME_LENGTH);
1348c6a6096Sbeveloper 			rv = PrepareToConnect(request->source, request->destination, &reply.format, &reply.out_source, reply.name);
1358c6a6096Sbeveloper 			request->SendReply(rv, &reply, sizeof(reply));
13652a38012Sejakowatz 			return B_OK;
13752a38012Sejakowatz 		}
13852a38012Sejakowatz 
13952a38012Sejakowatz 		case PRODUCER_CONNECT:
14052a38012Sejakowatz 		{
141*dfb2ad61Sbeveloper 			const producer_connect_request *request = static_cast<const producer_connect_request *>(data);
1428c6a6096Sbeveloper 			producer_connect_reply reply;
1438c6a6096Sbeveloper 			memcpy(reply.name, request->name, B_MEDIA_NAME_LENGTH);
1448c6a6096Sbeveloper 			Connect(request->error, request->source, request->destination, request->format, reply.name);
1458c6a6096Sbeveloper 			request->SendReply(B_OK, &reply, sizeof(reply));
14652a38012Sejakowatz 			return B_OK;
14752a38012Sejakowatz 		}
14852a38012Sejakowatz 
14952a38012Sejakowatz 		case PRODUCER_DISCONNECT:
15052a38012Sejakowatz 		{
151*dfb2ad61Sbeveloper 			const producer_disconnect_request *request = static_cast<const producer_disconnect_request *>(data);
1529e9417d2Sbeveloper 			producer_disconnect_reply reply;
1538c6a6096Sbeveloper 			Disconnect(request->source, request->destination);
1549e9417d2Sbeveloper 			request->SendReply(B_OK, &reply, sizeof(reply));
15552a38012Sejakowatz 			return B_OK;
15652a38012Sejakowatz 		}
15752a38012Sejakowatz 
15852a38012Sejakowatz 		case PRODUCER_GET_INITIAL_LATENCY:
15952a38012Sejakowatz 		{
160*dfb2ad61Sbeveloper 			const producer_get_initial_latency_request *request = static_cast<const producer_get_initial_latency_request *>(data);
161*dfb2ad61Sbeveloper 			producer_get_initial_latency_reply reply;
16252a38012Sejakowatz 			reply.initial_latency = fInitialLatency;
16352a38012Sejakowatz 			reply.flags = fInitialFlags;
164*dfb2ad61Sbeveloper 			request->SendReply(B_OK, &reply, sizeof(reply));
16552a38012Sejakowatz 			return B_OK;
16652a38012Sejakowatz 		}
16752a38012Sejakowatz 
16852a38012Sejakowatz 		case PRODUCER_SET_PLAY_RATE:
16952a38012Sejakowatz 		{
170*dfb2ad61Sbeveloper 			const producer_set_play_rate_request *request = static_cast<const producer_set_play_rate_request *>(data);
171*dfb2ad61Sbeveloper 			producer_set_play_rate_reply reply;
172*dfb2ad61Sbeveloper 			rv = SetPlayRate(request->numer, request->denom);
173*dfb2ad61Sbeveloper 			request->SendReply(rv, &reply, sizeof(reply));
17452a38012Sejakowatz 			return B_OK;
17552a38012Sejakowatz 		}
17652a38012Sejakowatz 
17752a38012Sejakowatz 		case PRODUCER_GET_LATENCY:
17852a38012Sejakowatz 		{
179*dfb2ad61Sbeveloper 			const producer_get_latency_request *request = static_cast<const producer_get_latency_request *>(data);
180*dfb2ad61Sbeveloper 			producer_get_latency_reply reply;
181*dfb2ad61Sbeveloper 			rv = GetLatency(&reply.latency);
182*dfb2ad61Sbeveloper 			request->SendReply(rv, &reply, sizeof(reply));
18352a38012Sejakowatz 			return B_OK;
18452a38012Sejakowatz 		}
18552a38012Sejakowatz 
18652a38012Sejakowatz 		case PRODUCER_GET_NEXT_OUTPUT:
18752a38012Sejakowatz 		{
188*dfb2ad61Sbeveloper 			const producer_get_next_output_request *request = static_cast<const producer_get_next_output_request *>(data);
1893620737cSbeveloper 			producer_get_next_output_reply reply;
1908c6a6096Sbeveloper 			reply.cookie = request->cookie;
1913620737cSbeveloper 			rv = GetNextOutput(&reply.cookie, &reply.output);
1923620737cSbeveloper 			request->SendReply(rv, &reply, sizeof(reply));
19352a38012Sejakowatz 			return B_OK;
19452a38012Sejakowatz 		}
19552a38012Sejakowatz 
19652a38012Sejakowatz 		case PRODUCER_DISPOSE_OUTPUT_COOKIE:
19752a38012Sejakowatz 		{
198*dfb2ad61Sbeveloper 			const producer_dispose_output_cookie_request *request = static_cast<const producer_dispose_output_cookie_request *>(data);
1993620737cSbeveloper 			producer_dispose_output_cookie_reply reply;
2008c6a6096Sbeveloper 			DisposeOutputCookie(request->cookie);
2013620737cSbeveloper 			request->SendReply(B_OK, &reply, sizeof(reply));
20252a38012Sejakowatz 			return B_OK;
20352a38012Sejakowatz 		}
20452a38012Sejakowatz 
20552a38012Sejakowatz 		case PRODUCER_SET_BUFFER_GROUP:
20652a38012Sejakowatz 		{
207*dfb2ad61Sbeveloper 			const producer_set_buffer_group_command *command = static_cast<const producer_set_buffer_group_command *>(data);
208*dfb2ad61Sbeveloper 			node_request_completed_command replycommand;
20952a38012Sejakowatz 			BBufferGroup *group;
210*dfb2ad61Sbeveloper 			group = command->buffer_count != 0 ? new BBufferGroup(command->buffer_count, command->buffers) : NULL;
211*dfb2ad61Sbeveloper 			rv = SetBufferGroup(command->source, group);
212*dfb2ad61Sbeveloper 			if (command->destination == media_destination::null)
21352a38012Sejakowatz 				return B_OK;
214*dfb2ad61Sbeveloper 			replycommand.info.what = media_request_info::B_SET_OUTPUT_BUFFERS_FOR;
215*dfb2ad61Sbeveloper 			replycommand.info.change_tag = command->change_tag;
216*dfb2ad61Sbeveloper 			replycommand.info.status = rv;
217*dfb2ad61Sbeveloper 			replycommand.info.cookie = (int32)group;
218*dfb2ad61Sbeveloper 			replycommand.info.user_data = command->user_data;
219*dfb2ad61Sbeveloper 			replycommand.info.source = command->source;
220*dfb2ad61Sbeveloper 			replycommand.info.destination = command->destination;
221*dfb2ad61Sbeveloper 			SendToPort(command->destination.port, NODE_REQUEST_COMPLETED, &replycommand, sizeof(replycommand));
22252a38012Sejakowatz 			return B_OK;
22352a38012Sejakowatz 		}
22452a38012Sejakowatz 
22552a38012Sejakowatz 		case PRODUCER_FORMAT_CHANGE_REQUESTED:
22652a38012Sejakowatz 		{
227*dfb2ad61Sbeveloper 			const producer_format_change_requested_command *command = static_cast<const producer_format_change_requested_command *>(data);
228*dfb2ad61Sbeveloper 			node_request_completed_command replycommand;
229*dfb2ad61Sbeveloper 			replycommand.info.format = command->format;
230*dfb2ad61Sbeveloper 			rv = FormatChangeRequested(command->source, command->destination, &replycommand.info.format, NULL);
231*dfb2ad61Sbeveloper 			if (command->destination == media_destination::null)
23252a38012Sejakowatz 				return B_OK;
233*dfb2ad61Sbeveloper 			replycommand.info.what = media_request_info::B_REQUEST_FORMAT_CHANGE;
234*dfb2ad61Sbeveloper 			replycommand.info.change_tag = command->change_tag;
235*dfb2ad61Sbeveloper 			replycommand.info.status = rv;
236*dfb2ad61Sbeveloper 			//replycommand.info.cookie
237*dfb2ad61Sbeveloper 			replycommand.info.user_data = command->user_data;
238*dfb2ad61Sbeveloper 			replycommand.info.source = command->source;
239*dfb2ad61Sbeveloper 			replycommand.info.destination = command->destination;
240*dfb2ad61Sbeveloper 			SendToPort(command->destination.port, NODE_REQUEST_COMPLETED, &replycommand, sizeof(replycommand));
24152a38012Sejakowatz 			return B_OK;
24252a38012Sejakowatz 		}
24352a38012Sejakowatz 
24452a38012Sejakowatz 
24552a38012Sejakowatz 		case PRODUCER_VIDEO_CLIPPING_CHANGED:
24652a38012Sejakowatz 		{
247*dfb2ad61Sbeveloper 			const producer_video_clipping_changed_command *command = static_cast<const producer_video_clipping_changed_command *>(data);
248*dfb2ad61Sbeveloper 			node_request_completed_command replycommand;
249*dfb2ad61Sbeveloper 			rv = VideoClippingChanged(command->source, command->short_count, (int16 *)command->shorts, command->display, NULL);
250*dfb2ad61Sbeveloper 			if (command->destination == media_destination::null)
25152a38012Sejakowatz 				return B_OK;
252*dfb2ad61Sbeveloper 			replycommand.info.what = media_request_info::B_SET_VIDEO_CLIPPING_FOR;
253*dfb2ad61Sbeveloper 			replycommand.info.change_tag = command->change_tag;
254*dfb2ad61Sbeveloper 			replycommand.info.status = rv;
255*dfb2ad61Sbeveloper 			//replycommand.info.cookie
256*dfb2ad61Sbeveloper 			replycommand.info.user_data = command->user_data;
257*dfb2ad61Sbeveloper 			replycommand.info.source = command->source;
258*dfb2ad61Sbeveloper 			replycommand.info.destination = command->destination;
259*dfb2ad61Sbeveloper 			replycommand.info.format.type = B_MEDIA_RAW_VIDEO;
260*dfb2ad61Sbeveloper 			replycommand.info.format.u.raw_video.display = command->display;
261*dfb2ad61Sbeveloper 			SendToPort(command->destination.port, NODE_REQUEST_COMPLETED, &replycommand, sizeof(replycommand));
26252a38012Sejakowatz 			return B_OK;
26352a38012Sejakowatz 		}
26452a38012Sejakowatz 
26552a38012Sejakowatz 		case PRODUCER_ADDITIONAL_BUFFER_REQUESTED:
26652a38012Sejakowatz 		{
267*dfb2ad61Sbeveloper 			const producer_additional_buffer_requested_command *command = static_cast<const producer_additional_buffer_requested_command *>(data);
268*dfb2ad61Sbeveloper 			AdditionalBufferRequested(command->source, command->prev_buffer, command->prev_time, command->has_seek_tag ? &command->prev_tag : NULL);
26952a38012Sejakowatz 			return B_OK;
27052a38012Sejakowatz 		}
27152a38012Sejakowatz 
27252a38012Sejakowatz 		case PRODUCER_LATENCY_CHANGED:
27352a38012Sejakowatz 		{
274*dfb2ad61Sbeveloper 			const producer_latency_changed_command *command = static_cast<const producer_latency_changed_command *>(data);
275*dfb2ad61Sbeveloper 			LatencyChanged(command->source, command->destination, command->latency, command->flags);
27652a38012Sejakowatz 			return B_OK;
27752a38012Sejakowatz 		}
27852a38012Sejakowatz 
27952a38012Sejakowatz 		case PRODUCER_LATE_NOTICE_RECEIVED:
28052a38012Sejakowatz 		{
281*dfb2ad61Sbeveloper 			const producer_late_notice_received_command *command = static_cast<const producer_late_notice_received_command *>(data);
282*dfb2ad61Sbeveloper 			LateNoticeReceived(command->source, command->how_much, command->performance_time);
28352a38012Sejakowatz 			return B_OK;
28452a38012Sejakowatz 		}
28552a38012Sejakowatz 
28652a38012Sejakowatz 		case PRODUCER_ENABLE_OUTPUT:
28752a38012Sejakowatz 		{
288*dfb2ad61Sbeveloper 			const producer_enable_output_command *command = static_cast<const producer_enable_output_command *>(data);
289*dfb2ad61Sbeveloper 			node_request_completed_command replycommand;
290*dfb2ad61Sbeveloper 			EnableOutput(command->source, command->enabled, NULL);
291*dfb2ad61Sbeveloper 			if (command->destination == media_destination::null)
29252a38012Sejakowatz 				return B_OK;
293*dfb2ad61Sbeveloper 			replycommand.info.what = media_request_info::B_SET_OUTPUT_ENABLED;
294*dfb2ad61Sbeveloper 			replycommand.info.change_tag = command->change_tag;
295*dfb2ad61Sbeveloper 			replycommand.info.status = B_OK;
296*dfb2ad61Sbeveloper 			//replycommand.info.cookie
297*dfb2ad61Sbeveloper 			replycommand.info.user_data = command->user_data;
298*dfb2ad61Sbeveloper 			replycommand.info.source = command->source;
299*dfb2ad61Sbeveloper 			replycommand.info.destination = command->destination;
300*dfb2ad61Sbeveloper 			//replycommand.info.format
301*dfb2ad61Sbeveloper 			SendToPort(command->destination.port, NODE_REQUEST_COMPLETED, &replycommand, sizeof(replycommand));
30252a38012Sejakowatz 			return B_OK;
30352a38012Sejakowatz 		}
30452a38012Sejakowatz 
30552a38012Sejakowatz 	};
30652a38012Sejakowatz 	return B_ERROR;
30752a38012Sejakowatz }
30852a38012Sejakowatz 
30952a38012Sejakowatz 
31052a38012Sejakowatz void
31152a38012Sejakowatz BBufferProducer::AdditionalBufferRequested(const media_source &source,
31252a38012Sejakowatz 										   media_buffer_id prev_buffer,
31352a38012Sejakowatz 										   bigtime_t prev_time,
31452a38012Sejakowatz 										   const media_seek_tag *prev_tag)
31552a38012Sejakowatz {
31652a38012Sejakowatz 	CALLED();
31752a38012Sejakowatz 	// may be implemented by derived classes
31852a38012Sejakowatz }
31952a38012Sejakowatz 
32052a38012Sejakowatz 
32152a38012Sejakowatz void
32252a38012Sejakowatz BBufferProducer::LatencyChanged(const media_source &source,
32352a38012Sejakowatz 								const media_destination &destination,
32452a38012Sejakowatz 								bigtime_t new_latency,
32552a38012Sejakowatz 								uint32 flags)
32652a38012Sejakowatz {
32752a38012Sejakowatz 	CALLED();
32852a38012Sejakowatz 	// may be implemented by derived classes
32952a38012Sejakowatz }
33052a38012Sejakowatz 
33152a38012Sejakowatz 
33252a38012Sejakowatz status_t
33352a38012Sejakowatz BBufferProducer::SendBuffer(BBuffer *buffer,
33452a38012Sejakowatz 							const media_destination &destination)
33552a38012Sejakowatz {
33652a38012Sejakowatz 	CALLED();
33752a38012Sejakowatz 	if (destination == media_destination::null)
33852a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
33952a38012Sejakowatz 	if (buffer == NULL)
34052a38012Sejakowatz 		return B_BAD_VALUE;
34152a38012Sejakowatz 
342*dfb2ad61Sbeveloper 	consumer_buffer_received_command command;
343*dfb2ad61Sbeveloper 	command.buffer = buffer->ID();
344*dfb2ad61Sbeveloper 	command.header = *(buffer->Header());
345*dfb2ad61Sbeveloper 	command.header.buffer = command.buffer; // buffer->ID();
346*dfb2ad61Sbeveloper 	command.header.destination = destination.id;
34752a38012Sejakowatz 
348*dfb2ad61Sbeveloper 	return SendToPort(destination.port, CONSUMER_BUFFER_RECEIVED, &command, sizeof(command));
34952a38012Sejakowatz }
35052a38012Sejakowatz 
35152a38012Sejakowatz 
35252a38012Sejakowatz status_t
35352a38012Sejakowatz BBufferProducer::SendDataStatus(int32 status,
35452a38012Sejakowatz 								const media_destination &destination,
35552a38012Sejakowatz 								bigtime_t at_time)
35652a38012Sejakowatz {
35752a38012Sejakowatz 	CALLED();
35852a38012Sejakowatz 	if (destination == media_destination::null)
35952a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
36052a38012Sejakowatz 
361*dfb2ad61Sbeveloper 	consumer_producer_data_status_command command;
362*dfb2ad61Sbeveloper 	command.for_whom = destination;
363*dfb2ad61Sbeveloper 	command.status = status;
364*dfb2ad61Sbeveloper 	command.at_performance_time = at_time;
36552a38012Sejakowatz 
366*dfb2ad61Sbeveloper 	return SendToPort(destination.port, CONSUMER_PRODUCER_DATA_STATUS, &command, sizeof(command));
36752a38012Sejakowatz }
36852a38012Sejakowatz 
36952a38012Sejakowatz 
37052a38012Sejakowatz status_t
37152a38012Sejakowatz BBufferProducer::ProposeFormatChange(media_format *format,
37252a38012Sejakowatz 									 const media_destination &for_destination)
37352a38012Sejakowatz {
37452a38012Sejakowatz 	CALLED();
37552a38012Sejakowatz 	if (for_destination == media_destination::null)
37652a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
37752a38012Sejakowatz 
3788c6a6096Sbeveloper 	consumer_accept_format_request request;
3798c6a6096Sbeveloper 	consumer_accept_format_reply reply;
38052a38012Sejakowatz 	status_t rv;
38152a38012Sejakowatz 
3828c6a6096Sbeveloper 	request.dest = for_destination;
3838c6a6096Sbeveloper 	request.format = *format;
3848c6a6096Sbeveloper 	rv = QueryPort(for_destination.port, CONSUMER_ACCEPT_FORMAT, &request, sizeof(request), &reply, sizeof(reply));
3858c6a6096Sbeveloper 	if (rv != B_OK)
38652a38012Sejakowatz 		return rv;
38752a38012Sejakowatz 
38852a38012Sejakowatz 	*format = reply.format;
3898c6a6096Sbeveloper 	return B_OK;
39052a38012Sejakowatz }
39152a38012Sejakowatz 
39252a38012Sejakowatz 
39352a38012Sejakowatz status_t
39452a38012Sejakowatz BBufferProducer::ChangeFormat(const media_source &for_source,
39552a38012Sejakowatz 							  const media_destination &for_destination,
39652a38012Sejakowatz 							  media_format *format)
39752a38012Sejakowatz {
39852a38012Sejakowatz 	CALLED();
39952a38012Sejakowatz 	if (for_source == media_source::null)
40052a38012Sejakowatz 		return B_MEDIA_BAD_SOURCE;
40152a38012Sejakowatz 	if (for_destination == media_destination::null)
40252a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
40352a38012Sejakowatz 
404*dfb2ad61Sbeveloper 	consumer_format_changed_request request;
405*dfb2ad61Sbeveloper 	consumer_format_changed_reply reply;
40652a38012Sejakowatz 
4078c6a6096Sbeveloper 	request.producer = for_source;
4088c6a6096Sbeveloper 	request.consumer = for_destination;
4098c6a6096Sbeveloper 	request.format = *format;
41052a38012Sejakowatz 
411*dfb2ad61Sbeveloper 	// we use a request/reply to make this synchronous
412*dfb2ad61Sbeveloper 	return QueryPort(for_destination.port, CONSUMER_FORMAT_CHANGED, &request, sizeof(request), &reply, sizeof(reply));
41352a38012Sejakowatz }
41452a38012Sejakowatz 
41552a38012Sejakowatz 
41652a38012Sejakowatz status_t
41752a38012Sejakowatz BBufferProducer::FindLatencyFor(const media_destination &for_destination,
41852a38012Sejakowatz 								bigtime_t *out_latency,
41952a38012Sejakowatz 								media_node_id *out_timesource)
42052a38012Sejakowatz {
42152a38012Sejakowatz 	CALLED();
42252a38012Sejakowatz 	if (for_destination == media_destination::null)
42352a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
42452a38012Sejakowatz 
42552a38012Sejakowatz 	status_t rv;
426*dfb2ad61Sbeveloper 	consumer_get_latency_for_request request;
427*dfb2ad61Sbeveloper 	consumer_get_latency_for_reply reply;
42852a38012Sejakowatz 
4298c6a6096Sbeveloper 	request.for_whom = for_destination;
43052a38012Sejakowatz 
431*dfb2ad61Sbeveloper 	rv = QueryPort(for_destination.port, CONSUMER_GET_LATENCY_FOR, &request, sizeof(request), &reply, sizeof(reply));
432*dfb2ad61Sbeveloper 	if (rv != B_OK)
43352a38012Sejakowatz 		return rv;
43452a38012Sejakowatz 
43552a38012Sejakowatz 	*out_latency = reply.latency;
43652a38012Sejakowatz 	*out_timesource = reply.timesource;
437*dfb2ad61Sbeveloper 	return rv;
43852a38012Sejakowatz }
43952a38012Sejakowatz 
44052a38012Sejakowatz 
44152a38012Sejakowatz status_t
44252a38012Sejakowatz BBufferProducer::FindSeekTag(const media_destination &for_destination,
44352a38012Sejakowatz 							 bigtime_t in_target_time,
44452a38012Sejakowatz 							 media_seek_tag *out_tag,
44552a38012Sejakowatz 							 bigtime_t *out_tagged_time,
44652a38012Sejakowatz 							 uint32 *out_flags,
44752a38012Sejakowatz 							 uint32 in_flags)
44852a38012Sejakowatz {
44952a38012Sejakowatz 	CALLED();
45052a38012Sejakowatz 	if (for_destination == media_destination::null)
45152a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
45252a38012Sejakowatz 
45352a38012Sejakowatz 	status_t rv;
454*dfb2ad61Sbeveloper 	consumer_seek_tag_requested_request request;
455*dfb2ad61Sbeveloper 	consumer_seek_tag_requested_reply reply;
45652a38012Sejakowatz 
4578c6a6096Sbeveloper 	request.destination = for_destination;
4588c6a6096Sbeveloper 	request.target_time = in_target_time;
4598c6a6096Sbeveloper 	request.flags = in_flags;
46052a38012Sejakowatz 
461*dfb2ad61Sbeveloper 	rv = QueryPort(for_destination.port, CONSUMER_SEEK_TAG_REQUESTED, &request, sizeof(request), &reply, sizeof(reply));
462*dfb2ad61Sbeveloper 	if (rv != B_OK)
46352a38012Sejakowatz 		return rv;
46452a38012Sejakowatz 
46552a38012Sejakowatz 	*out_tag = reply.seek_tag;
46652a38012Sejakowatz 	*out_tagged_time = reply.tagged_time;
46752a38012Sejakowatz 	*out_flags = reply.flags;
468*dfb2ad61Sbeveloper 	return rv;
46952a38012Sejakowatz }
47052a38012Sejakowatz 
47152a38012Sejakowatz 
47252a38012Sejakowatz void
47352a38012Sejakowatz BBufferProducer::SetInitialLatency(bigtime_t inInitialLatency,
47452a38012Sejakowatz 								   uint32 flags)
47552a38012Sejakowatz {
47652a38012Sejakowatz 	fInitialLatency = inInitialLatency;
47752a38012Sejakowatz 	fInitialFlags = flags;
47852a38012Sejakowatz }
47952a38012Sejakowatz 
48052a38012Sejakowatz /*************************************************************
48152a38012Sejakowatz  * private BBufferProducer
48252a38012Sejakowatz  *************************************************************/
48352a38012Sejakowatz 
48452a38012Sejakowatz /*
48552a38012Sejakowatz private unimplemented
48652a38012Sejakowatz BBufferProducer::BBufferProducer()
48752a38012Sejakowatz BBufferProducer::BBufferProducer(const BBufferProducer &clone)
48852a38012Sejakowatz BBufferProducer & BBufferProducer::operator=(const BBufferProducer &clone)
48952a38012Sejakowatz */
49052a38012Sejakowatz 
49152a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_0(void *) { return B_ERROR; }
49252a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_1(void *) { return B_ERROR; }
49352a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_2(void *) { return B_ERROR; }
49452a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_3(void *) { return B_ERROR; }
49552a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_4(void *) { return B_ERROR; }
49652a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_5(void *) { return B_ERROR; }
49752a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_6(void *) { return B_ERROR; }
49852a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_7(void *) { return B_ERROR; }
49952a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_8(void *) { return B_ERROR; }
50052a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_9(void *) { return B_ERROR; }
50152a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_10(void *) { return B_ERROR; }
50252a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_11(void *) { return B_ERROR; }
50352a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_12(void *) { return B_ERROR; }
50452a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_13(void *) { return B_ERROR; }
50552a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_14(void *) { return B_ERROR; }
50652a38012Sejakowatz status_t BBufferProducer::_Reserved_BufferProducer_15(void *) { return B_ERROR; }
50752a38012Sejakowatz 
50852a38012Sejakowatz 
50952a38012Sejakowatz status_t
51063ffaa3eSbeveloper BBufferProducer::clip_shorts_to_region(const int16 *data,
51152a38012Sejakowatz 									   int count,
51252a38012Sejakowatz 									   BRegion *output)
51352a38012Sejakowatz {
51452a38012Sejakowatz 	UNIMPLEMENTED();
51552a38012Sejakowatz 
51652a38012Sejakowatz 	return B_ERROR;
51752a38012Sejakowatz }
51852a38012Sejakowatz 
51952a38012Sejakowatz 
52052a38012Sejakowatz status_t
52152a38012Sejakowatz BBufferProducer::clip_region_to_shorts(const BRegion *input,
52263ffaa3eSbeveloper 									   int16 *data,
52352a38012Sejakowatz 									   int max_count,
52452a38012Sejakowatz 									   int *out_count)
52552a38012Sejakowatz {
52652a38012Sejakowatz 	UNIMPLEMENTED();
52752a38012Sejakowatz 
52852a38012Sejakowatz 	return B_ERROR;
52952a38012Sejakowatz }
53052a38012Sejakowatz 
531