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