xref: /haiku/src/kits/media/MediaRoster.cpp (revision 16b7eea41a06da4167cfd3e28a18681ca29ff04f)
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