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