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