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