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