152a38012Sejakowatz /*********************************************************************** 252a38012Sejakowatz * AUTHOR: Marcus Overhagen 352a38012Sejakowatz * FILE: MediaRoster.cpp 452a38012Sejakowatz * DESCR: 552a38012Sejakowatz ***********************************************************************/ 652a38012Sejakowatz #include <MediaRoster.h> 752a38012Sejakowatz #include <Locker.h> 852a38012Sejakowatz #include <Message.h> 952a38012Sejakowatz #include <Messenger.h> 1052a38012Sejakowatz #include <StopWatch.h> 1152a38012Sejakowatz #include <OS.h> 1252a38012Sejakowatz #include <String.h> 1352a38012Sejakowatz #include <TimeSource.h> 1452a38012Sejakowatz #undef DEBUG 1552a38012Sejakowatz #define DEBUG 3 1652a38012Sejakowatz #include "debug.h" 1752a38012Sejakowatz #include "PortPool.h" 180a483e72SIngo Weinhold #include "ServerInterface.h" 19*f4925104Sbeveloper #include "DataExchange.h" 2016b7eea4Sbeveloper #include "DormantNodeManager.h" 21*f4925104Sbeveloper #include "Notifications.h" 2252a38012Sejakowatz 23*f4925104Sbeveloper using namespace BPrivate::media; 24*f4925104Sbeveloper 25*f4925104Sbeveloper namespace BPrivate { namespace media { 26*f4925104Sbeveloper extern team_id team; 27*f4925104Sbeveloper }; }; 2852a38012Sejakowatz 2952a38012Sejakowatz // the BMediaRoster destructor is private, 3052a38012Sejakowatz // but _DefaultDeleter is a friend class of 3152a38012Sejakowatz // the BMediaRoster an thus can delete it 3252a38012Sejakowatz class _DefaultDeleter 3352a38012Sejakowatz { 3452a38012Sejakowatz public: 3552a38012Sejakowatz void Delete() { delete BMediaRoster::_sDefault; } 3652a38012Sejakowatz }; 3752a38012Sejakowatz 38*f4925104Sbeveloper _DefaultDeleter _deleter; 3952a38012Sejakowatz 4052a38012Sejakowatz namespace MediaKitPrivate 4152a38012Sejakowatz { 4252a38012Sejakowatz 4352a38012Sejakowatz 4452a38012Sejakowatz status_t GetNode(node_type type, media_node * out_node, int32 * out_input_id = NULL, BString * out_input_name = NULL); 4552a38012Sejakowatz status_t SetNode(node_type type, const media_node *node, const dormant_node_info *info = NULL, const media_input *input = NULL); 4652a38012Sejakowatz 4752a38012Sejakowatz status_t GetNode(node_type type, media_node * out_node, int32 * out_input_id, BString * out_input_name) 4852a38012Sejakowatz { 4952a38012Sejakowatz if (out_node == NULL) 5052a38012Sejakowatz return B_BAD_VALUE; 5152a38012Sejakowatz 5252a38012Sejakowatz xfer_server_get_node msg; 5352a38012Sejakowatz xfer_server_get_node_reply reply; 5452a38012Sejakowatz port_id port; 5552a38012Sejakowatz status_t rv; 5652a38012Sejakowatz int32 code; 5752a38012Sejakowatz 5852a38012Sejakowatz port = find_port("media_server port"); 5952a38012Sejakowatz if (port <= B_OK) 6052a38012Sejakowatz return B_ERROR; 6152a38012Sejakowatz 6252a38012Sejakowatz msg.type = type; 6352a38012Sejakowatz msg.reply_port = _PortPool->GetPort(); 6452a38012Sejakowatz rv = write_port(port, SERVER_GET_NODE, &msg, sizeof(msg)); 6552a38012Sejakowatz if (rv != B_OK) { 6652a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 6752a38012Sejakowatz return rv; 6852a38012Sejakowatz } 6952a38012Sejakowatz rv = read_port(msg.reply_port, &code, &reply, sizeof(reply)); 7052a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 7152a38012Sejakowatz if (rv < B_OK) 7252a38012Sejakowatz return rv; 7352a38012Sejakowatz *out_node = reply.node; 7452a38012Sejakowatz if (out_input_id) 7552a38012Sejakowatz *out_input_id = reply.input_id; 7652a38012Sejakowatz if (out_input_name) 7752a38012Sejakowatz *out_input_name = reply.input_name; 7852a38012Sejakowatz return reply.result; 7952a38012Sejakowatz } 8052a38012Sejakowatz 8152a38012Sejakowatz status_t SetNode(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input) 8252a38012Sejakowatz { 8352a38012Sejakowatz xfer_server_set_node msg; 8452a38012Sejakowatz xfer_server_set_node_reply reply; 8552a38012Sejakowatz port_id port; 8652a38012Sejakowatz status_t rv; 8752a38012Sejakowatz int32 code; 8852a38012Sejakowatz 8952a38012Sejakowatz port = find_port("media_server port"); 9052a38012Sejakowatz if (port <= B_OK) 9152a38012Sejakowatz return B_ERROR; 9252a38012Sejakowatz 9352a38012Sejakowatz msg.type = type; 9452a38012Sejakowatz msg.use_node = node ? true : false; 9552a38012Sejakowatz if (node) 9652a38012Sejakowatz msg.node = *node; 9752a38012Sejakowatz msg.use_dni = info ? true : false; 9852a38012Sejakowatz if (info) 9952a38012Sejakowatz msg.dni = *info; 10052a38012Sejakowatz msg.use_input = input ? true : false; 10152a38012Sejakowatz if (input) 10252a38012Sejakowatz msg.input = *input; 10352a38012Sejakowatz msg.reply_port = _PortPool->GetPort(); 10452a38012Sejakowatz rv = write_port(port, SERVER_SET_NODE, &msg, sizeof(msg)); 10552a38012Sejakowatz if (rv != B_OK) { 10652a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 10752a38012Sejakowatz return rv; 10852a38012Sejakowatz } 10952a38012Sejakowatz rv = read_port(msg.reply_port, &code, &reply, sizeof(reply)); 11052a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 11152a38012Sejakowatz 11252a38012Sejakowatz return (rv < B_OK) ? rv : reply.result; 11352a38012Sejakowatz } 11452a38012Sejakowatz 11552a38012Sejakowatz }; 11652a38012Sejakowatz 11752a38012Sejakowatz /************************************************************* 11852a38012Sejakowatz * public BMediaRoster 11952a38012Sejakowatz *************************************************************/ 12052a38012Sejakowatz 12152a38012Sejakowatz status_t 12252a38012Sejakowatz BMediaRoster::GetVideoInput(media_node * out_node) 12352a38012Sejakowatz { 12452a38012Sejakowatz CALLED(); 12552a38012Sejakowatz return MediaKitPrivate::GetNode(VIDEO_INPUT, out_node); 12652a38012Sejakowatz } 12752a38012Sejakowatz 12852a38012Sejakowatz 12952a38012Sejakowatz status_t 13052a38012Sejakowatz BMediaRoster::GetAudioInput(media_node * out_node) 13152a38012Sejakowatz { 13252a38012Sejakowatz CALLED(); 13352a38012Sejakowatz return MediaKitPrivate::GetNode(AUDIO_INPUT, out_node); 13452a38012Sejakowatz } 13552a38012Sejakowatz 13652a38012Sejakowatz 13752a38012Sejakowatz status_t 13852a38012Sejakowatz BMediaRoster::GetVideoOutput(media_node * out_node) 13952a38012Sejakowatz { 14052a38012Sejakowatz CALLED(); 14152a38012Sejakowatz return MediaKitPrivate::GetNode(VIDEO_OUTPUT, out_node); 14252a38012Sejakowatz } 14352a38012Sejakowatz 14452a38012Sejakowatz 14552a38012Sejakowatz status_t 14652a38012Sejakowatz BMediaRoster::GetAudioMixer(media_node * out_node) 14752a38012Sejakowatz { 14852a38012Sejakowatz CALLED(); 14952a38012Sejakowatz return MediaKitPrivate::GetNode(AUDIO_MIXER, out_node); 15052a38012Sejakowatz } 15152a38012Sejakowatz 15252a38012Sejakowatz 15352a38012Sejakowatz status_t 15452a38012Sejakowatz BMediaRoster::GetAudioOutput(media_node * out_node) 15552a38012Sejakowatz { 15652a38012Sejakowatz CALLED(); 15752a38012Sejakowatz return MediaKitPrivate::GetNode(AUDIO_OUTPUT, out_node); 15852a38012Sejakowatz } 15952a38012Sejakowatz 16052a38012Sejakowatz 16152a38012Sejakowatz status_t 16252a38012Sejakowatz BMediaRoster::GetAudioOutput(media_node * out_node, 16352a38012Sejakowatz int32 * out_input_id, 16452a38012Sejakowatz BString * out_input_name) 16552a38012Sejakowatz { 16652a38012Sejakowatz CALLED(); 16752a38012Sejakowatz return MediaKitPrivate::GetNode(AUDIO_OUTPUT_EX, out_node, out_input_id, out_input_name); 16852a38012Sejakowatz } 16952a38012Sejakowatz 17052a38012Sejakowatz 17152a38012Sejakowatz status_t 17252a38012Sejakowatz BMediaRoster::GetTimeSource(media_node * out_node) 17352a38012Sejakowatz { 17452a38012Sejakowatz CALLED(); 17552a38012Sejakowatz return MediaKitPrivate::GetNode(TIME_SOURCE, out_node); 17652a38012Sejakowatz } 17752a38012Sejakowatz 17852a38012Sejakowatz 17952a38012Sejakowatz status_t 18052a38012Sejakowatz BMediaRoster::SetVideoInput(const media_node & producer) 18152a38012Sejakowatz { 18252a38012Sejakowatz CALLED(); 18352a38012Sejakowatz return MediaKitPrivate::SetNode(VIDEO_INPUT, &producer); 18452a38012Sejakowatz } 18552a38012Sejakowatz 18652a38012Sejakowatz 18752a38012Sejakowatz status_t 18852a38012Sejakowatz BMediaRoster::SetVideoInput(const dormant_node_info & producer) 18952a38012Sejakowatz { 19052a38012Sejakowatz CALLED(); 19152a38012Sejakowatz return MediaKitPrivate::SetNode(VIDEO_INPUT, NULL, &producer); 19252a38012Sejakowatz } 19352a38012Sejakowatz 19452a38012Sejakowatz 19552a38012Sejakowatz status_t 19652a38012Sejakowatz BMediaRoster::SetAudioInput(const media_node & producer) 19752a38012Sejakowatz { 19852a38012Sejakowatz CALLED(); 19952a38012Sejakowatz return MediaKitPrivate::SetNode(AUDIO_INPUT, &producer); 20052a38012Sejakowatz } 20152a38012Sejakowatz 20252a38012Sejakowatz 20352a38012Sejakowatz status_t 20452a38012Sejakowatz BMediaRoster::SetAudioInput(const dormant_node_info & producer) 20552a38012Sejakowatz { 20652a38012Sejakowatz CALLED(); 20752a38012Sejakowatz return MediaKitPrivate::SetNode(AUDIO_INPUT, NULL, &producer); 20852a38012Sejakowatz } 20952a38012Sejakowatz 21052a38012Sejakowatz 21152a38012Sejakowatz status_t 21252a38012Sejakowatz BMediaRoster::SetVideoOutput(const media_node & consumer) 21352a38012Sejakowatz { 21452a38012Sejakowatz CALLED(); 21552a38012Sejakowatz return MediaKitPrivate::SetNode(VIDEO_OUTPUT, &consumer); 21652a38012Sejakowatz } 21752a38012Sejakowatz 21852a38012Sejakowatz 21952a38012Sejakowatz status_t 22052a38012Sejakowatz BMediaRoster::SetVideoOutput(const dormant_node_info & consumer) 22152a38012Sejakowatz { 22252a38012Sejakowatz CALLED(); 22352a38012Sejakowatz return MediaKitPrivate::SetNode(VIDEO_OUTPUT, NULL, &consumer); 22452a38012Sejakowatz } 22552a38012Sejakowatz 22652a38012Sejakowatz 22752a38012Sejakowatz status_t 22852a38012Sejakowatz BMediaRoster::SetAudioOutput(const media_node & consumer) 22952a38012Sejakowatz { 23052a38012Sejakowatz CALLED(); 23152a38012Sejakowatz return MediaKitPrivate::SetNode(AUDIO_OUTPUT, &consumer); 23252a38012Sejakowatz } 23352a38012Sejakowatz 23452a38012Sejakowatz 23552a38012Sejakowatz status_t 23652a38012Sejakowatz BMediaRoster::SetAudioOutput(const media_input & input_to_output) 23752a38012Sejakowatz { 23852a38012Sejakowatz CALLED(); 23952a38012Sejakowatz return MediaKitPrivate::SetNode(AUDIO_OUTPUT, NULL, NULL, &input_to_output); 24052a38012Sejakowatz } 24152a38012Sejakowatz 24252a38012Sejakowatz 24352a38012Sejakowatz status_t 24452a38012Sejakowatz BMediaRoster::SetAudioOutput(const dormant_node_info & consumer) 24552a38012Sejakowatz { 24652a38012Sejakowatz CALLED(); 24752a38012Sejakowatz return MediaKitPrivate::SetNode(AUDIO_OUTPUT, NULL, &consumer); 24852a38012Sejakowatz } 24952a38012Sejakowatz 25052a38012Sejakowatz 25152a38012Sejakowatz status_t 25252a38012Sejakowatz BMediaRoster::GetNodeFor(media_node_id node, 25352a38012Sejakowatz media_node * clone) 25452a38012Sejakowatz { 25552a38012Sejakowatz UNIMPLEMENTED(); 25652a38012Sejakowatz return B_ERROR; 25752a38012Sejakowatz } 25852a38012Sejakowatz 25952a38012Sejakowatz 26052a38012Sejakowatz status_t 26152a38012Sejakowatz BMediaRoster::GetSystemTimeSource(media_node * clone) 26252a38012Sejakowatz { 26352a38012Sejakowatz CALLED(); 26452a38012Sejakowatz return MediaKitPrivate::GetNode(SYSTEM_TIME_SOURCE, clone); 26552a38012Sejakowatz } 26652a38012Sejakowatz 26752a38012Sejakowatz 26852a38012Sejakowatz status_t 26952a38012Sejakowatz BMediaRoster::ReleaseNode(const media_node & node) 27052a38012Sejakowatz { 27152a38012Sejakowatz UNIMPLEMENTED(); 27252a38012Sejakowatz return B_ERROR; 27352a38012Sejakowatz } 27452a38012Sejakowatz 27552a38012Sejakowatz 27652a38012Sejakowatz 27752a38012Sejakowatz BTimeSource * 27852a38012Sejakowatz BMediaRoster::MakeTimeSourceFor(const media_node & for_node) 27952a38012Sejakowatz { 28052a38012Sejakowatz UNIMPLEMENTED(); 28152a38012Sejakowatz return 0; 28252a38012Sejakowatz } 28352a38012Sejakowatz 28452a38012Sejakowatz 28552a38012Sejakowatz status_t 28652a38012Sejakowatz BMediaRoster::Connect(const media_source & from, 28752a38012Sejakowatz const media_destination & to, 28852a38012Sejakowatz media_format * io_format, 28952a38012Sejakowatz media_output * out_output, 29052a38012Sejakowatz media_input * out_input) 29152a38012Sejakowatz { 292eae26d3dSbeveloper return BMediaRoster::Connect(from, to, io_format, out_output, out_input, 0); 293eae26d3dSbeveloper } 294eae26d3dSbeveloper 295eae26d3dSbeveloper 296eae26d3dSbeveloper status_t 297eae26d3dSbeveloper BMediaRoster::Connect(const media_source & from, 298eae26d3dSbeveloper const media_destination & to, 299eae26d3dSbeveloper media_format * io_format, 300eae26d3dSbeveloper media_output * out_output, 301eae26d3dSbeveloper media_input * out_input, 302eae26d3dSbeveloper uint32 in_flags, 303eae26d3dSbeveloper void * _reserved) 304eae26d3dSbeveloper { 30552a38012Sejakowatz CALLED(); 30652a38012Sejakowatz if (io_format == NULL || out_output == NULL || out_input == NULL) 30752a38012Sejakowatz return B_BAD_VALUE; 30852a38012Sejakowatz if (from == media_source::null) 30952a38012Sejakowatz return B_MEDIA_BAD_SOURCE; 31052a38012Sejakowatz if (to == media_destination::null) 31152a38012Sejakowatz return B_MEDIA_BAD_DESTINATION; 31252a38012Sejakowatz 31352a38012Sejakowatz xfer_producer_format_proposal msg1; 31452a38012Sejakowatz xfer_producer_format_proposal_reply reply1; 31552a38012Sejakowatz xfer_consumer_accept_format msg2; 31652a38012Sejakowatz xfer_consumer_accept_format_reply reply2; 31752a38012Sejakowatz xfer_producer_prepare_to_connect msg3; 31852a38012Sejakowatz xfer_producer_prepare_to_connect_reply reply3; 31952a38012Sejakowatz xfer_consumer_connected msg4; 32052a38012Sejakowatz xfer_consumer_connected_reply reply4; 32152a38012Sejakowatz xfer_producer_connect msg5; 32252a38012Sejakowatz xfer_producer_connect_reply reply5; 32352a38012Sejakowatz status_t rv; 32452a38012Sejakowatz port_id port; 32552a38012Sejakowatz int32 code; 32652a38012Sejakowatz 32752a38012Sejakowatz port = _PortPool->GetPort(); 32852a38012Sejakowatz 32952a38012Sejakowatz // BBufferProducer::FormatProposal 33052a38012Sejakowatz msg1.output = from; 33152a38012Sejakowatz msg1.format = *io_format; 33252a38012Sejakowatz msg1.reply_port = port; 33352a38012Sejakowatz rv = write_port(from.port, PRODUCER_FORMAT_PROPOSAL, &msg1, sizeof(msg1)); 33452a38012Sejakowatz if (rv != B_OK) 33552a38012Sejakowatz goto failed; 33652a38012Sejakowatz rv = read_port(port, &code, &reply1, sizeof(reply1)); 33752a38012Sejakowatz if (rv < B_OK) 33852a38012Sejakowatz goto failed; 33952a38012Sejakowatz if (reply1.result != B_OK) { 34052a38012Sejakowatz rv = reply1.result; 34152a38012Sejakowatz goto failed; 34252a38012Sejakowatz } 34352a38012Sejakowatz 34452a38012Sejakowatz // BBufferConsumer::AcceptFormat 34552a38012Sejakowatz msg2.dest = to; 34652a38012Sejakowatz msg2.format = *io_format; 34752a38012Sejakowatz msg2.reply_port = port; 34852a38012Sejakowatz rv = write_port(to.port, CONSUMER_ACCEPT_FORMAT, &msg2, sizeof(msg2)); 34952a38012Sejakowatz if (rv != B_OK) 35052a38012Sejakowatz goto failed; 35152a38012Sejakowatz rv = read_port(port, &code, &reply2, sizeof(reply2)); 35252a38012Sejakowatz if (rv < B_OK) 35352a38012Sejakowatz goto failed; 35452a38012Sejakowatz if (reply2.result != B_OK) { 35552a38012Sejakowatz rv = reply2.result; 35652a38012Sejakowatz goto failed; 35752a38012Sejakowatz } 35852a38012Sejakowatz *io_format = reply2.format; 35952a38012Sejakowatz 36052a38012Sejakowatz // BBufferProducer::PrepareToConnect 36152a38012Sejakowatz msg3.source = from; 36252a38012Sejakowatz msg3.destination = to; 36352a38012Sejakowatz msg3.format = *io_format; 36452a38012Sejakowatz msg3.reply_port = port; 36552a38012Sejakowatz rv = write_port(from.port, PRODUCER_PREPARE_TO_CONNECT, &msg3, sizeof(msg3)); 36652a38012Sejakowatz if (rv != B_OK) 36752a38012Sejakowatz goto failed; 36852a38012Sejakowatz rv = read_port(port, &code, &reply3, sizeof(reply3)); 36952a38012Sejakowatz if (rv < B_OK) 37052a38012Sejakowatz goto failed; 37152a38012Sejakowatz if (reply3.result != B_OK) { 37252a38012Sejakowatz rv = reply3.result; 37352a38012Sejakowatz goto failed; 37452a38012Sejakowatz } 37552a38012Sejakowatz *io_format = reply3.format; 37652a38012Sejakowatz //reply3.out_source; 37752a38012Sejakowatz //reply3.name; 37852a38012Sejakowatz 37952a38012Sejakowatz // BBufferConsumer::Connected 38052a38012Sejakowatz msg4.producer = reply3.out_source; 38152a38012Sejakowatz msg4.where = to; 38252a38012Sejakowatz msg4.with_format = *io_format; 38352a38012Sejakowatz msg4.reply_port = port; 38452a38012Sejakowatz rv = write_port(to.port, CONSUMER_CONNECTED, &msg4, sizeof(msg4)); 38552a38012Sejakowatz if (rv != B_OK) 38652a38012Sejakowatz goto failed; 38752a38012Sejakowatz rv = read_port(port, &code, &reply4, sizeof(reply4)); 38852a38012Sejakowatz if (rv < B_OK) 38952a38012Sejakowatz goto failed; 39052a38012Sejakowatz if (reply4.result != B_OK) { 39152a38012Sejakowatz rv = reply4.result; 39252a38012Sejakowatz goto failed; 39352a38012Sejakowatz } 39452a38012Sejakowatz // reply4.input; 39552a38012Sejakowatz 39652a38012Sejakowatz // BBufferProducer::Connect 39752a38012Sejakowatz msg5.error = B_OK; 39852a38012Sejakowatz msg5.source = reply3.out_source; 39952a38012Sejakowatz msg5.destination = to; 40052a38012Sejakowatz msg5.format = *io_format; 40152a38012Sejakowatz msg5.name[0] = 0; 40252a38012Sejakowatz msg5.reply_port = port; 40352a38012Sejakowatz 40452a38012Sejakowatz rv = write_port(from.port, PRODUCER_CONNECT, &msg5, sizeof(msg5)); 40552a38012Sejakowatz if (rv != B_OK) 40652a38012Sejakowatz goto failed; 40752a38012Sejakowatz rv = read_port(port, &code, &reply5, sizeof(reply5)); 40852a38012Sejakowatz if (rv < B_OK) 40952a38012Sejakowatz goto failed; 41052a38012Sejakowatz 41152a38012Sejakowatz // out_output->node = 41252a38012Sejakowatz out_output->source = reply3.out_source; 41352a38012Sejakowatz out_output->destination = to;//reply4.input; 41452a38012Sejakowatz out_output->format = *io_format; 41552a38012Sejakowatz strcpy(out_output->name,reply5.name); 41652a38012Sejakowatz 41752a38012Sejakowatz // out_input->node 41852a38012Sejakowatz out_input->source = reply3.out_source; 41952a38012Sejakowatz out_input->destination = to;//reply4.input; 42052a38012Sejakowatz out_input->format = *io_format; 42152a38012Sejakowatz strcpy(out_input->name,reply3.name); 42252a38012Sejakowatz 42352a38012Sejakowatz _PortPool->PutPort(port); 42452a38012Sejakowatz return B_OK; 42552a38012Sejakowatz 42652a38012Sejakowatz failed: 42752a38012Sejakowatz _PortPool->PutPort(port); 42852a38012Sejakowatz return rv; 42952a38012Sejakowatz } 43052a38012Sejakowatz 43152a38012Sejakowatz 43252a38012Sejakowatz status_t 43352a38012Sejakowatz BMediaRoster::Disconnect(media_node_id source_node, 43452a38012Sejakowatz const media_source & source, 43552a38012Sejakowatz media_node_id destination_node, 43652a38012Sejakowatz const media_destination & destination) 43752a38012Sejakowatz { 43852a38012Sejakowatz UNIMPLEMENTED(); 43952a38012Sejakowatz return B_ERROR; 44052a38012Sejakowatz } 44152a38012Sejakowatz 44252a38012Sejakowatz 44352a38012Sejakowatz status_t 44452a38012Sejakowatz BMediaRoster::StartNode(const media_node & node, 44552a38012Sejakowatz bigtime_t at_performance_time) 44652a38012Sejakowatz { 44752a38012Sejakowatz CALLED(); 44852a38012Sejakowatz if (node.node == 0) 44952a38012Sejakowatz return B_MEDIA_BAD_NODE; 45052a38012Sejakowatz 45152a38012Sejakowatz xfer_node_start msg; 45252a38012Sejakowatz msg.performance_time = at_performance_time; 45352a38012Sejakowatz 45452a38012Sejakowatz return write_port(node.port, NODE_START, &msg, sizeof(msg)); 45552a38012Sejakowatz } 45652a38012Sejakowatz 45752a38012Sejakowatz 45852a38012Sejakowatz status_t 45952a38012Sejakowatz BMediaRoster::StopNode(const media_node & node, 46052a38012Sejakowatz bigtime_t at_performance_time, 46152a38012Sejakowatz bool immediate) 46252a38012Sejakowatz { 46352a38012Sejakowatz CALLED(); 46452a38012Sejakowatz if (node.node == 0) 46552a38012Sejakowatz return B_MEDIA_BAD_NODE; 46652a38012Sejakowatz 46752a38012Sejakowatz xfer_node_stop msg; 46852a38012Sejakowatz msg.performance_time = at_performance_time; 46952a38012Sejakowatz msg.immediate = immediate; 47052a38012Sejakowatz 47152a38012Sejakowatz return write_port(node.port, NODE_STOP, &msg, sizeof(msg)); 47252a38012Sejakowatz } 47352a38012Sejakowatz 47452a38012Sejakowatz 47552a38012Sejakowatz status_t 47652a38012Sejakowatz BMediaRoster::SeekNode(const media_node & node, 47752a38012Sejakowatz bigtime_t to_media_time, 47852a38012Sejakowatz bigtime_t at_performance_time) 47952a38012Sejakowatz { 48052a38012Sejakowatz CALLED(); 48152a38012Sejakowatz if (node.node == 0) 48252a38012Sejakowatz return B_MEDIA_BAD_NODE; 48352a38012Sejakowatz 48452a38012Sejakowatz xfer_node_seek msg; 48552a38012Sejakowatz msg.media_time = to_media_time; 48652a38012Sejakowatz msg.performance_time = at_performance_time; 48752a38012Sejakowatz 48852a38012Sejakowatz return write_port(node.port, NODE_SEEK, &msg, sizeof(msg)); 48952a38012Sejakowatz } 49052a38012Sejakowatz 49152a38012Sejakowatz 49252a38012Sejakowatz status_t 49352a38012Sejakowatz BMediaRoster::StartTimeSource(const media_node & node, 49452a38012Sejakowatz bigtime_t at_real_time) 49552a38012Sejakowatz { 49652a38012Sejakowatz CALLED(); 49752a38012Sejakowatz if (node.node == 0) 49852a38012Sejakowatz return B_MEDIA_BAD_NODE; 49952a38012Sejakowatz if ((node.kind & B_TIME_SOURCE) == 0) 50052a38012Sejakowatz return B_MEDIA_BAD_NODE; 50152a38012Sejakowatz 50252a38012Sejakowatz BTimeSource::time_source_op_info msg; 50352a38012Sejakowatz msg.op = BTimeSource::B_TIMESOURCE_START; 50452a38012Sejakowatz msg.real_time = at_real_time; 50552a38012Sejakowatz 50652a38012Sejakowatz return write_port(node.port, TIMESOURCE_OP, &msg, sizeof(msg)); 50752a38012Sejakowatz } 50852a38012Sejakowatz 50952a38012Sejakowatz 51052a38012Sejakowatz status_t 51152a38012Sejakowatz BMediaRoster::StopTimeSource(const media_node & node, 51252a38012Sejakowatz bigtime_t at_real_time, 51352a38012Sejakowatz bool immediate) 51452a38012Sejakowatz { 51552a38012Sejakowatz CALLED(); 51652a38012Sejakowatz if (node.node == 0) 51752a38012Sejakowatz return B_MEDIA_BAD_NODE; 51852a38012Sejakowatz if ((node.kind & B_TIME_SOURCE) == 0) 51952a38012Sejakowatz return B_MEDIA_BAD_NODE; 52052a38012Sejakowatz 52152a38012Sejakowatz BTimeSource::time_source_op_info msg; 52252a38012Sejakowatz msg.op = immediate ? BTimeSource::B_TIMESOURCE_STOP_IMMEDIATELY : BTimeSource::B_TIMESOURCE_STOP; 52352a38012Sejakowatz msg.real_time = at_real_time; 52452a38012Sejakowatz 52552a38012Sejakowatz return write_port(node.port, TIMESOURCE_OP, &msg, sizeof(msg)); 52652a38012Sejakowatz } 52752a38012Sejakowatz 52852a38012Sejakowatz 52952a38012Sejakowatz status_t 53052a38012Sejakowatz BMediaRoster::SeekTimeSource(const media_node & node, 53152a38012Sejakowatz bigtime_t to_performance_time, 53252a38012Sejakowatz bigtime_t at_real_time) 53352a38012Sejakowatz { 53452a38012Sejakowatz CALLED(); 53552a38012Sejakowatz if (node.node == 0) 53652a38012Sejakowatz return B_MEDIA_BAD_NODE; 53752a38012Sejakowatz if ((node.kind & B_TIME_SOURCE) == 0) 53852a38012Sejakowatz return B_MEDIA_BAD_NODE; 53952a38012Sejakowatz 54052a38012Sejakowatz BTimeSource::time_source_op_info msg; 54152a38012Sejakowatz msg.op = BTimeSource::B_TIMESOURCE_SEEK; 54252a38012Sejakowatz msg.real_time = at_real_time; 54352a38012Sejakowatz msg.performance_time = to_performance_time; 54452a38012Sejakowatz 54552a38012Sejakowatz return write_port(node.port, TIMESOURCE_OP, &msg, sizeof(msg)); 54652a38012Sejakowatz } 54752a38012Sejakowatz 54852a38012Sejakowatz 54952a38012Sejakowatz status_t 55052a38012Sejakowatz BMediaRoster::SyncToNode(const media_node & node, 55152a38012Sejakowatz bigtime_t at_time, 55252a38012Sejakowatz bigtime_t timeout) 55352a38012Sejakowatz { 55452a38012Sejakowatz UNIMPLEMENTED(); 55552a38012Sejakowatz return B_ERROR; 55652a38012Sejakowatz } 55752a38012Sejakowatz 55852a38012Sejakowatz 55952a38012Sejakowatz status_t 56052a38012Sejakowatz BMediaRoster::SetRunModeNode(const media_node & node, 56152a38012Sejakowatz BMediaNode::run_mode mode) 56252a38012Sejakowatz { 56352a38012Sejakowatz CALLED(); 56452a38012Sejakowatz if (node.node == 0) 56552a38012Sejakowatz return B_MEDIA_BAD_NODE; 56652a38012Sejakowatz 56752a38012Sejakowatz xfer_node_set_run_mode msg; 56852a38012Sejakowatz msg.mode = mode; 56952a38012Sejakowatz 57052a38012Sejakowatz return write_port(node.port, NODE_SET_RUN_MODE, &msg, sizeof(msg)); 57152a38012Sejakowatz } 57252a38012Sejakowatz 57352a38012Sejakowatz 57452a38012Sejakowatz status_t 57552a38012Sejakowatz BMediaRoster::PrerollNode(const media_node & node) 57652a38012Sejakowatz { 57752a38012Sejakowatz CALLED(); 57852a38012Sejakowatz if (node.node == 0) 57952a38012Sejakowatz return B_MEDIA_BAD_NODE; 58052a38012Sejakowatz 58152a38012Sejakowatz char dummy; 58252a38012Sejakowatz return write_port(node.port, NODE_PREROLL, &dummy, sizeof(dummy)); 58352a38012Sejakowatz } 58452a38012Sejakowatz 58552a38012Sejakowatz 58652a38012Sejakowatz status_t 58752a38012Sejakowatz BMediaRoster::RollNode(const media_node & node, 58852a38012Sejakowatz bigtime_t startPerformance, 58952a38012Sejakowatz bigtime_t stopPerformance, 59052a38012Sejakowatz bigtime_t atMediaTime) 59152a38012Sejakowatz { 59252a38012Sejakowatz UNIMPLEMENTED(); 59352a38012Sejakowatz return B_ERROR; 59452a38012Sejakowatz } 59552a38012Sejakowatz 59652a38012Sejakowatz 59752a38012Sejakowatz status_t 59852a38012Sejakowatz BMediaRoster::SetProducerRunModeDelay(const media_node & node, 59952a38012Sejakowatz bigtime_t delay, 60052a38012Sejakowatz BMediaNode::run_mode mode) 60152a38012Sejakowatz { 60252a38012Sejakowatz UNIMPLEMENTED(); 60352a38012Sejakowatz return B_ERROR; 60452a38012Sejakowatz } 60552a38012Sejakowatz 60652a38012Sejakowatz 60752a38012Sejakowatz status_t 60852a38012Sejakowatz BMediaRoster::SetProducerRate(const media_node & producer, 60952a38012Sejakowatz int32 numer, 61052a38012Sejakowatz int32 denom) 61152a38012Sejakowatz { 61252a38012Sejakowatz CALLED(); 61352a38012Sejakowatz if (producer.node == 0) 61452a38012Sejakowatz return B_MEDIA_BAD_NODE; 61552a38012Sejakowatz if ((producer.kind & B_BUFFER_PRODUCER) == 0) 61652a38012Sejakowatz return B_MEDIA_BAD_NODE; 61752a38012Sejakowatz 61852a38012Sejakowatz xfer_producer_set_play_rate msg; 61952a38012Sejakowatz xfer_producer_set_play_rate_reply reply; 62052a38012Sejakowatz status_t rv; 62152a38012Sejakowatz int32 code; 62252a38012Sejakowatz 62352a38012Sejakowatz msg.numer = numer; 62452a38012Sejakowatz msg.denom = denom; 62552a38012Sejakowatz msg.reply_port = _PortPool->GetPort(); 62652a38012Sejakowatz rv = write_port(producer.node, PRODUCER_SET_PLAY_RATE, &msg, sizeof(msg)); 62752a38012Sejakowatz if (rv != B_OK) { 62852a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 62952a38012Sejakowatz return rv; 63052a38012Sejakowatz } 63152a38012Sejakowatz rv = read_port(msg.reply_port, &code, &reply, sizeof(reply)); 63252a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 63352a38012Sejakowatz return (rv < B_OK) ? rv : reply.result; 63452a38012Sejakowatz } 63552a38012Sejakowatz 63652a38012Sejakowatz 63752a38012Sejakowatz 63852a38012Sejakowatz /* Nodes will have available inputs/outputs as long as they are capable */ 63952a38012Sejakowatz /* of accepting more connections. The node may create an additional */ 64052a38012Sejakowatz /* output or input as the currently available is taken into usage. */ 64152a38012Sejakowatz status_t 64252a38012Sejakowatz BMediaRoster::GetLiveNodeInfo(const media_node & node, 64352a38012Sejakowatz live_node_info * out_live_info) 64452a38012Sejakowatz { 64552a38012Sejakowatz UNIMPLEMENTED(); 64652a38012Sejakowatz return B_ERROR; 64752a38012Sejakowatz } 64852a38012Sejakowatz 64952a38012Sejakowatz 65052a38012Sejakowatz status_t 65152a38012Sejakowatz BMediaRoster::GetLiveNodes(live_node_info * out_live_nodes, 65252a38012Sejakowatz int32 * io_total_count, 65352a38012Sejakowatz const media_format * has_input, 65452a38012Sejakowatz const media_format * has_output, 65552a38012Sejakowatz const char * name, 65652a38012Sejakowatz uint64 node_kinds) 65752a38012Sejakowatz { 65852a38012Sejakowatz UNIMPLEMENTED(); 65952a38012Sejakowatz return B_ERROR; 66052a38012Sejakowatz } 66152a38012Sejakowatz 66252a38012Sejakowatz 66352a38012Sejakowatz status_t 66452a38012Sejakowatz BMediaRoster::GetFreeInputsFor(const media_node & node, 66552a38012Sejakowatz media_input * out_free_inputs, 66652a38012Sejakowatz int32 buf_num_inputs, 66752a38012Sejakowatz int32 * out_total_count, 66852a38012Sejakowatz media_type filter_type) 66952a38012Sejakowatz { 67052a38012Sejakowatz UNIMPLEMENTED(); 67152a38012Sejakowatz return B_ERROR; 67252a38012Sejakowatz } 67352a38012Sejakowatz 67452a38012Sejakowatz 67552a38012Sejakowatz status_t 67652a38012Sejakowatz BMediaRoster::GetConnectedInputsFor(const media_node & node, 67752a38012Sejakowatz media_input * out_active_inputs, 67852a38012Sejakowatz int32 buf_num_inputs, 67952a38012Sejakowatz int32 * out_total_count) 68052a38012Sejakowatz { 68152a38012Sejakowatz UNIMPLEMENTED(); 68252a38012Sejakowatz return B_ERROR; 68352a38012Sejakowatz } 68452a38012Sejakowatz 68552a38012Sejakowatz 68652a38012Sejakowatz status_t 68752a38012Sejakowatz BMediaRoster::GetAllInputsFor(const media_node & node, 68852a38012Sejakowatz media_input * out_inputs, 68952a38012Sejakowatz int32 buf_num_inputs, 69052a38012Sejakowatz int32 * out_total_count) 69152a38012Sejakowatz { 69252a38012Sejakowatz CALLED(); 69352a38012Sejakowatz if (node.node == 0 || (node.kind & B_BUFFER_CONSUMER) == 0) 69452a38012Sejakowatz return B_MEDIA_BAD_NODE; 69552a38012Sejakowatz if (out_inputs == NULL || out_total_count == NULL) 69652a38012Sejakowatz return B_BAD_VALUE; 69752a38012Sejakowatz 69852a38012Sejakowatz status_t rv; 69952a38012Sejakowatz status_t rv2; 70052a38012Sejakowatz port_id port; 70152a38012Sejakowatz int32 code; 70252a38012Sejakowatz int32 cookie; 70352a38012Sejakowatz 70452a38012Sejakowatz port = _PortPool->GetPort(); 70552a38012Sejakowatz *out_total_count = 0; 70652a38012Sejakowatz cookie = 0; 707b6de9d11Sbeveloper rv = B_OK; 70852a38012Sejakowatz for (int32 i = 0; i < buf_num_inputs; i++) { 70952a38012Sejakowatz xfer_consumer_get_next_input msg; 71052a38012Sejakowatz xfer_consumer_get_next_input_reply reply; 71152a38012Sejakowatz msg.cookie = cookie; 71252a38012Sejakowatz msg.reply_port = port; 71352a38012Sejakowatz rv = write_port(node.port, CONSUMER_GET_NEXT_INPUT, &msg, sizeof(msg)); 71452a38012Sejakowatz if (rv != B_OK) 71552a38012Sejakowatz break; 71652a38012Sejakowatz rv = read_port(msg.reply_port, &code, &reply, sizeof(reply)); 71752a38012Sejakowatz if (rv < B_OK || reply.result != B_OK) 71852a38012Sejakowatz break; 71952a38012Sejakowatz *out_total_count += 1; 72052a38012Sejakowatz out_inputs[i] = reply.input; 72152a38012Sejakowatz cookie = reply.cookie; 72252a38012Sejakowatz } 72352a38012Sejakowatz _PortPool->PutPort(port); 72452a38012Sejakowatz 72552a38012Sejakowatz xfer_consumer_dispose_input_cookie msg2; 72652a38012Sejakowatz msg2.cookie = cookie; 72752a38012Sejakowatz rv2 = write_port(node.port, CONSUMER_DISPOSE_INPUT_COOKIE, &msg2, sizeof(msg2)); 72852a38012Sejakowatz 72952a38012Sejakowatz return (rv < B_OK) ? rv : rv2; 73052a38012Sejakowatz } 73152a38012Sejakowatz 73252a38012Sejakowatz 73352a38012Sejakowatz status_t 73452a38012Sejakowatz BMediaRoster::GetFreeOutputsFor(const media_node & node, 73552a38012Sejakowatz media_output * out_free_outputs, 73652a38012Sejakowatz int32 buf_num_outputs, 73752a38012Sejakowatz int32 * out_total_count, 73852a38012Sejakowatz media_type filter_type) 73952a38012Sejakowatz { 74052a38012Sejakowatz UNIMPLEMENTED(); 74152a38012Sejakowatz return B_ERROR; 74252a38012Sejakowatz } 74352a38012Sejakowatz 74452a38012Sejakowatz 74552a38012Sejakowatz status_t 74652a38012Sejakowatz BMediaRoster::GetConnectedOutputsFor(const media_node & node, 74752a38012Sejakowatz media_output * out_active_outputs, 74852a38012Sejakowatz int32 buf_num_outputs, 74952a38012Sejakowatz int32 * out_total_count) 75052a38012Sejakowatz { 75152a38012Sejakowatz UNIMPLEMENTED(); 75252a38012Sejakowatz return B_ERROR; 75352a38012Sejakowatz } 75452a38012Sejakowatz 75552a38012Sejakowatz 75652a38012Sejakowatz status_t 75752a38012Sejakowatz BMediaRoster::GetAllOutputsFor(const media_node & node, 75852a38012Sejakowatz media_output * out_outputs, 75952a38012Sejakowatz int32 buf_num_outputs, 76052a38012Sejakowatz int32 * out_total_count) 76152a38012Sejakowatz { 76252a38012Sejakowatz CALLED(); 76352a38012Sejakowatz if (node.node == 0 || (node.kind & B_BUFFER_PRODUCER) == 0) 76452a38012Sejakowatz return B_MEDIA_BAD_NODE; 76552a38012Sejakowatz if (out_outputs == NULL || out_total_count == NULL) 76652a38012Sejakowatz return B_BAD_VALUE; 76752a38012Sejakowatz 76852a38012Sejakowatz status_t rv; 76952a38012Sejakowatz status_t rv2; 77052a38012Sejakowatz port_id port; 77152a38012Sejakowatz int32 code; 77252a38012Sejakowatz int32 cookie; 77352a38012Sejakowatz 77452a38012Sejakowatz port = _PortPool->GetPort(); 77552a38012Sejakowatz *out_total_count = 0; 77652a38012Sejakowatz cookie = 0; 777b6de9d11Sbeveloper rv = B_OK; 77852a38012Sejakowatz for (int32 i = 0; i < buf_num_outputs; i++) { 77952a38012Sejakowatz xfer_producer_get_next_output msg; 78052a38012Sejakowatz xfer_producer_get_next_output_reply reply; 78152a38012Sejakowatz msg.cookie = cookie; 78252a38012Sejakowatz msg.reply_port = port; 78352a38012Sejakowatz rv = write_port(node.port, PRODUCER_GET_NEXT_OUTPUT, &msg, sizeof(msg)); 78452a38012Sejakowatz if (rv != B_OK) 78552a38012Sejakowatz break; 78652a38012Sejakowatz rv = read_port(msg.reply_port, &code, &reply, sizeof(reply)); 78752a38012Sejakowatz if (rv < B_OK || reply.result != B_OK) 78852a38012Sejakowatz break; 78952a38012Sejakowatz *out_total_count += 1; 79052a38012Sejakowatz out_outputs[i] = reply.output; 79152a38012Sejakowatz cookie = reply.cookie; 79252a38012Sejakowatz } 79352a38012Sejakowatz _PortPool->PutPort(port); 79452a38012Sejakowatz 79552a38012Sejakowatz xfer_producer_dispose_output_cookie msg2; 79652a38012Sejakowatz msg2.cookie = cookie; 79752a38012Sejakowatz rv2 = write_port(node.port, PRODUCER_DISPOSE_OUTPUT_COOKIE, &msg2, sizeof(msg2)); 79852a38012Sejakowatz 79952a38012Sejakowatz return (rv < B_OK) ? rv : rv2; 80052a38012Sejakowatz } 80152a38012Sejakowatz 80252a38012Sejakowatz 80352a38012Sejakowatz status_t 80452a38012Sejakowatz BMediaRoster::StartWatching(const BMessenger & where) 80552a38012Sejakowatz { 806eae26d3dSbeveloper CALLED(); 807eae26d3dSbeveloper if (!where.IsValid()) { 808eae26d3dSbeveloper TRACE("BMediaRoster::StartWatching: messenger invalid!\n"); 809eae26d3dSbeveloper return B_BAD_VALUE; 810eae26d3dSbeveloper } 811*f4925104Sbeveloper return BPrivate::media::notifications::Register(where, media_node::null, B_MEDIA_WILDCARD); 81252a38012Sejakowatz } 81352a38012Sejakowatz 81452a38012Sejakowatz 81552a38012Sejakowatz status_t 81652a38012Sejakowatz BMediaRoster::StartWatching(const BMessenger & where, 81752a38012Sejakowatz int32 notificationType) 81852a38012Sejakowatz { 819eae26d3dSbeveloper CALLED(); 820eae26d3dSbeveloper if (!where.IsValid()) { 821eae26d3dSbeveloper TRACE("BMediaRoster::StartWatching: messenger invalid!\n"); 822eae26d3dSbeveloper return B_BAD_VALUE; 823eae26d3dSbeveloper } 824*f4925104Sbeveloper if (false == BPrivate::media::notifications::IsValidNotificationRequest(false, notificationType)) { 825eae26d3dSbeveloper TRACE("BMediaRoster::StartWatching: notificationType invalid!\n"); 826eae26d3dSbeveloper return B_BAD_VALUE; 827eae26d3dSbeveloper } 828*f4925104Sbeveloper return BPrivate::media::notifications::Register(where, media_node::null, notificationType); 82952a38012Sejakowatz } 83052a38012Sejakowatz 83152a38012Sejakowatz 83252a38012Sejakowatz status_t 83352a38012Sejakowatz BMediaRoster::StartWatching(const BMessenger & where, 83452a38012Sejakowatz const media_node & node, 83552a38012Sejakowatz int32 notificationType) 83652a38012Sejakowatz { 837eae26d3dSbeveloper CALLED(); 838eae26d3dSbeveloper if (!where.IsValid()) { 839eae26d3dSbeveloper TRACE("BMediaRoster::StartWatching: messenger invalid!\n"); 840eae26d3dSbeveloper return B_BAD_VALUE; 841eae26d3dSbeveloper } 842eae26d3dSbeveloper if (node.node == 0) { 843eae26d3dSbeveloper TRACE("BMediaRoster::StartWatching: node invalid!\n"); 844eae26d3dSbeveloper return B_MEDIA_BAD_NODE; 845eae26d3dSbeveloper } 846*f4925104Sbeveloper if (false == BPrivate::media::notifications::IsValidNotificationRequest(true, notificationType)) { 847eae26d3dSbeveloper TRACE("BMediaRoster::StartWatching: notificationType invalid!\n"); 848eae26d3dSbeveloper return B_BAD_VALUE; 849eae26d3dSbeveloper } 850*f4925104Sbeveloper return BPrivate::media::notifications::Register(where, node, notificationType); 85152a38012Sejakowatz } 85252a38012Sejakowatz 85352a38012Sejakowatz 85452a38012Sejakowatz status_t 85552a38012Sejakowatz BMediaRoster::StopWatching(const BMessenger & where) 85652a38012Sejakowatz { 857eae26d3dSbeveloper CALLED(); 858eae26d3dSbeveloper // messenger may already be invalid, so we don't check this 859*f4925104Sbeveloper return BPrivate::media::notifications::Unregister(where, media_node::null, B_MEDIA_WILDCARD); 86052a38012Sejakowatz } 86152a38012Sejakowatz 86252a38012Sejakowatz 86352a38012Sejakowatz status_t 86452a38012Sejakowatz BMediaRoster::StopWatching(const BMessenger & where, 86552a38012Sejakowatz int32 notificationType) 86652a38012Sejakowatz { 867eae26d3dSbeveloper CALLED(); 868eae26d3dSbeveloper // messenger may already be invalid, so we don't check this 869*f4925104Sbeveloper if (false == BPrivate::media::notifications::IsValidNotificationRequest(false, notificationType)) { 870eae26d3dSbeveloper TRACE("BMediaRoster::StopWatching: notificationType invalid!\n"); 871eae26d3dSbeveloper return B_BAD_VALUE; 872eae26d3dSbeveloper } 873*f4925104Sbeveloper return BPrivate::media::notifications::Unregister(where, media_node::null, notificationType); 87452a38012Sejakowatz } 87552a38012Sejakowatz 87652a38012Sejakowatz 87752a38012Sejakowatz status_t 87852a38012Sejakowatz BMediaRoster::StopWatching(const BMessenger & where, 87952a38012Sejakowatz const media_node & node, 88052a38012Sejakowatz int32 notificationType) 88152a38012Sejakowatz { 882eae26d3dSbeveloper CALLED(); 883eae26d3dSbeveloper // messenger may already be invalid, so we don't check this 884eae26d3dSbeveloper if (node.node == 0) { 885eae26d3dSbeveloper TRACE("BMediaRoster::StopWatching: node invalid!\n"); 886eae26d3dSbeveloper return B_MEDIA_BAD_NODE; 887eae26d3dSbeveloper } 888*f4925104Sbeveloper if (false == BPrivate::media::notifications::IsValidNotificationRequest(true, notificationType)) { 889eae26d3dSbeveloper TRACE("BMediaRoster::StopWatching: notificationType invalid!\n"); 890eae26d3dSbeveloper return B_BAD_VALUE; 891eae26d3dSbeveloper } 892*f4925104Sbeveloper return BPrivate::media::notifications::Unregister(where, node, notificationType); 89352a38012Sejakowatz } 89452a38012Sejakowatz 89552a38012Sejakowatz 89652a38012Sejakowatz status_t 89752a38012Sejakowatz BMediaRoster::RegisterNode(BMediaNode * node) 89852a38012Sejakowatz { 89952a38012Sejakowatz CALLED(); 90052a38012Sejakowatz if (node == NULL) 90152a38012Sejakowatz return B_BAD_VALUE; 90252a38012Sejakowatz 90352a38012Sejakowatz xfer_node_registered msg; 90452a38012Sejakowatz msg.node_id = 1; 90552a38012Sejakowatz 90652a38012Sejakowatz return node->HandleMessage(NODE_REGISTERED,&msg,sizeof(msg)); 90752a38012Sejakowatz } 90852a38012Sejakowatz 90952a38012Sejakowatz 91052a38012Sejakowatz status_t 91152a38012Sejakowatz BMediaRoster::UnregisterNode(BMediaNode * node) 91252a38012Sejakowatz { 91352a38012Sejakowatz UNIMPLEMENTED(); 91452a38012Sejakowatz return B_ERROR; 91552a38012Sejakowatz } 91652a38012Sejakowatz 91752a38012Sejakowatz 91852a38012Sejakowatz // thread safe for multiple calls to Roster() 91952a38012Sejakowatz /* static */ BMediaRoster * 92052a38012Sejakowatz BMediaRoster::Roster(status_t* out_error) 92152a38012Sejakowatz { 92252a38012Sejakowatz CALLED(); 92352a38012Sejakowatz static BLocker locker("BMediaRoster::Roster locker"); 92452a38012Sejakowatz locker.Lock(); 92552a38012Sejakowatz if (_sDefault == NULL) { 92652a38012Sejakowatz _sDefault = new BMediaRoster(); 92752a38012Sejakowatz if (out_error != NULL) 92852a38012Sejakowatz *out_error = B_OK; 92952a38012Sejakowatz } else { 93052a38012Sejakowatz if (out_error != NULL) 93152a38012Sejakowatz *out_error = B_OK; 93252a38012Sejakowatz } 93352a38012Sejakowatz locker.Unlock(); 93452a38012Sejakowatz return _sDefault; 93552a38012Sejakowatz } 93652a38012Sejakowatz 93752a38012Sejakowatz 93852a38012Sejakowatz // won't create it if there isn't one 93952a38012Sejakowatz // not thread safe if you call Roster() at the same time 94052a38012Sejakowatz /* static */ BMediaRoster * 94152a38012Sejakowatz BMediaRoster::CurrentRoster() 94252a38012Sejakowatz { 94352a38012Sejakowatz CALLED(); 94452a38012Sejakowatz return _sDefault; 94552a38012Sejakowatz } 94652a38012Sejakowatz 94752a38012Sejakowatz 94852a38012Sejakowatz status_t 94952a38012Sejakowatz BMediaRoster::SetTimeSourceFor(media_node_id node, 95052a38012Sejakowatz media_node_id time_source) 95152a38012Sejakowatz { 95252a38012Sejakowatz UNIMPLEMENTED(); 95352a38012Sejakowatz return B_ERROR; 95452a38012Sejakowatz } 95552a38012Sejakowatz 95652a38012Sejakowatz 95752a38012Sejakowatz status_t 95852a38012Sejakowatz BMediaRoster::GetParameterWebFor(const media_node & node, 95952a38012Sejakowatz BParameterWeb ** out_web) 96052a38012Sejakowatz { 96152a38012Sejakowatz UNIMPLEMENTED(); 96252a38012Sejakowatz return B_ERROR; 96352a38012Sejakowatz } 96452a38012Sejakowatz 96552a38012Sejakowatz 96652a38012Sejakowatz status_t 96752a38012Sejakowatz BMediaRoster::StartControlPanel(const media_node & node, 96852a38012Sejakowatz BMessenger * out_messenger) 96952a38012Sejakowatz { 97052a38012Sejakowatz UNIMPLEMENTED(); 97152a38012Sejakowatz return B_ERROR; 97252a38012Sejakowatz } 97352a38012Sejakowatz 97452a38012Sejakowatz 97552a38012Sejakowatz status_t 97652a38012Sejakowatz BMediaRoster::GetDormantNodes(dormant_node_info * out_info, 97752a38012Sejakowatz int32 * io_count, 97852a38012Sejakowatz const media_format * has_input /* = NULL */, 97952a38012Sejakowatz const media_format * has_output /* = NULL */, 98052a38012Sejakowatz const char * name /* = NULL */, 98152a38012Sejakowatz uint64 require_kinds /* = NULL */, 98252a38012Sejakowatz uint64 deny_kinds /* = NULL */) 98352a38012Sejakowatz { 98452a38012Sejakowatz CALLED(); 98552a38012Sejakowatz if (out_info == NULL) 98652a38012Sejakowatz return B_BAD_VALUE; 98752a38012Sejakowatz if (io_count == NULL) 98852a38012Sejakowatz return B_BAD_VALUE; 98952a38012Sejakowatz if (*io_count <= 0) 99052a38012Sejakowatz return B_BAD_VALUE; 99152a38012Sejakowatz 99252a38012Sejakowatz xfer_server_get_dormant_nodes msg; 99352a38012Sejakowatz port_id port; 99452a38012Sejakowatz status_t rv; 99552a38012Sejakowatz 99652a38012Sejakowatz port = find_port("media_server port"); 99752a38012Sejakowatz if (port <= B_OK) 99852a38012Sejakowatz return B_ERROR; 99952a38012Sejakowatz 100052a38012Sejakowatz msg.maxcount = *io_count; 100152a38012Sejakowatz msg.has_input = (bool) has_input; 100252a38012Sejakowatz if (has_input) 100352a38012Sejakowatz msg.inputformat = *has_input; // XXX we should not make a flat copy of media_format 100452a38012Sejakowatz msg.has_output = (bool) has_output; 100552a38012Sejakowatz if (has_output) 100652a38012Sejakowatz msg.outputformat = *has_output;; // XXX we should not make a flat copy of media_format 100752a38012Sejakowatz msg.has_name = (bool) name; 100852a38012Sejakowatz if (name) { 100952a38012Sejakowatz int len = min_c(strlen(name),sizeof(msg.name) - 1); 101052a38012Sejakowatz memcpy(msg.name,name,len); 101152a38012Sejakowatz msg.name[len] = 0; 101252a38012Sejakowatz } 101352a38012Sejakowatz msg.require_kinds = require_kinds; 101452a38012Sejakowatz msg.deny_kinds = deny_kinds; 101552a38012Sejakowatz msg.reply_port = _PortPool->GetPort(); 101652a38012Sejakowatz 101752a38012Sejakowatz rv = write_port(port, SERVER_GET_DORMANT_NODES, &msg, sizeof(msg)); 101852a38012Sejakowatz if (rv != B_OK) { 101952a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 102052a38012Sejakowatz return rv; 102152a38012Sejakowatz } 102252a38012Sejakowatz 102352a38012Sejakowatz xfer_server_get_dormant_nodes_reply reply; 102452a38012Sejakowatz int32 code; 102552a38012Sejakowatz 102652a38012Sejakowatz rv = read_port(msg.reply_port, &code, &reply, sizeof(reply)); 102752a38012Sejakowatz if (rv < B_OK) { 102852a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 102952a38012Sejakowatz return rv; 103052a38012Sejakowatz } 103152a38012Sejakowatz 103252a38012Sejakowatz *io_count = reply.count; 103352a38012Sejakowatz 103452a38012Sejakowatz if (*io_count > 0) { 103552a38012Sejakowatz rv = read_port(msg.reply_port, &code, out_info, *io_count * sizeof(dormant_node_info)); 103652a38012Sejakowatz if (rv < B_OK) 103752a38012Sejakowatz reply.result = rv; 103852a38012Sejakowatz } 103952a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 104052a38012Sejakowatz 104152a38012Sejakowatz return reply.result; 104252a38012Sejakowatz } 104352a38012Sejakowatz 104452a38012Sejakowatz 104552a38012Sejakowatz status_t 104652a38012Sejakowatz BMediaRoster::InstantiateDormantNode(const dormant_node_info & in_info, 104752a38012Sejakowatz media_node * out_node, 104852a38012Sejakowatz uint32 flags /* currently B_FLAVOR_IS_GLOBAL or B_FLAVOR_IS_LOCAL */ ) 104952a38012Sejakowatz { 105052a38012Sejakowatz CALLED(); 105152a38012Sejakowatz if ((flags & (B_FLAVOR_IS_GLOBAL | B_FLAVOR_IS_LOCAL)) == 0) { 105252a38012Sejakowatz printf("Error: BMediaRoster::InstantiateDormantNode called without flags\n"); 105352a38012Sejakowatz return B_BAD_VALUE; 105452a38012Sejakowatz } 105552a38012Sejakowatz if (out_node == 0) 105652a38012Sejakowatz return B_BAD_VALUE; 105752a38012Sejakowatz 105852a38012Sejakowatz // XXX we should not trust the values passed in by the user, 105952a38012Sejakowatz // XXX and ask the server to determine where to insta 106052a38012Sejakowatz 1061e0207628Sbeveloper 1062e0207628Sbeveloper // XXX SOMETHING IS VERY WRONG HERE 1063e0207628Sbeveloper // if ((in_info.flavor_flags & B_FLAVOR_IS_GLOBAL) == 0 && (flags & B_FLAVOR_IS_LOCAL)) { 1064e0207628Sbeveloper if (flags & B_FLAVOR_IS_LOCAL) { 106552a38012Sejakowatz return InstantiateDormantNode(in_info,out_node); 106652a38012Sejakowatz } 106752a38012Sejakowatz 1068e0207628Sbeveloper // XXX SOMETHING IS VERY WRONG HERE 1069e0207628Sbeveloper // if ((in_info.flavor_flags & B_FLAVOR_IS_GLOBAL) || (flags & B_FLAVOR_IS_GLOBAL)) { 1070e0207628Sbeveloper if (flags & B_FLAVOR_IS_GLOBAL) { 107152a38012Sejakowatz // forward this request into the media_addon_server, 107252a38012Sejakowatz // which in turn will call InstantiateDormantNode() 107352a38012Sejakowatz // to create it there localy 1074*f4925104Sbeveloper request_addonserver_instantiate_dormant_node request; 1075*f4925104Sbeveloper reply_addonserver_instantiate_dormant_node reply; 107652a38012Sejakowatz status_t rv; 1077*f4925104Sbeveloper 1078*f4925104Sbeveloper request.info = in_info; 1079*f4925104Sbeveloper rv = QueryAddonServer(ADDONSERVER_INSTANTIATE_DORMANT_NODE, &request, sizeof(request), &reply, sizeof(reply)); 1080*f4925104Sbeveloper if (rv == B_OK) { 108152a38012Sejakowatz *out_node = reply.node; 1082*f4925104Sbeveloper } 1083*f4925104Sbeveloper return rv; 108452a38012Sejakowatz } 108552a38012Sejakowatz 1086e0207628Sbeveloper // XXX SOMETHING IS VERY WRONG HERE 1087e0207628Sbeveloper // printf("Error: BMediaRoster::InstantiateDormantNode in_info.flavor_flags = %#08lx, flags = %#08lx\n", in_info.flavor_flags, flags); 108852a38012Sejakowatz 108952a38012Sejakowatz return B_ERROR; 109052a38012Sejakowatz } 109152a38012Sejakowatz 109252a38012Sejakowatz 109352a38012Sejakowatz status_t 109452a38012Sejakowatz BMediaRoster::InstantiateDormantNode(const dormant_node_info & in_info, 109552a38012Sejakowatz media_node * out_node) 109652a38012Sejakowatz { 109716b7eea4Sbeveloper CALLED(); 109852a38012Sejakowatz 109952a38012Sejakowatz // to instantiate a dormant node in the current address space, we need to 110052a38012Sejakowatz // either load the add-on from file and create a new BMediaAddOn class, or 110152a38012Sejakowatz // reuse the cached BMediaAddOn from a previous call 110252a38012Sejakowatz // call BMediaAddOn::InstantiateNodeFor() 110352a38012Sejakowatz // and cache the BMediaAddOn after that for later reuse. 110452a38012Sejakowatz // BeOS R5 does not seem to delete it when the application quits 110552a38012Sejakowatz // if B_FLAVOR_IS_GLOBAL, we need to use the BMediaAddOn object that 110652a38012Sejakowatz // resides in the media_addon_server 110752a38012Sejakowatz 110852a38012Sejakowatz // RegisterNode() is called automatically for nodes instantiated from add-ons 110952a38012Sejakowatz 111016b7eea4Sbeveloper //XXX TEST! 111116b7eea4Sbeveloper BMediaAddOn *addon; 111216b7eea4Sbeveloper BMediaNode *node; 111316b7eea4Sbeveloper BMessage config; 111416b7eea4Sbeveloper status_t out_error; 111516b7eea4Sbeveloper addon = _DormantNodeManager->GetAddon(in_info.addon); 111616b7eea4Sbeveloper if (!addon) { 111716b7eea4Sbeveloper printf("BMediaRoster::InstantiateDormantNode: GetAddon failed\n"); 111852a38012Sejakowatz return B_ERROR; 111952a38012Sejakowatz } 112016b7eea4Sbeveloper flavor_info temp; 112116b7eea4Sbeveloper temp.internal_id = in_info.flavor_id; 112216b7eea4Sbeveloper node = addon->InstantiateNodeFor(&temp, &config, &out_error); 112316b7eea4Sbeveloper if (!node) { 112416b7eea4Sbeveloper printf("BMediaRoster::InstantiateDormantNode: InstantiateNodeFor failed\n"); 112516b7eea4Sbeveloper _DormantNodeManager->PutAddon(in_info.addon); 112616b7eea4Sbeveloper return B_ERROR; 112716b7eea4Sbeveloper } 112816b7eea4Sbeveloper *out_node = node->Node(); 112916b7eea4Sbeveloper return B_OK; 113016b7eea4Sbeveloper } 113152a38012Sejakowatz 113252a38012Sejakowatz 113352a38012Sejakowatz status_t 113452a38012Sejakowatz BMediaRoster::GetDormantNodeFor(const media_node & node, 113552a38012Sejakowatz dormant_node_info * out_info) 113652a38012Sejakowatz { 113752a38012Sejakowatz UNIMPLEMENTED(); 113852a38012Sejakowatz 113952a38012Sejakowatz return B_ERROR; 114052a38012Sejakowatz } 114152a38012Sejakowatz 114252a38012Sejakowatz 114352a38012Sejakowatz status_t 114452a38012Sejakowatz BMediaRoster::GetDormantFlavorInfoFor(const dormant_node_info & in_dormant, 114552a38012Sejakowatz dormant_flavor_info * out_flavor) 114652a38012Sejakowatz { 114752a38012Sejakowatz CALLED(); 114852a38012Sejakowatz 114952a38012Sejakowatz xfer_server_get_dormant_flavor_info msg; 115052a38012Sejakowatz xfer_server_get_dormant_flavor_info_reply *reply; 115152a38012Sejakowatz port_id port; 115252a38012Sejakowatz status_t rv; 115352a38012Sejakowatz int32 code; 115452a38012Sejakowatz 115552a38012Sejakowatz port = find_port("media_server port"); 115652a38012Sejakowatz if (port <= B_OK) 115752a38012Sejakowatz return B_ERROR; 115852a38012Sejakowatz 115952a38012Sejakowatz reply = (xfer_server_get_dormant_flavor_info_reply *) malloc(16000); 116052a38012Sejakowatz if (reply == 0) 116152a38012Sejakowatz return B_ERROR; 116252a38012Sejakowatz 116352a38012Sejakowatz msg.addon = in_dormant.addon; 116452a38012Sejakowatz msg.flavor_id = in_dormant.flavor_id; 116552a38012Sejakowatz msg.reply_port = _PortPool->GetPort(); 116652a38012Sejakowatz rv = write_port(port, SERVER_GET_DORMANT_FLAVOR_INFO, &msg, sizeof(msg)); 116752a38012Sejakowatz if (rv != B_OK) { 116852a38012Sejakowatz free(reply); 116952a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 117052a38012Sejakowatz return rv; 117152a38012Sejakowatz } 117252a38012Sejakowatz rv = read_port(msg.reply_port, &code, reply, 16000); 117352a38012Sejakowatz _PortPool->PutPort(msg.reply_port); 117452a38012Sejakowatz 117552a38012Sejakowatz if (rv < B_OK) { 117652a38012Sejakowatz free(reply); 117752a38012Sejakowatz return rv; 117852a38012Sejakowatz } 117952a38012Sejakowatz 118052a38012Sejakowatz if (reply->result == B_OK) 118152a38012Sejakowatz rv = out_flavor->Unflatten(reply->dfi_type, &reply->dfi, reply->dfi_size); 118252a38012Sejakowatz else 118352a38012Sejakowatz rv = reply->result; 118452a38012Sejakowatz 118552a38012Sejakowatz free(reply); 118652a38012Sejakowatz return rv; 118752a38012Sejakowatz } 118852a38012Sejakowatz 118952a38012Sejakowatz 119052a38012Sejakowatz status_t 119152a38012Sejakowatz BMediaRoster::GetLatencyFor(const media_node & producer, 119252a38012Sejakowatz bigtime_t * out_latency) 119352a38012Sejakowatz { 119452a38012Sejakowatz UNIMPLEMENTED(); 119552a38012Sejakowatz *out_latency = 0; 119652a38012Sejakowatz return B_ERROR; 119752a38012Sejakowatz } 119852a38012Sejakowatz 119952a38012Sejakowatz 120052a38012Sejakowatz status_t 120152a38012Sejakowatz BMediaRoster::GetInitialLatencyFor(const media_node & producer, 120252a38012Sejakowatz bigtime_t * out_latency, 120352a38012Sejakowatz uint32 * out_flags) 120452a38012Sejakowatz { 120552a38012Sejakowatz UNIMPLEMENTED(); 120652a38012Sejakowatz *out_latency = 0; 120752a38012Sejakowatz *out_flags = 0; 120852a38012Sejakowatz return B_ERROR; 120952a38012Sejakowatz } 121052a38012Sejakowatz 121152a38012Sejakowatz 121252a38012Sejakowatz status_t 121352a38012Sejakowatz BMediaRoster::GetStartLatencyFor(const media_node & time_source, 121452a38012Sejakowatz bigtime_t * out_latency) 121552a38012Sejakowatz { 121652a38012Sejakowatz UNIMPLEMENTED(); 121752a38012Sejakowatz *out_latency = 0; 121852a38012Sejakowatz return B_ERROR; 121952a38012Sejakowatz } 122052a38012Sejakowatz 122152a38012Sejakowatz 122252a38012Sejakowatz status_t 122352a38012Sejakowatz BMediaRoster::GetFileFormatsFor(const media_node & file_interface, 122452a38012Sejakowatz media_file_format * out_formats, 122552a38012Sejakowatz int32 * io_num_infos) 122652a38012Sejakowatz { 122752a38012Sejakowatz UNIMPLEMENTED(); 122852a38012Sejakowatz return B_ERROR; 122952a38012Sejakowatz } 123052a38012Sejakowatz 123152a38012Sejakowatz 123252a38012Sejakowatz status_t 123352a38012Sejakowatz BMediaRoster::SetRefFor(const media_node & file_interface, 123452a38012Sejakowatz const entry_ref & file, 123552a38012Sejakowatz bool create_and_truncate, 123652a38012Sejakowatz bigtime_t * out_length) /* if create is false */ 123752a38012Sejakowatz { 123852a38012Sejakowatz UNIMPLEMENTED(); 123952a38012Sejakowatz return B_ERROR; 124052a38012Sejakowatz } 124152a38012Sejakowatz 124252a38012Sejakowatz 124352a38012Sejakowatz status_t 124452a38012Sejakowatz BMediaRoster::GetRefFor(const media_node & node, 124552a38012Sejakowatz entry_ref * out_file, 124652a38012Sejakowatz BMimeType * mime_type) 124752a38012Sejakowatz { 124852a38012Sejakowatz UNIMPLEMENTED(); 124952a38012Sejakowatz return B_ERROR; 125052a38012Sejakowatz } 125152a38012Sejakowatz 125252a38012Sejakowatz 125352a38012Sejakowatz status_t 125452a38012Sejakowatz BMediaRoster::SniffRefFor(const media_node & file_interface, 125552a38012Sejakowatz const entry_ref & file, 125652a38012Sejakowatz BMimeType * mime_type, 125752a38012Sejakowatz float * out_capability) 125852a38012Sejakowatz { 125952a38012Sejakowatz UNIMPLEMENTED(); 126052a38012Sejakowatz return B_ERROR; 126152a38012Sejakowatz } 126252a38012Sejakowatz 126352a38012Sejakowatz 126452a38012Sejakowatz /* This is the generic "here's a file, now can someone please play it" interface */ 126552a38012Sejakowatz status_t 126652a38012Sejakowatz BMediaRoster::SniffRef(const entry_ref & file, 126752a38012Sejakowatz uint64 require_node_kinds, /* if you need an EntityInterface or BufferConsumer or something */ 126852a38012Sejakowatz dormant_node_info * out_node, 126952a38012Sejakowatz BMimeType * mime_type) 127052a38012Sejakowatz { 127152a38012Sejakowatz UNIMPLEMENTED(); 127252a38012Sejakowatz return B_ERROR; 127352a38012Sejakowatz } 127452a38012Sejakowatz 127552a38012Sejakowatz 127652a38012Sejakowatz status_t 127752a38012Sejakowatz BMediaRoster::GetDormantNodeForType(const BMimeType & type, 127852a38012Sejakowatz uint64 require_node_kinds, 127952a38012Sejakowatz dormant_node_info * out_node) 128052a38012Sejakowatz { 128152a38012Sejakowatz UNIMPLEMENTED(); 128252a38012Sejakowatz return B_ERROR; 128352a38012Sejakowatz } 128452a38012Sejakowatz 128552a38012Sejakowatz 128652a38012Sejakowatz status_t 128752a38012Sejakowatz BMediaRoster::GetReadFileFormatsFor(const dormant_node_info & in_node, 128852a38012Sejakowatz media_file_format * out_read_formats, 128952a38012Sejakowatz int32 in_read_count, 129052a38012Sejakowatz int32 * out_read_count) 129152a38012Sejakowatz { 129252a38012Sejakowatz UNIMPLEMENTED(); 129352a38012Sejakowatz return B_ERROR; 129452a38012Sejakowatz } 129552a38012Sejakowatz 129652a38012Sejakowatz 129752a38012Sejakowatz status_t 129852a38012Sejakowatz BMediaRoster::GetWriteFileFormatsFor(const dormant_node_info & in_node, 129952a38012Sejakowatz media_file_format * out_write_formats, 130052a38012Sejakowatz int32 in_write_count, 130152a38012Sejakowatz int32 * out_write_count) 130252a38012Sejakowatz { 130352a38012Sejakowatz UNIMPLEMENTED(); 130452a38012Sejakowatz return B_ERROR; 130552a38012Sejakowatz } 130652a38012Sejakowatz 130752a38012Sejakowatz 130852a38012Sejakowatz status_t 130952a38012Sejakowatz BMediaRoster::GetFormatFor(const media_output & output, 131052a38012Sejakowatz media_format * io_format, 131152a38012Sejakowatz uint32 flags) 131252a38012Sejakowatz { 131352a38012Sejakowatz UNIMPLEMENTED(); 131452a38012Sejakowatz return B_ERROR; 131552a38012Sejakowatz } 131652a38012Sejakowatz 131752a38012Sejakowatz 131852a38012Sejakowatz status_t 131952a38012Sejakowatz BMediaRoster::GetFormatFor(const media_input & input, 132052a38012Sejakowatz media_format * io_format, 132152a38012Sejakowatz uint32 flags) 132252a38012Sejakowatz { 132352a38012Sejakowatz UNIMPLEMENTED(); 132452a38012Sejakowatz return B_ERROR; 132552a38012Sejakowatz } 132652a38012Sejakowatz 132752a38012Sejakowatz 132852a38012Sejakowatz status_t 132952a38012Sejakowatz BMediaRoster::GetFormatFor(const media_node & node, 133052a38012Sejakowatz media_format * io_format, 133152a38012Sejakowatz float quality) 133252a38012Sejakowatz { 133352a38012Sejakowatz UNIMPLEMENTED(); 133452a38012Sejakowatz return B_ERROR; 133552a38012Sejakowatz } 133652a38012Sejakowatz 133752a38012Sejakowatz 133852a38012Sejakowatz ssize_t 133952a38012Sejakowatz BMediaRoster::GetNodeAttributesFor(const media_node & node, 134052a38012Sejakowatz media_node_attribute * outArray, 134152a38012Sejakowatz size_t inMaxCount) 134252a38012Sejakowatz { 134352a38012Sejakowatz UNIMPLEMENTED(); 134452a38012Sejakowatz return B_ERROR; 134552a38012Sejakowatz } 134652a38012Sejakowatz 134752a38012Sejakowatz 134852a38012Sejakowatz media_node_id 134952a38012Sejakowatz BMediaRoster::NodeIDFor(port_id source_or_destination_port) 135052a38012Sejakowatz { 135152a38012Sejakowatz UNIMPLEMENTED(); 135252a38012Sejakowatz return B_ERROR; 135352a38012Sejakowatz } 135452a38012Sejakowatz 135552a38012Sejakowatz 135652a38012Sejakowatz status_t 135752a38012Sejakowatz BMediaRoster::GetInstancesFor(media_addon_id addon, 135852a38012Sejakowatz int32 flavor, 135952a38012Sejakowatz media_node_id * out_id, 136052a38012Sejakowatz int32 * io_count) 136152a38012Sejakowatz { 136252a38012Sejakowatz UNIMPLEMENTED(); 136352a38012Sejakowatz return B_ERROR; 136452a38012Sejakowatz } 136552a38012Sejakowatz 136652a38012Sejakowatz 136752a38012Sejakowatz 136852a38012Sejakowatz status_t 136952a38012Sejakowatz BMediaRoster::SetRealtimeFlags(uint32 in_enabled) 137052a38012Sejakowatz { 137152a38012Sejakowatz UNIMPLEMENTED(); 137252a38012Sejakowatz return B_ERROR; 137352a38012Sejakowatz } 137452a38012Sejakowatz 137552a38012Sejakowatz 137652a38012Sejakowatz status_t 137752a38012Sejakowatz BMediaRoster::GetRealtimeFlags(uint32 * out_enabled) 137852a38012Sejakowatz { 137952a38012Sejakowatz UNIMPLEMENTED(); 138052a38012Sejakowatz return B_ERROR; 138152a38012Sejakowatz } 138252a38012Sejakowatz 138352a38012Sejakowatz 138452a38012Sejakowatz ssize_t 138552a38012Sejakowatz BMediaRoster::AudioBufferSizeFor(int32 channel_count, 138652a38012Sejakowatz uint32 sample_format, 138752a38012Sejakowatz float frame_rate, 138852a38012Sejakowatz bus_type bus_kind) 138952a38012Sejakowatz { 139052a38012Sejakowatz UNIMPLEMENTED(); 139152a38012Sejakowatz return 4096; 139252a38012Sejakowatz } 139352a38012Sejakowatz 139452a38012Sejakowatz 139552a38012Sejakowatz /* Use MediaFlags to inquire about specific features of the Media Kit. */ 139652a38012Sejakowatz /* Returns < 0 for "not present", positive size for output data size. */ 139752a38012Sejakowatz /* 0 means that the capability is present, but no data about it. */ 139852a38012Sejakowatz /* static */ ssize_t 139952a38012Sejakowatz BMediaRoster::MediaFlags(media_flags cap, 140052a38012Sejakowatz void * buf, 140152a38012Sejakowatz size_t maxSize) 140252a38012Sejakowatz { 140352a38012Sejakowatz UNIMPLEMENTED(); 140452a38012Sejakowatz return 0; 140552a38012Sejakowatz } 140652a38012Sejakowatz 140752a38012Sejakowatz 140852a38012Sejakowatz 140952a38012Sejakowatz /* BLooper overrides */ 141052a38012Sejakowatz /* virtual */ void 141152a38012Sejakowatz BMediaRoster::MessageReceived(BMessage * message) 141252a38012Sejakowatz { 141352a38012Sejakowatz UNIMPLEMENTED(); 141452a38012Sejakowatz } 141552a38012Sejakowatz 141652a38012Sejakowatz /* virtual */ bool 141752a38012Sejakowatz BMediaRoster::QuitRequested() 141852a38012Sejakowatz { 141952a38012Sejakowatz UNIMPLEMENTED(); 142052a38012Sejakowatz return true; 142152a38012Sejakowatz } 142252a38012Sejakowatz 142352a38012Sejakowatz /* virtual */ BHandler * 142452a38012Sejakowatz BMediaRoster::ResolveSpecifier(BMessage *msg, 142552a38012Sejakowatz int32 index, 142652a38012Sejakowatz BMessage *specifier, 142752a38012Sejakowatz int32 form, 142852a38012Sejakowatz const char *property) 142952a38012Sejakowatz { 143052a38012Sejakowatz UNIMPLEMENTED(); 143152a38012Sejakowatz return 0; 143252a38012Sejakowatz } 143352a38012Sejakowatz 143452a38012Sejakowatz 143552a38012Sejakowatz /* virtual */ status_t 143652a38012Sejakowatz BMediaRoster::GetSupportedSuites(BMessage *data) 143752a38012Sejakowatz { 143852a38012Sejakowatz UNIMPLEMENTED(); 143952a38012Sejakowatz return B_ERROR; 144052a38012Sejakowatz } 144152a38012Sejakowatz 144252a38012Sejakowatz 144352a38012Sejakowatz BMediaRoster::~BMediaRoster() 144452a38012Sejakowatz { 144552a38012Sejakowatz CALLED(); 144652a38012Sejakowatz BMessage msg(MEDIA_SERVER_UNREGISTER_APP); 144752a38012Sejakowatz BMessage reply; 144852a38012Sejakowatz msg.AddInt32("team",team); 1449*f4925104Sbeveloper QueryServer(&msg, &reply); 145052a38012Sejakowatz } 145152a38012Sejakowatz 145252a38012Sejakowatz 145352a38012Sejakowatz /************************************************************* 145452a38012Sejakowatz * private BMediaRoster 145552a38012Sejakowatz *************************************************************/ 145652a38012Sejakowatz 145752a38012Sejakowatz // deprecated call 145852a38012Sejakowatz status_t 145952a38012Sejakowatz BMediaRoster::SetOutputBuffersFor(const media_source & output, 146052a38012Sejakowatz BBufferGroup * group, 146152a38012Sejakowatz bool will_reclaim ) 146252a38012Sejakowatz { 146352a38012Sejakowatz UNIMPLEMENTED(); 146452a38012Sejakowatz return B_ERROR; 146552a38012Sejakowatz } 146652a38012Sejakowatz 146752a38012Sejakowatz 146852a38012Sejakowatz /* FBC stuffing (Mmmh, Stuffing!) */ 146952a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_0(void *) { return B_ERROR; } 147052a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_1(void *) { return B_ERROR; } 147152a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_2(void *) { return B_ERROR; } 147252a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_3(void *) { return B_ERROR; } 147352a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_4(void *) { return B_ERROR; } 147452a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_5(void *) { return B_ERROR; } 147552a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_6(void *) { return B_ERROR; } 147652a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_7(void *) { return B_ERROR; } 147752a38012Sejakowatz 147852a38012Sejakowatz 147952a38012Sejakowatz BMediaRoster::BMediaRoster() : 148052a38012Sejakowatz BLooper("BMediaRoster looper",B_NORMAL_PRIORITY,B_LOOPER_PORT_DEFAULT_CAPACITY) 148152a38012Sejakowatz { 148252a38012Sejakowatz CALLED(); 148352a38012Sejakowatz BMessage msg(MEDIA_SERVER_REGISTER_APP); 148452a38012Sejakowatz BMessage reply; 148552a38012Sejakowatz msg.AddInt32("team",team); 1486*f4925104Sbeveloper QueryServer(&msg,&reply); 148752a38012Sejakowatz } 148852a38012Sejakowatz 148952a38012Sejakowatz /* static */ status_t 149052a38012Sejakowatz BMediaRoster::ParseCommand(BMessage & reply) 149152a38012Sejakowatz { 149252a38012Sejakowatz UNIMPLEMENTED(); 149352a38012Sejakowatz return B_ERROR; 149452a38012Sejakowatz } 149552a38012Sejakowatz 149652a38012Sejakowatz 149752a38012Sejakowatz 149852a38012Sejakowatz status_t 149952a38012Sejakowatz BMediaRoster::GetDefaultInfo(media_node_id for_default, 150052a38012Sejakowatz BMessage & out_config) 150152a38012Sejakowatz { 150252a38012Sejakowatz UNIMPLEMENTED(); 150352a38012Sejakowatz return B_ERROR; 150452a38012Sejakowatz } 150552a38012Sejakowatz 150652a38012Sejakowatz 150752a38012Sejakowatz 150852a38012Sejakowatz status_t 150952a38012Sejakowatz BMediaRoster::SetRunningDefault(media_node_id for_default, 151052a38012Sejakowatz const media_node & node) 151152a38012Sejakowatz { 151252a38012Sejakowatz UNIMPLEMENTED(); 151352a38012Sejakowatz return B_ERROR; 151452a38012Sejakowatz } 151552a38012Sejakowatz 151652a38012Sejakowatz 151752a38012Sejakowatz /************************************************************* 151852a38012Sejakowatz * static BMediaRoster variables 151952a38012Sejakowatz *************************************************************/ 152052a38012Sejakowatz 152152a38012Sejakowatz bool BMediaRoster::_isMediaServer; 152252a38012Sejakowatz port_id BMediaRoster::_mReplyPort; 152352a38012Sejakowatz int32 BMediaRoster::_mReplyPortRes; 152452a38012Sejakowatz int32 BMediaRoster::_mReplyPortUnavailCount; 152552a38012Sejakowatz BMediaRoster * BMediaRoster::_sDefault = NULL; 152652a38012Sejakowatz 1527