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