xref: /haiku/src/kits/media/MediaRoster.cpp (revision 570f7d0456164c9d2f22525c7eca167021e93770)
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 #define	DEBUG 3
159e9417d2Sbeveloper #include <Debug.h>
1652a38012Sejakowatz #include "debug.h"
173620737cSbeveloper #include "TStack.h"
1852a38012Sejakowatz #include "PortPool.h"
191299bfb2Sbeveloper #include "SystemTimeSource.h"
200a483e72SIngo Weinhold #include "ServerInterface.h"
21f4925104Sbeveloper #include "DataExchange.h"
2216b7eea4Sbeveloper #include "DormantNodeManager.h"
23f4925104Sbeveloper #include "Notifications.h"
2452a38012Sejakowatz 
25f4925104Sbeveloper namespace BPrivate { namespace media {
26f4925104Sbeveloper 	extern team_id team;
273620737cSbeveloper } } // BPrivate::media
283620737cSbeveloper 
293620737cSbeveloper using namespace BPrivate::media;
3052a38012Sejakowatz 
3152a38012Sejakowatz // the BMediaRoster destructor is private,
3252a38012Sejakowatz // but _DefaultDeleter is a friend class of
3352a38012Sejakowatz // the BMediaRoster an thus can delete it
3452a38012Sejakowatz class _DefaultDeleter
3552a38012Sejakowatz {
3652a38012Sejakowatz public:
37e66fda40Sbeveloper 	~_DefaultDeleter() { delete BMediaRoster::_sDefault; }
3852a38012Sejakowatz };
3952a38012Sejakowatz 
40f4925104Sbeveloper _DefaultDeleter _deleter;
4152a38012Sejakowatz 
423620737cSbeveloper namespace BPrivate { namespace media { namespace mediaroster {
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);
463620737cSbeveloper status_t GetAllOutputs(const media_node & node, Stack<media_output> *stack);
473620737cSbeveloper status_t GetAllInputs(const media_node & node, Stack<media_input> *stack);
483620737cSbeveloper status_t PublishOutputs(const media_node & node, Stack<media_output> *stack);
493620737cSbeveloper status_t PublishInputs(const media_node & node, Stack<media_input> *stack);
5052a38012Sejakowatz 
513620737cSbeveloper status_t
523620737cSbeveloper GetNode(node_type type, media_node * out_node, int32 * out_input_id, BString * out_input_name)
5352a38012Sejakowatz {
5452a38012Sejakowatz 	if (out_node == NULL)
5552a38012Sejakowatz 		return B_BAD_VALUE;
5652a38012Sejakowatz 
578c6a6096Sbeveloper 	server_get_node_request request;
588c6a6096Sbeveloper 	server_get_node_reply reply;
5952a38012Sejakowatz 	status_t rv;
6052a38012Sejakowatz 
618c6a6096Sbeveloper 	request.type = type;
629e9417d2Sbeveloper 	request.team = team;
638c6a6096Sbeveloper 	rv = QueryServer(SERVER_GET_NODE, &request, sizeof(request), &reply, sizeof(reply));
648c6a6096Sbeveloper 	if (rv != B_OK)
658c6a6096Sbeveloper 		return rv;
6652a38012Sejakowatz 
6752a38012Sejakowatz 	*out_node = reply.node;
6852a38012Sejakowatz 	if (out_input_id)
6952a38012Sejakowatz 		*out_input_id = reply.input_id;
7052a38012Sejakowatz 	if (out_input_name)
7152a38012Sejakowatz 		*out_input_name = reply.input_name;
728c6a6096Sbeveloper 	return rv;
7352a38012Sejakowatz }
7452a38012Sejakowatz 
753620737cSbeveloper status_t
763620737cSbeveloper SetNode(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input)
7752a38012Sejakowatz {
788c6a6096Sbeveloper 	server_set_node_request request;
798c6a6096Sbeveloper 	server_set_node_reply reply;
8052a38012Sejakowatz 
818c6a6096Sbeveloper 	request.type = type;
828c6a6096Sbeveloper 	request.use_node = node ? true : false;
8352a38012Sejakowatz 	if (node)
848c6a6096Sbeveloper 		request.node = *node;
858c6a6096Sbeveloper 	request.use_dni = info ? true : false;
8652a38012Sejakowatz 	if (info)
878c6a6096Sbeveloper 		request.dni = *info;
888c6a6096Sbeveloper 	request.use_input = input ? true : false;
8952a38012Sejakowatz 	if (input)
908c6a6096Sbeveloper 		request.input = *input;
9152a38012Sejakowatz 
928c6a6096Sbeveloper 	return QueryServer(SERVER_SET_NODE, &request, sizeof(request), &reply, sizeof(reply));
9352a38012Sejakowatz }
9452a38012Sejakowatz 
953620737cSbeveloper status_t
963620737cSbeveloper GetAllOutputs(const media_node & node, Stack<media_output> *stack)
973620737cSbeveloper {
983620737cSbeveloper 	int32 cookie;
993620737cSbeveloper 	status_t rv;
1003620737cSbeveloper 	status_t result;
1013620737cSbeveloper 
1023620737cSbeveloper 	result = B_OK;
1033620737cSbeveloper 	cookie = 0;
1043620737cSbeveloper 	for (;;) {
1053620737cSbeveloper 		producer_get_next_output_request request;
1063620737cSbeveloper 		producer_get_next_output_reply reply;
1073620737cSbeveloper 		request.cookie = cookie;
1080caff283Sbeveloper 		rv = QueryPort(node.port, PRODUCER_GET_NEXT_OUTPUT, &request, sizeof(request), &reply, sizeof(reply));
1093620737cSbeveloper 		if (rv != B_OK)
1103620737cSbeveloper 			break;
1113620737cSbeveloper 		cookie = reply.cookie;
1123620737cSbeveloper 		if (!stack->Push(reply.output)) {
1133620737cSbeveloper 			TRACE("GetAllOutputs: stack->Push failed\n");
1143620737cSbeveloper 			result = B_ERROR;
1153620737cSbeveloper 		}
1163620737cSbeveloper 	}
1173620737cSbeveloper 
1183620737cSbeveloper 	producer_dispose_output_cookie_request request;
1193620737cSbeveloper 	producer_dispose_output_cookie_reply reply;
1200caff283Sbeveloper 	QueryPort(node.port, PRODUCER_DISPOSE_OUTPUT_COOKIE, &request, sizeof(request), &reply, sizeof(reply));
1213620737cSbeveloper 
1223620737cSbeveloper 	return result;
1233620737cSbeveloper }
1243620737cSbeveloper 
1253620737cSbeveloper status_t
1263620737cSbeveloper GetAllInputs(const media_node & node, Stack<media_input> *stack)
1273620737cSbeveloper {
1283620737cSbeveloper 	int32 cookie;
1293620737cSbeveloper 	status_t rv;
1303620737cSbeveloper 	status_t result;
1313620737cSbeveloper 
1323620737cSbeveloper 	result = B_OK;
1333620737cSbeveloper 	cookie = 0;
1343620737cSbeveloper 	for (;;) {
1353620737cSbeveloper 		consumer_get_next_input_request request;
1363620737cSbeveloper 		consumer_get_next_input_reply reply;
1373620737cSbeveloper 		request.cookie = cookie;
1380caff283Sbeveloper 		rv = QueryPort(node.port, CONSUMER_GET_NEXT_INPUT, &request, sizeof(request), &reply, sizeof(reply));
1393620737cSbeveloper 		if (rv != B_OK)
1403620737cSbeveloper 			break;
1413620737cSbeveloper 		cookie = reply.cookie;
1423620737cSbeveloper 		if (!stack->Push(reply.input)) {
1433620737cSbeveloper 			TRACE("GetAllInputs: stack->Push failed\n");
1443620737cSbeveloper 			result = B_ERROR;
1453620737cSbeveloper 		}
1463620737cSbeveloper 	}
1473620737cSbeveloper 
1483620737cSbeveloper 	consumer_dispose_input_cookie_request request;
1493620737cSbeveloper 	consumer_dispose_input_cookie_reply reply;
1500caff283Sbeveloper 	QueryPort(node.port, CONSUMER_DISPOSE_INPUT_COOKIE, &request, sizeof(request), &reply, sizeof(reply));
1513620737cSbeveloper 
1523620737cSbeveloper 	return result;
1533620737cSbeveloper }
1543620737cSbeveloper 
1553620737cSbeveloper status_t
1563620737cSbeveloper PublishOutputs(const media_node & node, Stack<media_output> *stack)
1573620737cSbeveloper {
1583620737cSbeveloper 	server_publish_outputs_request request;
1593620737cSbeveloper 	server_publish_outputs_reply reply;
1603620737cSbeveloper 	media_output *output;
1613620737cSbeveloper 	media_output *outputs;
1623620737cSbeveloper 	int32 count;
163a7b41a96Sbeveloper 	status_t rv;
1643620737cSbeveloper 
1653620737cSbeveloper 	count = stack->CountItems();
1663620737cSbeveloper 	TRACE("PublishOutputs: publishing %ld\n", count);
1673620737cSbeveloper 
1683620737cSbeveloper 	request.node = node;
1693620737cSbeveloper 	request.count = count;
1703620737cSbeveloper 	if (count > MAX_OUTPUTS) {
1713620737cSbeveloper 		void *start_addr;
1723620737cSbeveloper 		size_t size;
1733620737cSbeveloper 		size = ((count * sizeof(media_output)) + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1);
1743620737cSbeveloper 		request.area = create_area("publish outputs", &start_addr, B_ANY_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
1753620737cSbeveloper 		if (request.area < B_OK) {
1763620737cSbeveloper 			TRACE("PublishOutputs: failed to create area, %#lx\n", request.area);
1773620737cSbeveloper 			return (status_t)request.area;
1783620737cSbeveloper 		}
1793620737cSbeveloper 		outputs = static_cast<media_output *>(start_addr);
1803620737cSbeveloper 	} else {
1813620737cSbeveloper 		request.area = -1;
1823620737cSbeveloper 		outputs = request.outputs;
1833620737cSbeveloper 	}
1843620737cSbeveloper 	TRACE("PublishOutputs: area %#lx\n", request.area);
1853620737cSbeveloper 
1863620737cSbeveloper 	for (int32 i = 0; i != count; i++) {
1873620737cSbeveloper 		stack->GetPointerAt(i, &output);
1883620737cSbeveloper 		outputs[i] = *output;
1893620737cSbeveloper 	}
1903620737cSbeveloper 
191a7b41a96Sbeveloper 	rv = QueryServer(SERVER_PUBLISH_OUTPUTS, &request, sizeof(request), &reply, sizeof(reply));
192a7b41a96Sbeveloper 
193a7b41a96Sbeveloper 	if (request.area != -1)
194a7b41a96Sbeveloper 		delete_area(request.area);
195a7b41a96Sbeveloper 
196a7b41a96Sbeveloper 	return rv;
1973620737cSbeveloper }
1983620737cSbeveloper 
1993620737cSbeveloper status_t
2003620737cSbeveloper PublishInputs(const media_node & node, Stack<media_input> *stack)
2013620737cSbeveloper {
2023620737cSbeveloper 	server_publish_inputs_request request;
2033620737cSbeveloper 	server_publish_inputs_reply reply;
2043620737cSbeveloper 	media_input *input;
2053620737cSbeveloper 	media_input *inputs;
2063620737cSbeveloper 	int32 count;
207a7b41a96Sbeveloper 	status_t rv;
2083620737cSbeveloper 
2093620737cSbeveloper 	count = stack->CountItems();
2103620737cSbeveloper 	TRACE("PublishInputs: publishing %ld\n", count);
2113620737cSbeveloper 
2123620737cSbeveloper 	request.node = node;
2133620737cSbeveloper 	request.count = count;
2143620737cSbeveloper 	if (count > MAX_INPUTS) {
2153620737cSbeveloper 		void *start_addr;
2163620737cSbeveloper 		size_t size;
2173620737cSbeveloper 		size = ((count * sizeof(media_input)) + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1);
2183620737cSbeveloper 		request.area = create_area("publish inputs", &start_addr, B_ANY_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
2193620737cSbeveloper 		if (request.area < B_OK) {
2203620737cSbeveloper 			TRACE("PublishInputs: failed to create area, %#lx\n", request.area);
2213620737cSbeveloper 			return (status_t)request.area;
2223620737cSbeveloper 		}
2233620737cSbeveloper 		inputs = static_cast<media_input *>(start_addr);
2243620737cSbeveloper 	} else {
2253620737cSbeveloper 		request.area = -1;
2263620737cSbeveloper 		inputs = request.inputs;
2273620737cSbeveloper 	}
2283620737cSbeveloper 	TRACE("PublishInputs: area %#lx\n", request.area);
2293620737cSbeveloper 
2303620737cSbeveloper 	for (int32 i = 0; i != count; i++) {
2313620737cSbeveloper 		stack->GetPointerAt(i, &input);
2323620737cSbeveloper 		inputs[i] = *input;
2333620737cSbeveloper 	}
2343620737cSbeveloper 
235a7b41a96Sbeveloper 	rv = QueryServer(SERVER_PUBLISH_INPUTS, &request, sizeof(request), &reply, sizeof(reply));
236a7b41a96Sbeveloper 
237a7b41a96Sbeveloper 	if (request.area != -1)
238a7b41a96Sbeveloper 		delete_area(request.area);
239a7b41a96Sbeveloper 
240a7b41a96Sbeveloper 	return rv;
2413620737cSbeveloper }
2423620737cSbeveloper 
2433620737cSbeveloper } } } // namespace BPrivate::media::mediaroster
2443620737cSbeveloper 
2453620737cSbeveloper using namespace BPrivate::media::mediaroster;
24652a38012Sejakowatz 
24752a38012Sejakowatz /*************************************************************
24852a38012Sejakowatz  * public BMediaRoster
24952a38012Sejakowatz  *************************************************************/
25052a38012Sejakowatz 
25152a38012Sejakowatz status_t
25252a38012Sejakowatz BMediaRoster::GetVideoInput(media_node * out_node)
25352a38012Sejakowatz {
25452a38012Sejakowatz 	CALLED();
2553620737cSbeveloper 	return GetNode(VIDEO_INPUT, out_node);
25652a38012Sejakowatz }
25752a38012Sejakowatz 
25852a38012Sejakowatz 
25952a38012Sejakowatz status_t
26052a38012Sejakowatz BMediaRoster::GetAudioInput(media_node * out_node)
26152a38012Sejakowatz {
26252a38012Sejakowatz 	CALLED();
2633620737cSbeveloper 	return GetNode(AUDIO_INPUT, out_node);
26452a38012Sejakowatz }
26552a38012Sejakowatz 
26652a38012Sejakowatz 
26752a38012Sejakowatz status_t
26852a38012Sejakowatz BMediaRoster::GetVideoOutput(media_node * out_node)
26952a38012Sejakowatz {
27052a38012Sejakowatz 	CALLED();
2713620737cSbeveloper 	return GetNode(VIDEO_OUTPUT, out_node);
27252a38012Sejakowatz }
27352a38012Sejakowatz 
27452a38012Sejakowatz 
27552a38012Sejakowatz status_t
27652a38012Sejakowatz BMediaRoster::GetAudioMixer(media_node * out_node)
27752a38012Sejakowatz {
27852a38012Sejakowatz 	CALLED();
2793620737cSbeveloper 	return GetNode(AUDIO_MIXER, out_node);
28052a38012Sejakowatz }
28152a38012Sejakowatz 
28252a38012Sejakowatz 
28352a38012Sejakowatz status_t
28452a38012Sejakowatz BMediaRoster::GetAudioOutput(media_node * out_node)
28552a38012Sejakowatz {
28652a38012Sejakowatz 	CALLED();
2873620737cSbeveloper 	return GetNode(AUDIO_OUTPUT, out_node);
28852a38012Sejakowatz }
28952a38012Sejakowatz 
29052a38012Sejakowatz 
29152a38012Sejakowatz status_t
29252a38012Sejakowatz BMediaRoster::GetAudioOutput(media_node * out_node,
29352a38012Sejakowatz 							 int32 * out_input_id,
29452a38012Sejakowatz 							 BString * out_input_name)
29552a38012Sejakowatz {
29652a38012Sejakowatz 	CALLED();
2973620737cSbeveloper 	return GetNode(AUDIO_OUTPUT_EX, out_node, out_input_id, out_input_name);
29852a38012Sejakowatz }
29952a38012Sejakowatz 
30052a38012Sejakowatz 
30152a38012Sejakowatz status_t
30252a38012Sejakowatz BMediaRoster::GetTimeSource(media_node * out_node)
30352a38012Sejakowatz {
30452a38012Sejakowatz 	CALLED();
3053620737cSbeveloper 	return GetNode(TIME_SOURCE, out_node);
30652a38012Sejakowatz }
30752a38012Sejakowatz 
30852a38012Sejakowatz 
30952a38012Sejakowatz status_t
31052a38012Sejakowatz BMediaRoster::SetVideoInput(const media_node & producer)
31152a38012Sejakowatz {
31252a38012Sejakowatz 	CALLED();
3133620737cSbeveloper 	return SetNode(VIDEO_INPUT, &producer);
31452a38012Sejakowatz }
31552a38012Sejakowatz 
31652a38012Sejakowatz 
31752a38012Sejakowatz status_t
31852a38012Sejakowatz BMediaRoster::SetVideoInput(const dormant_node_info & producer)
31952a38012Sejakowatz {
32052a38012Sejakowatz 	CALLED();
3213620737cSbeveloper 	return SetNode(VIDEO_INPUT, NULL, &producer);
32252a38012Sejakowatz }
32352a38012Sejakowatz 
32452a38012Sejakowatz 
32552a38012Sejakowatz status_t
32652a38012Sejakowatz BMediaRoster::SetAudioInput(const media_node & producer)
32752a38012Sejakowatz {
32852a38012Sejakowatz 	CALLED();
3293620737cSbeveloper 	return SetNode(AUDIO_INPUT, &producer);
33052a38012Sejakowatz }
33152a38012Sejakowatz 
33252a38012Sejakowatz 
33352a38012Sejakowatz status_t
33452a38012Sejakowatz BMediaRoster::SetAudioInput(const dormant_node_info & producer)
33552a38012Sejakowatz {
33652a38012Sejakowatz 	CALLED();
3373620737cSbeveloper 	return SetNode(AUDIO_INPUT, NULL, &producer);
33852a38012Sejakowatz }
33952a38012Sejakowatz 
34052a38012Sejakowatz 
34152a38012Sejakowatz status_t
34252a38012Sejakowatz BMediaRoster::SetVideoOutput(const media_node & consumer)
34352a38012Sejakowatz {
34452a38012Sejakowatz 	CALLED();
3453620737cSbeveloper 	return SetNode(VIDEO_OUTPUT, &consumer);
34652a38012Sejakowatz }
34752a38012Sejakowatz 
34852a38012Sejakowatz 
34952a38012Sejakowatz status_t
35052a38012Sejakowatz BMediaRoster::SetVideoOutput(const dormant_node_info & consumer)
35152a38012Sejakowatz {
35252a38012Sejakowatz 	CALLED();
3533620737cSbeveloper 	return SetNode(VIDEO_OUTPUT, NULL, &consumer);
35452a38012Sejakowatz }
35552a38012Sejakowatz 
35652a38012Sejakowatz 
35752a38012Sejakowatz status_t
35852a38012Sejakowatz BMediaRoster::SetAudioOutput(const media_node & consumer)
35952a38012Sejakowatz {
36052a38012Sejakowatz 	CALLED();
3613620737cSbeveloper 	return SetNode(AUDIO_OUTPUT, &consumer);
36252a38012Sejakowatz }
36352a38012Sejakowatz 
36452a38012Sejakowatz 
36552a38012Sejakowatz status_t
36652a38012Sejakowatz BMediaRoster::SetAudioOutput(const media_input & input_to_output)
36752a38012Sejakowatz {
36852a38012Sejakowatz 	CALLED();
3693620737cSbeveloper 	return SetNode(AUDIO_OUTPUT, NULL, NULL, &input_to_output);
37052a38012Sejakowatz }
37152a38012Sejakowatz 
37252a38012Sejakowatz 
37352a38012Sejakowatz status_t
37452a38012Sejakowatz BMediaRoster::SetAudioOutput(const dormant_node_info & consumer)
37552a38012Sejakowatz {
37652a38012Sejakowatz 	CALLED();
3773620737cSbeveloper 	return SetNode(AUDIO_OUTPUT, NULL, &consumer);
37852a38012Sejakowatz }
37952a38012Sejakowatz 
38052a38012Sejakowatz 
38152a38012Sejakowatz status_t
38252a38012Sejakowatz BMediaRoster::GetNodeFor(media_node_id node,
38352a38012Sejakowatz 						 media_node * clone)
38452a38012Sejakowatz {
3859e9417d2Sbeveloper 	CALLED();
3869e9417d2Sbeveloper 	if (clone == NULL)
3879e9417d2Sbeveloper 		return B_BAD_VALUE;
3889e9417d2Sbeveloper 	if (node <= 0)
3899e9417d2Sbeveloper 		return B_MEDIA_BAD_NODE;
3909e9417d2Sbeveloper 
3919e9417d2Sbeveloper 	server_get_node_for_request request;
3929e9417d2Sbeveloper 	server_get_node_for_reply reply;
3939e9417d2Sbeveloper 	status_t rv;
3949e9417d2Sbeveloper 
3959e9417d2Sbeveloper 	request.nodeid = node;
3969e9417d2Sbeveloper 	request.team = team;
3979e9417d2Sbeveloper 
3989e9417d2Sbeveloper 	rv = QueryServer(SERVER_GET_NODE_FOR, &request, sizeof(request), &reply, sizeof(reply));
3999e9417d2Sbeveloper 	if (rv != B_OK)
4009e9417d2Sbeveloper 		return rv;
4019e9417d2Sbeveloper 
4029e9417d2Sbeveloper 	*clone = reply.clone;
4039e9417d2Sbeveloper 	return B_OK;
40452a38012Sejakowatz }
40552a38012Sejakowatz 
40652a38012Sejakowatz 
40752a38012Sejakowatz status_t
40852a38012Sejakowatz BMediaRoster::GetSystemTimeSource(media_node * clone)
40952a38012Sejakowatz {
41052a38012Sejakowatz 	CALLED();
4113620737cSbeveloper 	return GetNode(SYSTEM_TIME_SOURCE, clone);
41252a38012Sejakowatz }
41352a38012Sejakowatz 
41452a38012Sejakowatz 
41552a38012Sejakowatz status_t
41652a38012Sejakowatz BMediaRoster::ReleaseNode(const media_node & node)
41752a38012Sejakowatz {
4189e9417d2Sbeveloper 	CALLED();
4199e9417d2Sbeveloper 	if (node.node <= 0)
4209e9417d2Sbeveloper 		return B_MEDIA_BAD_NODE;
42152a38012Sejakowatz 
4229e9417d2Sbeveloper 	server_release_node_request request;
4239e9417d2Sbeveloper 	server_release_node_reply reply;
4249e9417d2Sbeveloper 
4259e9417d2Sbeveloper 	request.node = node;
4269e9417d2Sbeveloper 	request.team = team;
4279e9417d2Sbeveloper 
4289e9417d2Sbeveloper 	return QueryServer(SERVER_RELEASE_NODE, &request, sizeof(request), &reply, sizeof(reply));
4299e9417d2Sbeveloper }
43052a38012Sejakowatz 
43152a38012Sejakowatz 
43252a38012Sejakowatz BTimeSource *
43352a38012Sejakowatz BMediaRoster::MakeTimeSourceFor(const media_node & for_node)
43452a38012Sejakowatz {
4351299bfb2Sbeveloper 	BROKEN();
4361299bfb2Sbeveloper 	return new _SysTimeSource(); // XXX fix this
43752a38012Sejakowatz }
43852a38012Sejakowatz 
43952a38012Sejakowatz 
44052a38012Sejakowatz status_t
44152a38012Sejakowatz BMediaRoster::Connect(const media_source & from,
44252a38012Sejakowatz 					  const media_destination & to,
44352a38012Sejakowatz 					  media_format * io_format,
44452a38012Sejakowatz 					  media_output * out_output,
44552a38012Sejakowatz 					  media_input * out_input)
44652a38012Sejakowatz {
447eae26d3dSbeveloper 	return BMediaRoster::Connect(from, to, io_format, out_output, out_input, 0);
448eae26d3dSbeveloper }
449eae26d3dSbeveloper 
450eae26d3dSbeveloper 
451eae26d3dSbeveloper status_t
452eae26d3dSbeveloper BMediaRoster::Connect(const media_source & from,
453eae26d3dSbeveloper 					  const media_destination & to,
454eae26d3dSbeveloper 					  media_format * io_format,
455eae26d3dSbeveloper 					  media_output * out_output,
456eae26d3dSbeveloper 					  media_input * out_input,
457eae26d3dSbeveloper 					  uint32 in_flags,
458eae26d3dSbeveloper 					  void * _reserved)
459eae26d3dSbeveloper {
46052a38012Sejakowatz 	CALLED();
46152a38012Sejakowatz 	if (io_format == NULL || out_output == NULL || out_input == NULL)
46252a38012Sejakowatz 		return B_BAD_VALUE;
4639e9417d2Sbeveloper 	if (from == media_source::null) {
4649e9417d2Sbeveloper 		TRACE("BMediaRoster::Connect: media_source invalid\n");
46552a38012Sejakowatz 		return B_MEDIA_BAD_SOURCE;
4669e9417d2Sbeveloper 	}
4679e9417d2Sbeveloper 	if (to == media_destination::null) {
4689e9417d2Sbeveloper 		TRACE("BMediaRoster::Connect: media_destination invalid\n");
46952a38012Sejakowatz 		return B_MEDIA_BAD_DESTINATION;
4709e9417d2Sbeveloper 	}
47152a38012Sejakowatz 
47252a38012Sejakowatz 	status_t rv;
4738c6a6096Sbeveloper 	producer_format_proposal_request request1;
4748c6a6096Sbeveloper 	producer_format_proposal_reply reply1;
47552a38012Sejakowatz 
47652a38012Sejakowatz 	// BBufferProducer::FormatProposal
4778c6a6096Sbeveloper 	request1.output = from;
4788c6a6096Sbeveloper 	request1.format = *io_format;
4798c6a6096Sbeveloper 	rv = QueryPort(from.port, PRODUCER_FORMAT_PROPOSAL, &request1, sizeof(request1), &reply1, sizeof(reply1));
4808c6a6096Sbeveloper 	if (rv != B_OK) {
4815edd2016Sbeveloper 		TRACE("BMediaRoster::Connect: aborted after BBufferProducer::FormatProposal, status = %#lx\n",rv);
48252a38012Sejakowatz 		return rv;
48352a38012Sejakowatz 	}
4848c6a6096Sbeveloper 	// reply1.format now contains the format proposed by the producer
4858c6a6096Sbeveloper 
4868c6a6096Sbeveloper 	consumer_accept_format_request request2;
4878c6a6096Sbeveloper 	consumer_accept_format_reply reply2;
4888c6a6096Sbeveloper 
4898c6a6096Sbeveloper 	// BBufferConsumer::AcceptFormat
4908c6a6096Sbeveloper 	request2.dest = to;
4918c6a6096Sbeveloper 	request2.format = reply1.format;
4928c6a6096Sbeveloper 	rv = QueryPort(to.port, CONSUMER_ACCEPT_FORMAT, &request2, sizeof(request2), &reply2, sizeof(reply2));
4938c6a6096Sbeveloper 	if (rv != B_OK) {
4945edd2016Sbeveloper 		TRACE("BMediaRoster::Connect: aborted after BBufferConsumer::AcceptFormat, status = %#lx\n",rv);
4958c6a6096Sbeveloper 		return rv;
4968c6a6096Sbeveloper 	}
4978c6a6096Sbeveloper 	// reply2.format now contains the format accepted by the consumer
4988c6a6096Sbeveloper 
4998c6a6096Sbeveloper 	// BBufferProducer::PrepareToConnect
5008c6a6096Sbeveloper 	producer_prepare_to_connect_request request3;
5018c6a6096Sbeveloper 	producer_prepare_to_connect_reply reply3;
5028c6a6096Sbeveloper 
5038c6a6096Sbeveloper 	request3.source = from;
5048c6a6096Sbeveloper 	request3.destination = to;
5058c6a6096Sbeveloper 	request3.format = reply2.format;
5068c6a6096Sbeveloper 	strcpy(request3.name, "XXX some default name"); // XXX fix this
5078c6a6096Sbeveloper 	rv = QueryPort(from.port, PRODUCER_PREPARE_TO_CONNECT, &request3, sizeof(request3), &reply3, sizeof(reply3));
5088c6a6096Sbeveloper 	if (rv != B_OK) {
5095edd2016Sbeveloper 		TRACE("BMediaRoster::Connect: aborted after BBufferProducer::PrepareToConnect, status = %#lx\n",rv);
5108c6a6096Sbeveloper 		return rv;
5118c6a6096Sbeveloper 	}
5128c6a6096Sbeveloper 	// reply3.format is still our pretty media format
5138c6a6096Sbeveloper 	// reply3.out_source the real source to be used for the connection
5148c6a6096Sbeveloper 	// reply3.name the name BBufferConsumer::Connected will see in the outInput->name argument
5158c6a6096Sbeveloper 
5168c6a6096Sbeveloper 	// BBufferConsumer::Connected
5178c6a6096Sbeveloper 	consumer_connected_request request4;
5188c6a6096Sbeveloper 	consumer_connected_reply reply4;
5198c6a6096Sbeveloper 	status_t con_status;
5208c6a6096Sbeveloper 
5218c6a6096Sbeveloper 	request4.producer = reply3.out_source;
5228c6a6096Sbeveloper 	request4.where = to;
5238c6a6096Sbeveloper 	request4.with_format = reply3.format;
5248c6a6096Sbeveloper 	con_status = QueryPort(to.port, CONSUMER_CONNECTED, &request4, sizeof(request4), &reply4, sizeof(reply4));
5258c6a6096Sbeveloper 	if (con_status != B_OK) {
5265edd2016Sbeveloper 		TRACE("BMediaRoster::Connect: aborting after BBufferConsumer::Connected, status = %#lx\n",con_status);
5278c6a6096Sbeveloper 		// we do NOT return here!
5288c6a6096Sbeveloper 	}
5298c6a6096Sbeveloper 	// con_status contains the status code to be supplied to BBufferProducer::Connect's status argument
5308c6a6096Sbeveloper 	// reply4.input contains the media_input that describes the connection from the consumer point of view
5318c6a6096Sbeveloper 
5328c6a6096Sbeveloper 	// BBufferProducer::Connect
5338c6a6096Sbeveloper 	producer_connect_request request5;
5348c6a6096Sbeveloper 	producer_connect_reply reply5;
5358c6a6096Sbeveloper 
5368c6a6096Sbeveloper 	request5.error = con_status;
5378c6a6096Sbeveloper 	request5.source = reply3.out_source;
5388c6a6096Sbeveloper 	request5.destination = reply4.input.destination;
5398c6a6096Sbeveloper 	request5.format = reply3.format; // XXX reply4.input.format ???
5408c6a6096Sbeveloper 	strcpy(request5.name, reply4.input.name);
5410caff283Sbeveloper 	rv = QueryPort(reply4.input.source.port, PRODUCER_CONNECT, &request5, sizeof(request5), &reply5, sizeof(reply5));
5428c6a6096Sbeveloper 	if (con_status != B_OK) {
5438c6a6096Sbeveloper 		TRACE("BMediaRoster::Connect: aborted\n");
5448c6a6096Sbeveloper 		return con_status;
5458c6a6096Sbeveloper 	}
5468c6a6096Sbeveloper 	if (rv != B_OK) {
5475edd2016Sbeveloper 		TRACE("BMediaRoster::Connect: aborted after BBufferProducer::Connect, status = %#lx\n",rv);
5488c6a6096Sbeveloper 		return rv;
5498c6a6096Sbeveloper 	}
5508c6a6096Sbeveloper 	// reply5.name contains the name assigned to the connection by the producer
5518c6a6096Sbeveloper 
5528c6a6096Sbeveloper 	// find the output node
5538c6a6096Sbeveloper 	// XXX isn't there a easier way?
5548c6a6096Sbeveloper 	media_node sourcenode;
5558c6a6096Sbeveloper 	GetNodeFor(NodeIDFor(from.port), &sourcenode);
5568c6a6096Sbeveloper 	ReleaseNode(sourcenode);
5578c6a6096Sbeveloper 
5588c6a6096Sbeveloper 	// initilize connection info
5598c6a6096Sbeveloper 	*io_format = reply3.format;
5608c6a6096Sbeveloper 	*out_input = reply4.input;
5618c6a6096Sbeveloper 	out_output->node = sourcenode;
5628c6a6096Sbeveloper 	out_output->source = reply4.input.source;
5638c6a6096Sbeveloper 	out_output->destination = reply4.input.destination;
5648c6a6096Sbeveloper 	out_output->format = reply4.input.format;
5658c6a6096Sbeveloper 	strcpy(out_output->name, reply5.name);
5668c6a6096Sbeveloper 
5678c6a6096Sbeveloper 	// the connection is now made
5688c6a6096Sbeveloper 
5698c6a6096Sbeveloper 
5708c6a6096Sbeveloper 	// XXX register connection with server
5719e9417d2Sbeveloper 	// XXX we should just send a notification, instead of republishing all endpoints
5729e9417d2Sbeveloper 	Stack<media_output> outstack;
5739e9417d2Sbeveloper 	Stack<media_input> instack;
5749e9417d2Sbeveloper 	if (B_OK == GetAllOutputs(out_output->node , &outstack))
5759e9417d2Sbeveloper 		PublishOutputs(out_output->node , &outstack);
5769e9417d2Sbeveloper 	if (B_OK == GetAllInputs(out_input->node , &instack))
5779e9417d2Sbeveloper 		PublishInputs(out_input->node, &instack);
5788c6a6096Sbeveloper 
5798c6a6096Sbeveloper 
5808c6a6096Sbeveloper 	// XXX if (mute) BBufferProducer::EnableOutput(false)
5819e9417d2Sbeveloper 	if (in_flags & B_CONNECT_MUTED) {
5829e9417d2Sbeveloper 	}
5838c6a6096Sbeveloper 
5848c6a6096Sbeveloper 
5859e9417d2Sbeveloper 	// send a notification
5869e9417d2Sbeveloper 	BPrivate::media::notifications::ConnectionMade(*out_input, *out_output, *io_format);
5879e9417d2Sbeveloper 
5888c6a6096Sbeveloper 	return B_OK;
5898c6a6096Sbeveloper };
59052a38012Sejakowatz 
59152a38012Sejakowatz 
59252a38012Sejakowatz status_t
5939e9417d2Sbeveloper BMediaRoster::Disconnect(media_node_id source_nodeid,
59452a38012Sejakowatz 						 const media_source & source,
5959e9417d2Sbeveloper 						 media_node_id destination_nodeid,
59652a38012Sejakowatz 						 const media_destination & destination)
59752a38012Sejakowatz {
5989e9417d2Sbeveloper 	CALLED();
5999e9417d2Sbeveloper 	if (source_nodeid <= 0) {
6009e9417d2Sbeveloper 		TRACE("BMediaRoster::Disconnect: source media_node_id invalid\n");
6019e9417d2Sbeveloper 		return B_MEDIA_BAD_SOURCE;
6029e9417d2Sbeveloper 	}
6039e9417d2Sbeveloper 	if (destination_nodeid <= 0) {
6049e9417d2Sbeveloper 		TRACE("BMediaRoster::Disconnect: source media_node_id invalid\n");
6059e9417d2Sbeveloper 		return B_MEDIA_BAD_DESTINATION;
6069e9417d2Sbeveloper 	}
6079e9417d2Sbeveloper 	if (source == media_source::null) {
6089e9417d2Sbeveloper 		TRACE("BMediaRoster::Disconnect: media_source invalid\n");
6099e9417d2Sbeveloper 		return B_MEDIA_BAD_SOURCE;
6109e9417d2Sbeveloper 	}
6119e9417d2Sbeveloper 	if (destination == media_destination::null) {
6129e9417d2Sbeveloper 		TRACE("BMediaRoster::Disconnect: media_destination invalid\n");
6139e9417d2Sbeveloper 		return B_MEDIA_BAD_DESTINATION;
6149e9417d2Sbeveloper 	}
6159e9417d2Sbeveloper 
6169e9417d2Sbeveloper 	producer_disconnect_request request2;
6179e9417d2Sbeveloper 	producer_disconnect_reply reply2;
6189e9417d2Sbeveloper 	consumer_disconnected_request request1;
6199e9417d2Sbeveloper 	consumer_disconnected_reply reply1;
6209e9417d2Sbeveloper 	status_t rv1, rv2;
6219e9417d2Sbeveloper 
6229e9417d2Sbeveloper 	// XXX we should ask the server if this connection really exists
6239e9417d2Sbeveloper 
6249e9417d2Sbeveloper 	request1.source = source;
6259e9417d2Sbeveloper 	request1.destination = destination;
6269e9417d2Sbeveloper 	request2.source = source;
6279e9417d2Sbeveloper 	request2.destination = destination;
6289e9417d2Sbeveloper 
6299e9417d2Sbeveloper 	rv1 = QueryPort(source.port, PRODUCER_DISCONNECT, &request1, sizeof(request1), &reply1, sizeof(reply1));
6309e9417d2Sbeveloper 	rv2 = QueryPort(destination.port, CONSUMER_DISCONNECTED, &request2, sizeof(request2), &reply2, sizeof(reply2));
6319e9417d2Sbeveloper 
6329e9417d2Sbeveloper 	// XXX unregister connection with server
6339e9417d2Sbeveloper 	// XXX we should just send a notification, instead of republishing all endpoints
6349e9417d2Sbeveloper 	Stack<media_output> outstack;
6359e9417d2Sbeveloper 	Stack<media_input> instack;
6369e9417d2Sbeveloper 	media_node sourcenode;
6379e9417d2Sbeveloper 	media_node destnode;
6389e9417d2Sbeveloper 	if (B_OK == GetNodeFor(source_nodeid, &sourcenode)) {
6399e9417d2Sbeveloper 		if (B_OK == GetAllOutputs(sourcenode , &outstack))
6409e9417d2Sbeveloper 			PublishOutputs(sourcenode , &outstack);
6419e9417d2Sbeveloper 		ReleaseNode(sourcenode);
6429e9417d2Sbeveloper 	} else TRACE("BMediaRoster::Disconnect: source GetNodeFor failed\n");
6439e9417d2Sbeveloper 	if (B_OK == GetNodeFor(destination_nodeid, &destnode)) {
6449e9417d2Sbeveloper 		if (B_OK == GetAllInputs(destnode , &instack))
6459e9417d2Sbeveloper 			PublishInputs(destnode, &instack);
6469e9417d2Sbeveloper 		ReleaseNode(destnode);
6479e9417d2Sbeveloper 	} else TRACE("BMediaRoster::Disconnect: dest GetNodeFor failed\n");
6489e9417d2Sbeveloper 
6499e9417d2Sbeveloper 
6509e9417d2Sbeveloper 	// send a notification
6519e9417d2Sbeveloper 	BPrivate::media::notifications::ConnectionBroken(source, destination);
6529e9417d2Sbeveloper 
6539e9417d2Sbeveloper 	return (rv1 != B_OK || rv2 != B_OK) ? B_ERROR : B_OK;
65452a38012Sejakowatz }
65552a38012Sejakowatz 
65652a38012Sejakowatz 
65752a38012Sejakowatz status_t
65852a38012Sejakowatz BMediaRoster::StartNode(const media_node & node,
65952a38012Sejakowatz 						bigtime_t at_performance_time)
66052a38012Sejakowatz {
66152a38012Sejakowatz 	CALLED();
6629e9417d2Sbeveloper 	if (node.node <= 0)
66352a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
66452a38012Sejakowatz 
66552a38012Sejakowatz 	xfer_node_start msg;
66652a38012Sejakowatz 	msg.performance_time = at_performance_time;
66752a38012Sejakowatz 
66852a38012Sejakowatz 	return write_port(node.port, NODE_START, &msg, sizeof(msg));
66952a38012Sejakowatz }
67052a38012Sejakowatz 
67152a38012Sejakowatz 
67252a38012Sejakowatz status_t
67352a38012Sejakowatz BMediaRoster::StopNode(const media_node & node,
67452a38012Sejakowatz 					   bigtime_t at_performance_time,
67552a38012Sejakowatz 					   bool immediate)
67652a38012Sejakowatz {
67752a38012Sejakowatz 	CALLED();
6789e9417d2Sbeveloper 	if (node.node <= 0)
67952a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
68052a38012Sejakowatz 
68152a38012Sejakowatz 	xfer_node_stop msg;
68252a38012Sejakowatz 	msg.performance_time = at_performance_time;
68352a38012Sejakowatz 	msg.immediate = immediate;
68452a38012Sejakowatz 
68552a38012Sejakowatz 	return write_port(node.port, NODE_STOP, &msg, sizeof(msg));
68652a38012Sejakowatz }
68752a38012Sejakowatz 
68852a38012Sejakowatz 
68952a38012Sejakowatz status_t
69052a38012Sejakowatz BMediaRoster::SeekNode(const media_node & node,
69152a38012Sejakowatz 					   bigtime_t to_media_time,
69252a38012Sejakowatz 					   bigtime_t at_performance_time)
69352a38012Sejakowatz {
69452a38012Sejakowatz 	CALLED();
6959e9417d2Sbeveloper 	if (node.node <= 0)
69652a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
69752a38012Sejakowatz 
69852a38012Sejakowatz 	xfer_node_seek msg;
69952a38012Sejakowatz 	msg.media_time = to_media_time;
70052a38012Sejakowatz 	msg.performance_time = at_performance_time;
70152a38012Sejakowatz 
70252a38012Sejakowatz 	return write_port(node.port, NODE_SEEK, &msg, sizeof(msg));
70352a38012Sejakowatz }
70452a38012Sejakowatz 
70552a38012Sejakowatz 
70652a38012Sejakowatz status_t
70752a38012Sejakowatz BMediaRoster::StartTimeSource(const media_node & node,
70852a38012Sejakowatz 							  bigtime_t at_real_time)
70952a38012Sejakowatz {
71052a38012Sejakowatz 	CALLED();
7119e9417d2Sbeveloper 	if (node.node <= 0)
71252a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
71352a38012Sejakowatz 	if ((node.kind & B_TIME_SOURCE) == 0)
71452a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
71552a38012Sejakowatz 
71652a38012Sejakowatz 	BTimeSource::time_source_op_info msg;
71752a38012Sejakowatz 	msg.op = BTimeSource::B_TIMESOURCE_START;
71852a38012Sejakowatz 	msg.real_time = at_real_time;
71952a38012Sejakowatz 
72052a38012Sejakowatz 	return write_port(node.port, TIMESOURCE_OP, &msg, sizeof(msg));
72152a38012Sejakowatz }
72252a38012Sejakowatz 
72352a38012Sejakowatz 
72452a38012Sejakowatz status_t
72552a38012Sejakowatz BMediaRoster::StopTimeSource(const media_node & node,
72652a38012Sejakowatz 							 bigtime_t at_real_time,
72752a38012Sejakowatz 							 bool immediate)
72852a38012Sejakowatz {
72952a38012Sejakowatz 	CALLED();
7309e9417d2Sbeveloper 	if (node.node <= 0)
73152a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
73252a38012Sejakowatz 	if ((node.kind & B_TIME_SOURCE) == 0)
73352a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
73452a38012Sejakowatz 
73552a38012Sejakowatz 	BTimeSource::time_source_op_info msg;
73652a38012Sejakowatz 	msg.op = immediate ? BTimeSource::B_TIMESOURCE_STOP_IMMEDIATELY : BTimeSource::B_TIMESOURCE_STOP;
73752a38012Sejakowatz 	msg.real_time = at_real_time;
73852a38012Sejakowatz 
73952a38012Sejakowatz 	return write_port(node.port, TIMESOURCE_OP, &msg, sizeof(msg));
74052a38012Sejakowatz }
74152a38012Sejakowatz 
74252a38012Sejakowatz 
74352a38012Sejakowatz status_t
74452a38012Sejakowatz BMediaRoster::SeekTimeSource(const media_node & node,
74552a38012Sejakowatz 							 bigtime_t to_performance_time,
74652a38012Sejakowatz 							 bigtime_t at_real_time)
74752a38012Sejakowatz {
74852a38012Sejakowatz 	CALLED();
7499e9417d2Sbeveloper 	if (node.node <= 0)
75052a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
75152a38012Sejakowatz 	if ((node.kind & B_TIME_SOURCE) == 0)
75252a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
75352a38012Sejakowatz 
75452a38012Sejakowatz 	BTimeSource::time_source_op_info msg;
75552a38012Sejakowatz 	msg.op = BTimeSource::B_TIMESOURCE_SEEK;
75652a38012Sejakowatz 	msg.real_time = at_real_time;
75752a38012Sejakowatz 	msg.performance_time = to_performance_time;
75852a38012Sejakowatz 
75952a38012Sejakowatz 	return write_port(node.port, TIMESOURCE_OP, &msg, sizeof(msg));
76052a38012Sejakowatz }
76152a38012Sejakowatz 
76252a38012Sejakowatz 
76352a38012Sejakowatz status_t
76452a38012Sejakowatz BMediaRoster::SyncToNode(const media_node & node,
76552a38012Sejakowatz 						 bigtime_t at_time,
76652a38012Sejakowatz 						 bigtime_t timeout)
76752a38012Sejakowatz {
76852a38012Sejakowatz 	UNIMPLEMENTED();
76952a38012Sejakowatz 	return B_ERROR;
77052a38012Sejakowatz }
77152a38012Sejakowatz 
77252a38012Sejakowatz 
77352a38012Sejakowatz status_t
77452a38012Sejakowatz BMediaRoster::SetRunModeNode(const media_node & node,
77552a38012Sejakowatz 							 BMediaNode::run_mode mode)
77652a38012Sejakowatz {
77752a38012Sejakowatz 	CALLED();
7789e9417d2Sbeveloper 	if (node.node <= 0)
77952a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
78052a38012Sejakowatz 
78152a38012Sejakowatz 	xfer_node_set_run_mode msg;
78252a38012Sejakowatz 	msg.mode = mode;
78352a38012Sejakowatz 
78452a38012Sejakowatz 	return write_port(node.port, NODE_SET_RUN_MODE, &msg, sizeof(msg));
78552a38012Sejakowatz }
78652a38012Sejakowatz 
78752a38012Sejakowatz 
78852a38012Sejakowatz status_t
78952a38012Sejakowatz BMediaRoster::PrerollNode(const media_node & node)
79052a38012Sejakowatz {
79152a38012Sejakowatz 	CALLED();
7929e9417d2Sbeveloper 	if (node.node <= 0)
79352a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
79452a38012Sejakowatz 
79552a38012Sejakowatz 	char dummy;
79652a38012Sejakowatz 	return write_port(node.port, NODE_PREROLL, &dummy, sizeof(dummy));
79752a38012Sejakowatz }
79852a38012Sejakowatz 
79952a38012Sejakowatz 
80052a38012Sejakowatz status_t
80152a38012Sejakowatz BMediaRoster::RollNode(const media_node & node,
80252a38012Sejakowatz 					   bigtime_t startPerformance,
80352a38012Sejakowatz 					   bigtime_t stopPerformance,
80452a38012Sejakowatz 					   bigtime_t atMediaTime)
80552a38012Sejakowatz {
80652a38012Sejakowatz 	UNIMPLEMENTED();
80752a38012Sejakowatz 	return B_ERROR;
80852a38012Sejakowatz }
80952a38012Sejakowatz 
81052a38012Sejakowatz 
81152a38012Sejakowatz status_t
81252a38012Sejakowatz BMediaRoster::SetProducerRunModeDelay(const media_node & node,
81352a38012Sejakowatz 									  bigtime_t delay,
81452a38012Sejakowatz 									  BMediaNode::run_mode mode)
81552a38012Sejakowatz {
81652a38012Sejakowatz 	UNIMPLEMENTED();
81752a38012Sejakowatz 	return B_ERROR;
81852a38012Sejakowatz }
81952a38012Sejakowatz 
82052a38012Sejakowatz 
82152a38012Sejakowatz status_t
82252a38012Sejakowatz BMediaRoster::SetProducerRate(const media_node & producer,
82352a38012Sejakowatz 							  int32 numer,
82452a38012Sejakowatz 							  int32 denom)
82552a38012Sejakowatz {
82652a38012Sejakowatz 	CALLED();
82752a38012Sejakowatz 	if (producer.node == 0)
82852a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
82952a38012Sejakowatz 	if ((producer.kind & B_BUFFER_PRODUCER) == 0)
83052a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
83152a38012Sejakowatz 
83252a38012Sejakowatz 	xfer_producer_set_play_rate msg;
83352a38012Sejakowatz 	xfer_producer_set_play_rate_reply reply;
83452a38012Sejakowatz 	status_t rv;
83552a38012Sejakowatz 	int32 code;
83652a38012Sejakowatz 
83752a38012Sejakowatz 	msg.numer = numer;
83852a38012Sejakowatz 	msg.denom = denom;
83952a38012Sejakowatz 	msg.reply_port = _PortPool->GetPort();
84052a38012Sejakowatz 	rv = write_port(producer.node, PRODUCER_SET_PLAY_RATE, &msg, sizeof(msg));
84152a38012Sejakowatz 	if (rv != B_OK) {
84252a38012Sejakowatz 		_PortPool->PutPort(msg.reply_port);
84352a38012Sejakowatz 		return rv;
84452a38012Sejakowatz 	}
84552a38012Sejakowatz 	rv = read_port(msg.reply_port, &code, &reply, sizeof(reply));
84652a38012Sejakowatz 	_PortPool->PutPort(msg.reply_port);
84752a38012Sejakowatz 	return (rv < B_OK) ? rv : reply.result;
84852a38012Sejakowatz }
84952a38012Sejakowatz 
85052a38012Sejakowatz 
85152a38012Sejakowatz /* Nodes will have available inputs/outputs as long as they are capable */
85252a38012Sejakowatz /* of accepting more connections. The node may create an additional */
85352a38012Sejakowatz /* output or input as the currently available is taken into usage. */
85452a38012Sejakowatz status_t
85552a38012Sejakowatz BMediaRoster::GetLiveNodeInfo(const media_node & node,
85652a38012Sejakowatz 							  live_node_info * out_live_info)
85752a38012Sejakowatz {
8589e9417d2Sbeveloper 	CALLED();
8599e9417d2Sbeveloper 	if (out_live_info == NULL)
8609e9417d2Sbeveloper 		return B_BAD_VALUE;
8619e9417d2Sbeveloper 	if (node.node <= 0)
8629e9417d2Sbeveloper 		return B_MEDIA_BAD_NODE;
8639e9417d2Sbeveloper 
8649e9417d2Sbeveloper 	server_get_live_node_info_request request;
8659e9417d2Sbeveloper 	server_get_live_node_info_reply reply;
8669e9417d2Sbeveloper 	status_t rv;
8679e9417d2Sbeveloper 
8689e9417d2Sbeveloper 	request.node = node;
8699e9417d2Sbeveloper 
8701299bfb2Sbeveloper 	rv = QueryServer(SERVER_GET_LIVE_NODE_INFO, &request, sizeof(request), &reply, sizeof(reply));
8719e9417d2Sbeveloper 	if (rv != B_OK)
8729e9417d2Sbeveloper 		return rv;
8739e9417d2Sbeveloper 
8749e9417d2Sbeveloper 	*out_live_info = reply.live_info;
8759e9417d2Sbeveloper 	return B_OK;
87652a38012Sejakowatz }
87752a38012Sejakowatz 
87852a38012Sejakowatz 
87952a38012Sejakowatz status_t
88052a38012Sejakowatz BMediaRoster::GetLiveNodes(live_node_info * out_live_nodes,
88152a38012Sejakowatz 						   int32 * io_total_count,
88252a38012Sejakowatz 						   const media_format * has_input,
88352a38012Sejakowatz 						   const media_format * has_output,
88452a38012Sejakowatz 						   const char * name,
88552a38012Sejakowatz 						   uint64 node_kinds)
88652a38012Sejakowatz {
8879e9417d2Sbeveloper 	CALLED();
8889e9417d2Sbeveloper 	if (out_live_nodes == NULL || io_total_count == NULL)
8899e9417d2Sbeveloper 		return B_BAD_VALUE;
8909e9417d2Sbeveloper 	if (*io_total_count <= 0)
8919e9417d2Sbeveloper 		return B_BAD_VALUE;
8929e9417d2Sbeveloper 
8939e9417d2Sbeveloper 	// XXX we also support the wildcard search as GetDormantNodes does. This needs to be documented
8949e9417d2Sbeveloper 
8959e9417d2Sbeveloper 	server_get_live_nodes_request request;
8969e9417d2Sbeveloper 	server_get_live_nodes_reply reply;
8979e9417d2Sbeveloper 	status_t rv;
8989e9417d2Sbeveloper 
8999e9417d2Sbeveloper 	request.maxcount = *io_total_count;
9009e9417d2Sbeveloper 	request.has_input = (bool) has_input;
9019e9417d2Sbeveloper 	if (has_input)
9029e9417d2Sbeveloper 		request.inputformat = *has_input; // XXX we should not make a flat copy of media_format
9039e9417d2Sbeveloper 	request.has_output = (bool) has_output;
9049e9417d2Sbeveloper 	if (has_output)
9059e9417d2Sbeveloper 		request.outputformat = *has_output; // XXX we should not make a flat copy of media_format
9069e9417d2Sbeveloper 	request.has_name = (bool) name;
9079e9417d2Sbeveloper 	if (name) {
9089e9417d2Sbeveloper 		int len = strlen(name);
9099e9417d2Sbeveloper 		len = min_c(len, (int)sizeof(request.name) - 1);
9109e9417d2Sbeveloper 		memcpy(request.name, name, len);
9119e9417d2Sbeveloper 		request.name[len] = 0;
9129e9417d2Sbeveloper 	}
9139e9417d2Sbeveloper 	request.require_kinds = node_kinds;
9149e9417d2Sbeveloper 
9159e9417d2Sbeveloper 	rv = QueryServer(SERVER_GET_LIVE_NODES, &request, sizeof(request), &reply, sizeof(reply));
9169e9417d2Sbeveloper 	if (rv != B_OK) {
9179e9417d2Sbeveloper 		TRACE("BMediaRoster::GetLiveNodes failed\n");
9181299bfb2Sbeveloper 		*io_total_count = 0;
9199e9417d2Sbeveloper 		return rv;
9209e9417d2Sbeveloper 	}
9219e9417d2Sbeveloper 
9229e9417d2Sbeveloper 	if (reply.count > MAX_LIVE_INFO) {
9239e9417d2Sbeveloper 		live_node_info *live_info;
9249e9417d2Sbeveloper 		area_id clone;
9259e9417d2Sbeveloper 
9269e9417d2Sbeveloper 		clone = clone_area("live_node_info clone", reinterpret_cast<void **>(&live_info), B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, reply.area);
9279e9417d2Sbeveloper 		if (clone < B_OK) {
9289e9417d2Sbeveloper 			TRACE("BMediaRoster::GetLiveNodes failed to clone area, %#lx\n", clone);
9299e9417d2Sbeveloper 			delete_area(reply.area);
9301299bfb2Sbeveloper 			*io_total_count = 0;
93152a38012Sejakowatz 			return B_ERROR;
93252a38012Sejakowatz 		}
93352a38012Sejakowatz 
9349e9417d2Sbeveloper 		for (int32 i = 0; i < reply.count; i++) {
9359e9417d2Sbeveloper 			out_live_nodes[i] = live_info[i];
9369e9417d2Sbeveloper 		}
9379e9417d2Sbeveloper 
9389e9417d2Sbeveloper 		delete_area(clone);
9399e9417d2Sbeveloper 		delete_area(reply.area);
9409e9417d2Sbeveloper 	} else {
9419e9417d2Sbeveloper 		for (int32 i = 0; i < reply.count; i++) {
9429e9417d2Sbeveloper 			out_live_nodes[i] = reply.live_info[i];
9439e9417d2Sbeveloper 		}
9449e9417d2Sbeveloper 	}
9459e9417d2Sbeveloper 	*io_total_count = reply.count;
9469e9417d2Sbeveloper 
9479e9417d2Sbeveloper 	return B_OK;
9489e9417d2Sbeveloper }
9499e9417d2Sbeveloper 
95052a38012Sejakowatz 
95152a38012Sejakowatz status_t
95252a38012Sejakowatz BMediaRoster::GetFreeInputsFor(const media_node & node,
95352a38012Sejakowatz 							   media_input * out_free_inputs,
95452a38012Sejakowatz 							   int32 buf_num_inputs,
95552a38012Sejakowatz 							   int32 * out_total_count,
95652a38012Sejakowatz 							   media_type filter_type)
95752a38012Sejakowatz {
9583620737cSbeveloper 	CALLED();
9599e9417d2Sbeveloper 	if (node.node <= 0 || (node.kind & B_BUFFER_CONSUMER) == 0)
9603620737cSbeveloper 		return B_MEDIA_BAD_NODE;
9613620737cSbeveloper 	if (out_free_inputs == NULL || out_total_count == NULL)
9623620737cSbeveloper 		return B_BAD_VALUE;
9633620737cSbeveloper 
9643620737cSbeveloper 	Stack<media_input> stack;
9653620737cSbeveloper 	media_input *input;
9663620737cSbeveloper 	status_t rv;
9673620737cSbeveloper 
9681299bfb2Sbeveloper 	*out_total_count = 0;
9691299bfb2Sbeveloper 
9703620737cSbeveloper 	rv = GetAllInputs(node, &stack);
9713620737cSbeveloper 	if (B_OK != rv)
9723620737cSbeveloper 		return rv;
9733620737cSbeveloper 
9743620737cSbeveloper 	for (int32 i = 0; stack.GetPointerAt(i, &input); i++) {
9753620737cSbeveloper 		if (filter_type != B_MEDIA_UNKNOWN_TYPE && filter_type != input->format.type)
9763620737cSbeveloper 			continue; // media_type used, but doesn't match
9773620737cSbeveloper 		if (input->source != media_source::null)
9783620737cSbeveloper 			continue; // consumer source already connected
9793620737cSbeveloper 		out_free_inputs[i] = *input;
9803620737cSbeveloper 		*out_total_count += 1;
9813620737cSbeveloper 		buf_num_inputs -= 1;
9823620737cSbeveloper 		if (buf_num_inputs == 0)
9833620737cSbeveloper 			break;
9843620737cSbeveloper 	}
9853620737cSbeveloper 
9863620737cSbeveloper 	PublishInputs(node, &stack);
9873620737cSbeveloper 	return B_OK;
98852a38012Sejakowatz }
98952a38012Sejakowatz 
99052a38012Sejakowatz 
99152a38012Sejakowatz status_t
99252a38012Sejakowatz BMediaRoster::GetConnectedInputsFor(const media_node & node,
99352a38012Sejakowatz 									media_input * out_active_inputs,
99452a38012Sejakowatz 									int32 buf_num_inputs,
99552a38012Sejakowatz 									int32 * out_total_count)
99652a38012Sejakowatz {
9973620737cSbeveloper 	CALLED();
9989e9417d2Sbeveloper 	if (node.node <= 0 || (node.kind & B_BUFFER_CONSUMER) == 0)
9993620737cSbeveloper 		return B_MEDIA_BAD_NODE;
10003620737cSbeveloper 	if (out_active_inputs == NULL || out_total_count == NULL)
10013620737cSbeveloper 		return B_BAD_VALUE;
10023620737cSbeveloper 
10033620737cSbeveloper 	Stack<media_input> stack;
10043620737cSbeveloper 	media_input *input;
10053620737cSbeveloper 	status_t rv;
10063620737cSbeveloper 
10071299bfb2Sbeveloper 	*out_total_count = 0;
10081299bfb2Sbeveloper 
10093620737cSbeveloper 	rv = GetAllInputs(node, &stack);
10103620737cSbeveloper 	if (B_OK != rv)
10113620737cSbeveloper 		return rv;
10123620737cSbeveloper 
10133620737cSbeveloper 	for (int32 i = 0; stack.GetPointerAt(i, &input); i++) {
10143620737cSbeveloper 		if (input->source == media_source::null)
10153620737cSbeveloper 			continue; // consumer source not connected
10163620737cSbeveloper 		out_active_inputs[i] = *input;
10173620737cSbeveloper 		*out_total_count += 1;
10183620737cSbeveloper 		buf_num_inputs -= 1;
10193620737cSbeveloper 		if (buf_num_inputs == 0)
10203620737cSbeveloper 			break;
10213620737cSbeveloper 	}
10223620737cSbeveloper 
10233620737cSbeveloper 	PublishInputs(node, &stack);
10243620737cSbeveloper 	return B_OK;
102552a38012Sejakowatz }
102652a38012Sejakowatz 
102752a38012Sejakowatz 
102852a38012Sejakowatz status_t
102952a38012Sejakowatz BMediaRoster::GetAllInputsFor(const media_node & node,
103052a38012Sejakowatz 							  media_input * out_inputs,
103152a38012Sejakowatz 							  int32 buf_num_inputs,
103252a38012Sejakowatz 							  int32 * out_total_count)
103352a38012Sejakowatz {
103452a38012Sejakowatz 	CALLED();
10359e9417d2Sbeveloper 	if (node.node <= 0 || (node.kind & B_BUFFER_CONSUMER) == 0)
103652a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
103752a38012Sejakowatz 	if (out_inputs == NULL || out_total_count == NULL)
103852a38012Sejakowatz 		return B_BAD_VALUE;
103952a38012Sejakowatz 
10403620737cSbeveloper 	Stack<media_input> stack;
10413620737cSbeveloper 	media_input *input;
104252a38012Sejakowatz 	status_t rv;
104352a38012Sejakowatz 
10441299bfb2Sbeveloper 	*out_total_count = 0;
10451299bfb2Sbeveloper 
10463620737cSbeveloper 	rv = GetAllInputs(node, &stack);
10473620737cSbeveloper 	if (B_OK != rv)
10483620737cSbeveloper 		return rv;
10493620737cSbeveloper 
10503620737cSbeveloper 	for (int32 i = 0; stack.GetPointerAt(i, &input); i++) {
10513620737cSbeveloper 		out_inputs[i] = *input;
105252a38012Sejakowatz 		*out_total_count += 1;
10533620737cSbeveloper 		buf_num_inputs -= 1;
10543620737cSbeveloper 		if (buf_num_inputs == 0)
10553620737cSbeveloper 			break;
105652a38012Sejakowatz 	}
105752a38012Sejakowatz 
10583620737cSbeveloper 	PublishInputs(node, &stack);
10593620737cSbeveloper 	return B_OK;
106052a38012Sejakowatz }
106152a38012Sejakowatz 
106252a38012Sejakowatz 
106352a38012Sejakowatz status_t
106452a38012Sejakowatz BMediaRoster::GetFreeOutputsFor(const media_node & node,
106552a38012Sejakowatz 								media_output * out_free_outputs,
106652a38012Sejakowatz 								int32 buf_num_outputs,
106752a38012Sejakowatz 								int32 * out_total_count,
106852a38012Sejakowatz 								media_type filter_type)
106952a38012Sejakowatz {
10703620737cSbeveloper 	CALLED();
10719e9417d2Sbeveloper 	if (node.node <= 0 || (node.kind & B_BUFFER_PRODUCER) == 0)
10723620737cSbeveloper 		return B_MEDIA_BAD_NODE;
10733620737cSbeveloper 	if (out_free_outputs == NULL || out_total_count == NULL)
10743620737cSbeveloper 		return B_BAD_VALUE;
10753620737cSbeveloper 
10763620737cSbeveloper 	Stack<media_output> stack;
10773620737cSbeveloper 	media_output *output;
10783620737cSbeveloper 	status_t rv;
10793620737cSbeveloper 
10801299bfb2Sbeveloper 	*out_total_count = 0;
10811299bfb2Sbeveloper 
10823620737cSbeveloper 	rv = GetAllOutputs(node, &stack);
10833620737cSbeveloper 	if (B_OK != rv)
10843620737cSbeveloper 		return rv;
10853620737cSbeveloper 
10863620737cSbeveloper 	for (int32 i = 0; stack.GetPointerAt(i, &output); i++) {
10873620737cSbeveloper 		if (filter_type != B_MEDIA_UNKNOWN_TYPE && filter_type != output->format.type)
10883620737cSbeveloper 			continue; // media_type used, but doesn't match
10893620737cSbeveloper 		if (output->destination != media_destination::null)
10903620737cSbeveloper 			continue; // producer destination already connected
10913620737cSbeveloper 		out_free_outputs[i] = *output;
10923620737cSbeveloper 		*out_total_count += 1;
10933620737cSbeveloper 		buf_num_outputs -= 1;
10943620737cSbeveloper 		if (buf_num_outputs == 0)
10953620737cSbeveloper 			break;
10963620737cSbeveloper 	}
10973620737cSbeveloper 
10983620737cSbeveloper 	PublishOutputs(node, &stack);
10993620737cSbeveloper 	return B_OK;
110052a38012Sejakowatz }
110152a38012Sejakowatz 
110252a38012Sejakowatz 
110352a38012Sejakowatz status_t
110452a38012Sejakowatz BMediaRoster::GetConnectedOutputsFor(const media_node & node,
110552a38012Sejakowatz 									 media_output * out_active_outputs,
110652a38012Sejakowatz 									 int32 buf_num_outputs,
110752a38012Sejakowatz 									 int32 * out_total_count)
110852a38012Sejakowatz {
11093620737cSbeveloper 	CALLED();
11109e9417d2Sbeveloper 	if (node.node <= 0 || (node.kind & B_BUFFER_PRODUCER) == 0)
11113620737cSbeveloper 		return B_MEDIA_BAD_NODE;
11123620737cSbeveloper 	if (out_active_outputs == NULL || out_total_count == NULL)
11133620737cSbeveloper 		return B_BAD_VALUE;
11143620737cSbeveloper 
11153620737cSbeveloper 	Stack<media_output> stack;
11163620737cSbeveloper 	media_output *output;
11173620737cSbeveloper 	status_t rv;
11183620737cSbeveloper 
11191299bfb2Sbeveloper 	*out_total_count = 0;
11201299bfb2Sbeveloper 
11213620737cSbeveloper 	rv = GetAllOutputs(node, &stack);
11223620737cSbeveloper 	if (B_OK != rv)
11233620737cSbeveloper 		return rv;
11243620737cSbeveloper 
11253620737cSbeveloper 	for (int32 i = 0; stack.GetPointerAt(i, &output); i++) {
11263620737cSbeveloper 		if (output->destination == media_destination::null)
11273620737cSbeveloper 			continue; // producer destination not connected
11283620737cSbeveloper 		out_active_outputs[i] = *output;
11293620737cSbeveloper 		*out_total_count += 1;
11303620737cSbeveloper 		buf_num_outputs -= 1;
11313620737cSbeveloper 		if (buf_num_outputs == 0)
11323620737cSbeveloper 			break;
11333620737cSbeveloper 	}
11343620737cSbeveloper 
11353620737cSbeveloper 	PublishOutputs(node, &stack);
11363620737cSbeveloper 	return B_OK;
113752a38012Sejakowatz }
113852a38012Sejakowatz 
113952a38012Sejakowatz 
114052a38012Sejakowatz status_t
114152a38012Sejakowatz BMediaRoster::GetAllOutputsFor(const media_node & node,
114252a38012Sejakowatz 							   media_output * out_outputs,
114352a38012Sejakowatz 							   int32 buf_num_outputs,
114452a38012Sejakowatz 							   int32 * out_total_count)
114552a38012Sejakowatz {
114652a38012Sejakowatz 	CALLED();
11479e9417d2Sbeveloper 	if (node.node <= 0 || (node.kind & B_BUFFER_PRODUCER) == 0)
114852a38012Sejakowatz 		return B_MEDIA_BAD_NODE;
114952a38012Sejakowatz 	if (out_outputs == NULL || out_total_count == NULL)
115052a38012Sejakowatz 		return B_BAD_VALUE;
115152a38012Sejakowatz 
11523620737cSbeveloper 	Stack<media_output> stack;
11533620737cSbeveloper 	media_output *output;
115452a38012Sejakowatz 	status_t rv;
115552a38012Sejakowatz 
11561299bfb2Sbeveloper 	*out_total_count = 0;
11571299bfb2Sbeveloper 
11583620737cSbeveloper 	rv = GetAllOutputs(node, &stack);
11593620737cSbeveloper 	if (B_OK != rv)
11603620737cSbeveloper 		return rv;
11613620737cSbeveloper 
11623620737cSbeveloper 	for (int32 i = 0; stack.GetPointerAt(i, &output); i++) {
11633620737cSbeveloper 		out_outputs[i] = *output;
116452a38012Sejakowatz 		*out_total_count += 1;
11653620737cSbeveloper 		buf_num_outputs -= 1;
11663620737cSbeveloper 		if (buf_num_outputs == 0)
11673620737cSbeveloper 			break;
116852a38012Sejakowatz 	}
116952a38012Sejakowatz 
11703620737cSbeveloper 	PublishOutputs(node, &stack);
11713620737cSbeveloper 	return B_OK;
117252a38012Sejakowatz }
117352a38012Sejakowatz 
117452a38012Sejakowatz 
117552a38012Sejakowatz status_t
117652a38012Sejakowatz BMediaRoster::StartWatching(const BMessenger & where)
117752a38012Sejakowatz {
1178eae26d3dSbeveloper 	CALLED();
1179eae26d3dSbeveloper 	if (!where.IsValid()) {
1180eae26d3dSbeveloper 		TRACE("BMediaRoster::StartWatching: messenger invalid!\n");
1181eae26d3dSbeveloper 		return B_BAD_VALUE;
1182eae26d3dSbeveloper 	}
1183f4925104Sbeveloper 	return BPrivate::media::notifications::Register(where, media_node::null, B_MEDIA_WILDCARD);
118452a38012Sejakowatz }
118552a38012Sejakowatz 
118652a38012Sejakowatz 
118752a38012Sejakowatz status_t
118852a38012Sejakowatz BMediaRoster::StartWatching(const BMessenger & where,
118952a38012Sejakowatz 							int32 notificationType)
119052a38012Sejakowatz {
1191eae26d3dSbeveloper 	CALLED();
1192eae26d3dSbeveloper 	if (!where.IsValid()) {
1193eae26d3dSbeveloper 		TRACE("BMediaRoster::StartWatching: messenger invalid!\n");
1194eae26d3dSbeveloper 		return B_BAD_VALUE;
1195eae26d3dSbeveloper 	}
1196f4925104Sbeveloper 	if (false == BPrivate::media::notifications::IsValidNotificationRequest(false, notificationType)) {
1197eae26d3dSbeveloper 		TRACE("BMediaRoster::StartWatching: notificationType invalid!\n");
1198eae26d3dSbeveloper 		return B_BAD_VALUE;
1199eae26d3dSbeveloper 	}
1200f4925104Sbeveloper 	return BPrivate::media::notifications::Register(where, media_node::null, notificationType);
120152a38012Sejakowatz }
120252a38012Sejakowatz 
120352a38012Sejakowatz 
120452a38012Sejakowatz status_t
120552a38012Sejakowatz BMediaRoster::StartWatching(const BMessenger & where,
120652a38012Sejakowatz 							const media_node & node,
120752a38012Sejakowatz 							int32 notificationType)
120852a38012Sejakowatz {
1209eae26d3dSbeveloper 	CALLED();
1210eae26d3dSbeveloper 	if (!where.IsValid()) {
1211eae26d3dSbeveloper 		TRACE("BMediaRoster::StartWatching: messenger invalid!\n");
1212eae26d3dSbeveloper 		return B_BAD_VALUE;
1213eae26d3dSbeveloper 	}
12149e9417d2Sbeveloper 	if (node.node <= 0) {
1215eae26d3dSbeveloper 		TRACE("BMediaRoster::StartWatching: node invalid!\n");
1216eae26d3dSbeveloper 		return B_MEDIA_BAD_NODE;
1217eae26d3dSbeveloper 	}
1218f4925104Sbeveloper 	if (false == BPrivate::media::notifications::IsValidNotificationRequest(true, notificationType)) {
1219eae26d3dSbeveloper 		TRACE("BMediaRoster::StartWatching: notificationType invalid!\n");
1220eae26d3dSbeveloper 		return B_BAD_VALUE;
1221eae26d3dSbeveloper 	}
1222f4925104Sbeveloper 	return BPrivate::media::notifications::Register(where, node, notificationType);
122352a38012Sejakowatz }
122452a38012Sejakowatz 
122552a38012Sejakowatz 
122652a38012Sejakowatz status_t
122752a38012Sejakowatz BMediaRoster::StopWatching(const BMessenger & where)
122852a38012Sejakowatz {
1229eae26d3dSbeveloper 	CALLED();
1230eae26d3dSbeveloper 	// messenger may already be invalid, so we don't check this
1231f4925104Sbeveloper 	return BPrivate::media::notifications::Unregister(where, media_node::null, B_MEDIA_WILDCARD);
123252a38012Sejakowatz }
123352a38012Sejakowatz 
123452a38012Sejakowatz 
123552a38012Sejakowatz status_t
123652a38012Sejakowatz BMediaRoster::StopWatching(const BMessenger & where,
123752a38012Sejakowatz 						   int32 notificationType)
123852a38012Sejakowatz {
1239eae26d3dSbeveloper 	CALLED();
1240eae26d3dSbeveloper 	// messenger may already be invalid, so we don't check this
1241f4925104Sbeveloper 	if (false == BPrivate::media::notifications::IsValidNotificationRequest(false, notificationType)) {
1242eae26d3dSbeveloper 		TRACE("BMediaRoster::StopWatching: notificationType invalid!\n");
1243eae26d3dSbeveloper 		return B_BAD_VALUE;
1244eae26d3dSbeveloper 	}
1245f4925104Sbeveloper 	return BPrivate::media::notifications::Unregister(where, media_node::null, notificationType);
124652a38012Sejakowatz }
124752a38012Sejakowatz 
124852a38012Sejakowatz 
124952a38012Sejakowatz status_t
125052a38012Sejakowatz BMediaRoster::StopWatching(const BMessenger & where,
125152a38012Sejakowatz 						   const media_node & node,
125252a38012Sejakowatz 						   int32 notificationType)
125352a38012Sejakowatz {
1254eae26d3dSbeveloper 	CALLED();
1255eae26d3dSbeveloper 	// messenger may already be invalid, so we don't check this
12569e9417d2Sbeveloper 	if (node.node <= 0) {
1257eae26d3dSbeveloper 		TRACE("BMediaRoster::StopWatching: node invalid!\n");
1258eae26d3dSbeveloper 		return B_MEDIA_BAD_NODE;
1259eae26d3dSbeveloper 	}
1260f4925104Sbeveloper 	if (false == BPrivate::media::notifications::IsValidNotificationRequest(true, notificationType)) {
1261eae26d3dSbeveloper 		TRACE("BMediaRoster::StopWatching: notificationType invalid!\n");
1262eae26d3dSbeveloper 		return B_BAD_VALUE;
1263eae26d3dSbeveloper 	}
1264f4925104Sbeveloper 	return BPrivate::media::notifications::Unregister(where, node, notificationType);
126552a38012Sejakowatz }
126652a38012Sejakowatz 
126752a38012Sejakowatz 
126852a38012Sejakowatz status_t
126952a38012Sejakowatz BMediaRoster::RegisterNode(BMediaNode * node)
127052a38012Sejakowatz {
127152a38012Sejakowatz 	CALLED();
127252a38012Sejakowatz 	if (node == NULL)
127352a38012Sejakowatz 		return B_BAD_VALUE;
127452a38012Sejakowatz 
12753620737cSbeveloper 	status_t rv;
12769e9417d2Sbeveloper 	BMediaAddOn *addon;
12779e9417d2Sbeveloper 	int32 addon_flavor_id;
12789e9417d2Sbeveloper 	media_addon_id addon_id;
12793620737cSbeveloper 
12809e9417d2Sbeveloper 	addon_flavor_id = 0;
12819e9417d2Sbeveloper 	addon = node->AddOn(&addon_flavor_id);
12829e9417d2Sbeveloper 	addon_id = addon ? addon->AddonID() : -1;
128352a38012Sejakowatz 
12849e9417d2Sbeveloper 	server_register_node_request request;
12859e9417d2Sbeveloper 	server_register_node_reply reply;
12869e9417d2Sbeveloper 
12879e9417d2Sbeveloper 	request.addon_id = addon_id;
12889e9417d2Sbeveloper 	request.addon_flavor_id = addon_flavor_id;
12899e9417d2Sbeveloper 	strcpy(request.name, node->Name());
12909e9417d2Sbeveloper 	request.kinds = node->Kinds();
12919e9417d2Sbeveloper 	request.port = node->ControlPort();
12929e9417d2Sbeveloper 	request.team = team;
12939e9417d2Sbeveloper 
12941299bfb2Sbeveloper 	TRACE("BMediaRoster::RegisterNode: sending SERVER_REGISTER_NODE: port %ld, kinds %#Lx, team %ld, name '%s'\n", request.port, request.kinds, request.team, request.name);
12951299bfb2Sbeveloper 
12969e9417d2Sbeveloper 	rv = QueryServer(SERVER_REGISTER_NODE, &request, sizeof(request), &reply, sizeof(reply));
12979e9417d2Sbeveloper 	if (rv != B_OK) {
12989e9417d2Sbeveloper 		TRACE("BMediaRoster::RegisterNode: failed to register node %s (error %#lx)\n", node->Name(), rv);
12999e9417d2Sbeveloper 		return rv;
13009e9417d2Sbeveloper 	}
13019e9417d2Sbeveloper 
13029e9417d2Sbeveloper 	// we are a friend class of BMediaNode and initilize this member variable
13039e9417d2Sbeveloper 	node->fNodeID = reply.nodeid;
13049e9417d2Sbeveloper 	ASSERT(reply.nodeid == node->Node().node);
13059e9417d2Sbeveloper 	ASSERT(reply.nodeid == node->ID());
13069e9417d2Sbeveloper 
13079e9417d2Sbeveloper 	// call the callback
13089e9417d2Sbeveloper 	node->NodeRegistered();
13093620737cSbeveloper 
1310*570f7d04Sbeveloper /*
13113620737cSbeveloper 	// register existing inputs and outputs with the
13123620737cSbeveloper 	// media_server, this allows GetLiveNodes() to work
13133620737cSbeveloper 	// with created, but unconnected nodes.
13143620737cSbeveloper 	if (node->Kinds() & B_BUFFER_PRODUCER) {
13153620737cSbeveloper 		Stack<media_output> stack;
13163620737cSbeveloper 		if (B_OK == GetAllOutputs(node->Node(), &stack))
13173620737cSbeveloper 			PublishOutputs(node->Node(), &stack);
13183620737cSbeveloper 	} else if (node->Kinds() & B_BUFFER_CONSUMER) {
13193620737cSbeveloper 		Stack<media_input> stack;
13203620737cSbeveloper 		if (B_OK == GetAllInputs(node->Node(), &stack))
13213620737cSbeveloper 			PublishInputs(node->Node(), &stack);
13223620737cSbeveloper 	}
1323*570f7d04Sbeveloper */
1324*570f7d04Sbeveloper 
13251299bfb2Sbeveloper 	BPrivate::media::notifications::NodesCreated(&reply.nodeid, 1);
1326*570f7d04Sbeveloper /*
1327*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: registered node name '%s', id %ld, addon %ld, flavor %ld\n", node->Name(), node->ID(), addon_id, addon_flavor_id);
1328*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: node this               %p\n", node);
1329*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: node fConsumerThis      %p\n", node->fConsumerThis);
1330*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: node fProducerThis      %p\n", node->fProducerThis);
1331*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: node fFileInterfaceThis %p\n", node->fFileInterfaceThis);
1332*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: node fControllableThis  %p\n", node->fControllableThis);
1333*570f7d04Sbeveloper 	TRACE("BMediaRoster::RegisterNode: node fTimeSourceThis    %p\n", node->fTimeSourceThis);
1334*570f7d04Sbeveloper */
13359e9417d2Sbeveloper 
13369e9417d2Sbeveloper 	return B_OK;
133752a38012Sejakowatz }
133852a38012Sejakowatz 
133952a38012Sejakowatz 
134052a38012Sejakowatz status_t
134152a38012Sejakowatz BMediaRoster::UnregisterNode(BMediaNode * node)
134252a38012Sejakowatz {
13439e9417d2Sbeveloper 	CALLED();
13449e9417d2Sbeveloper 	if (node == NULL)
13459e9417d2Sbeveloper 		return B_BAD_VALUE;
13469e9417d2Sbeveloper 
13479e9417d2Sbeveloper 	if (node->fRefCount != 0) {
1348*570f7d04Sbeveloper 		TRACE("BMediaRoster::UnregisterNode: Warning node name '%s' has local reference count of %ld\n", node->Name(), node->fRefCount);
13499e9417d2Sbeveloper 		// no return here, we continue and unregister!
13509e9417d2Sbeveloper 	}
13519e9417d2Sbeveloper 	if (node->ID() == -2) {
1352*570f7d04Sbeveloper 		TRACE("BMediaRoster::UnregisterNode: Warning node name '%s' already unregistered\n", node->Name());
13539e9417d2Sbeveloper 		return B_OK;
13549e9417d2Sbeveloper 	}
13559e9417d2Sbeveloper 
13569e9417d2Sbeveloper 	server_unregister_node_request request;
13579e9417d2Sbeveloper 	server_unregister_node_reply reply;
13589e9417d2Sbeveloper 	status_t rv;
13599e9417d2Sbeveloper 
13609e9417d2Sbeveloper 	request.nodeid = node->ID();
13619e9417d2Sbeveloper 	request.team = team;
13629e9417d2Sbeveloper 
13631299bfb2Sbeveloper 	// send a notification
13641299bfb2Sbeveloper 	BPrivate::media::notifications::NodesDeleted(&request.nodeid, 1);
13651299bfb2Sbeveloper 
13669e9417d2Sbeveloper 	rv = QueryServer(SERVER_UNREGISTER_NODE, &request, sizeof(request), &reply, sizeof(reply));
13679e9417d2Sbeveloper 	if (rv != B_OK) {
1368*570f7d04Sbeveloper 		TRACE("BMediaRoster::UnregisterNode: failed to unregister node name '%s' (error %#lx)\n", node->Name(), rv);
13699e9417d2Sbeveloper 		return rv;
13709e9417d2Sbeveloper 	}
13719e9417d2Sbeveloper 
13729e9417d2Sbeveloper 	if (reply.addon_id != -1)
13739e9417d2Sbeveloper 		_DormantNodeManager->PutAddon(reply.addon_id);
13749e9417d2Sbeveloper 
13751299bfb2Sbeveloper 	// we are a friend class of BMediaNode and invalidate this member variable
13769e9417d2Sbeveloper 	node->fNodeID = -2;
13779e9417d2Sbeveloper 
13789e9417d2Sbeveloper 	return B_OK;
137952a38012Sejakowatz }
138052a38012Sejakowatz 
138152a38012Sejakowatz 
138252a38012Sejakowatz //	thread safe for multiple calls to Roster()
138352a38012Sejakowatz /* static */ BMediaRoster *
138452a38012Sejakowatz BMediaRoster::Roster(status_t* out_error)
138552a38012Sejakowatz {
138652a38012Sejakowatz 	static BLocker locker("BMediaRoster::Roster locker");
138752a38012Sejakowatz 	locker.Lock();
138852a38012Sejakowatz 	if (_sDefault == NULL) {
138952a38012Sejakowatz 		_sDefault = new BMediaRoster();
139052a38012Sejakowatz 		if (out_error != NULL)
139152a38012Sejakowatz 			*out_error = B_OK;
139252a38012Sejakowatz 	} else {
139352a38012Sejakowatz 		if (out_error != NULL)
139452a38012Sejakowatz 			*out_error = B_OK;
139552a38012Sejakowatz 	}
139652a38012Sejakowatz 	locker.Unlock();
139752a38012Sejakowatz 	return _sDefault;
139852a38012Sejakowatz }
139952a38012Sejakowatz 
140052a38012Sejakowatz 
140152a38012Sejakowatz //	won't create it if there isn't one
140252a38012Sejakowatz //	not thread safe if you call Roster() at the same time
140352a38012Sejakowatz /* static */ BMediaRoster *
140452a38012Sejakowatz BMediaRoster::CurrentRoster()
140552a38012Sejakowatz {
140652a38012Sejakowatz 	return _sDefault;
140752a38012Sejakowatz }
140852a38012Sejakowatz 
140952a38012Sejakowatz 
141052a38012Sejakowatz status_t
141152a38012Sejakowatz BMediaRoster::SetTimeSourceFor(media_node_id node,
141252a38012Sejakowatz 							   media_node_id time_source)
141352a38012Sejakowatz {
141452a38012Sejakowatz 	UNIMPLEMENTED();
141552a38012Sejakowatz 	return B_ERROR;
141652a38012Sejakowatz }
141752a38012Sejakowatz 
141852a38012Sejakowatz 
141952a38012Sejakowatz status_t
142052a38012Sejakowatz BMediaRoster::GetParameterWebFor(const media_node & node,
142152a38012Sejakowatz 								 BParameterWeb ** out_web)
142252a38012Sejakowatz {
142352a38012Sejakowatz 	UNIMPLEMENTED();
142452a38012Sejakowatz 	return B_ERROR;
142552a38012Sejakowatz }
142652a38012Sejakowatz 
142752a38012Sejakowatz 
142852a38012Sejakowatz status_t
142952a38012Sejakowatz BMediaRoster::StartControlPanel(const media_node & node,
143052a38012Sejakowatz 								BMessenger * out_messenger)
143152a38012Sejakowatz {
143252a38012Sejakowatz 	UNIMPLEMENTED();
143352a38012Sejakowatz 	return B_ERROR;
143452a38012Sejakowatz }
143552a38012Sejakowatz 
143652a38012Sejakowatz 
143752a38012Sejakowatz status_t
143852a38012Sejakowatz BMediaRoster::GetDormantNodes(dormant_node_info * out_info,
143952a38012Sejakowatz 							  int32 * io_count,
144052a38012Sejakowatz 							  const media_format * has_input /* = NULL */,
144152a38012Sejakowatz 							  const media_format * has_output /* = NULL */,
144252a38012Sejakowatz 							  const char * name /* = NULL */,
144352a38012Sejakowatz 							  uint64 require_kinds /* = NULL */,
144452a38012Sejakowatz 							  uint64 deny_kinds /* = NULL */)
144552a38012Sejakowatz {
144652a38012Sejakowatz 	CALLED();
144752a38012Sejakowatz 	if (out_info == NULL)
144852a38012Sejakowatz 		return B_BAD_VALUE;
144952a38012Sejakowatz 	if (io_count == NULL)
145052a38012Sejakowatz 		return B_BAD_VALUE;
145152a38012Sejakowatz 	if (*io_count <= 0)
145252a38012Sejakowatz 		return B_BAD_VALUE;
145352a38012Sejakowatz 
145452a38012Sejakowatz 	xfer_server_get_dormant_nodes msg;
145552a38012Sejakowatz 	port_id port;
145652a38012Sejakowatz 	status_t rv;
145752a38012Sejakowatz 
145852a38012Sejakowatz 	port = find_port("media_server port");
145952a38012Sejakowatz 	if (port <= B_OK)
146052a38012Sejakowatz 		return B_ERROR;
146152a38012Sejakowatz 
146252a38012Sejakowatz 	msg.maxcount = *io_count;
146352a38012Sejakowatz 	msg.has_input = (bool) has_input;
146452a38012Sejakowatz 	if (has_input)
146552a38012Sejakowatz 		msg.inputformat = *has_input; // XXX we should not make a flat copy of media_format
146652a38012Sejakowatz 	msg.has_output = (bool) has_output;
146752a38012Sejakowatz 	if (has_output)
146852a38012Sejakowatz 		msg.outputformat = *has_output;; // XXX we should not make a flat copy of media_format
146952a38012Sejakowatz 	msg.has_name = (bool) name;
147052a38012Sejakowatz 	if (name) {
14719e9417d2Sbeveloper 		int len = strlen(name);
14729e9417d2Sbeveloper 		len = min_c(len, (int)sizeof(msg.name) - 1);
147352a38012Sejakowatz 		memcpy(msg.name, name, len);
147452a38012Sejakowatz 		msg.name[len] = 0;
147552a38012Sejakowatz 	}
147652a38012Sejakowatz 	msg.require_kinds = require_kinds;
147752a38012Sejakowatz 	msg.deny_kinds = deny_kinds;
147852a38012Sejakowatz 	msg.reply_port = _PortPool->GetPort();
147952a38012Sejakowatz 
148052a38012Sejakowatz 	rv = write_port(port, SERVER_GET_DORMANT_NODES, &msg, sizeof(msg));
148152a38012Sejakowatz 	if (rv != B_OK) {
148252a38012Sejakowatz 		_PortPool->PutPort(msg.reply_port);
148352a38012Sejakowatz 		return rv;
148452a38012Sejakowatz 	}
148552a38012Sejakowatz 
148652a38012Sejakowatz 	xfer_server_get_dormant_nodes_reply reply;
148752a38012Sejakowatz 	int32 code;
148852a38012Sejakowatz 
148952a38012Sejakowatz 	rv = read_port(msg.reply_port, &code, &reply, sizeof(reply));
149052a38012Sejakowatz 	if (rv < B_OK) {
149152a38012Sejakowatz 		_PortPool->PutPort(msg.reply_port);
149252a38012Sejakowatz 		return rv;
149352a38012Sejakowatz 	}
149452a38012Sejakowatz 
149552a38012Sejakowatz 	*io_count = reply.count;
149652a38012Sejakowatz 
149752a38012Sejakowatz 	if (*io_count > 0) {
149852a38012Sejakowatz 		rv = read_port(msg.reply_port, &code, out_info, *io_count * sizeof(dormant_node_info));
149952a38012Sejakowatz 		if (rv < B_OK)
150052a38012Sejakowatz 			reply.result = rv;
150152a38012Sejakowatz 	}
150252a38012Sejakowatz 	_PortPool->PutPort(msg.reply_port);
150352a38012Sejakowatz 
150452a38012Sejakowatz 	return reply.result;
150552a38012Sejakowatz }
150652a38012Sejakowatz 
150752a38012Sejakowatz 
150852a38012Sejakowatz status_t
150952a38012Sejakowatz BMediaRoster::InstantiateDormantNode(const dormant_node_info & in_info,
151052a38012Sejakowatz 									 media_node * out_node,
151152a38012Sejakowatz 									 uint32 flags /* currently B_FLAVOR_IS_GLOBAL or B_FLAVOR_IS_LOCAL */ )
151252a38012Sejakowatz {
151352a38012Sejakowatz 	CALLED();
151452a38012Sejakowatz 	if ((flags & (B_FLAVOR_IS_GLOBAL | B_FLAVOR_IS_LOCAL)) == 0) {
151552a38012Sejakowatz 		printf("Error: BMediaRoster::InstantiateDormantNode called without flags\n");
151652a38012Sejakowatz 		return B_BAD_VALUE;
151752a38012Sejakowatz 	}
151852a38012Sejakowatz 	if (out_node == 0)
151952a38012Sejakowatz 		return B_BAD_VALUE;
152052a38012Sejakowatz 
152152a38012Sejakowatz 	// XXX we should not trust the values passed in by the user,
152252a38012Sejakowatz 	// XXX and ask the server to determine where to insta
152352a38012Sejakowatz 
1524e0207628Sbeveloper 
1525e0207628Sbeveloper // XXX SOMETHING IS VERY WRONG HERE
1526e0207628Sbeveloper //	if ((in_info.flavor_flags & B_FLAVOR_IS_GLOBAL) == 0 && (flags & B_FLAVOR_IS_LOCAL)) {
1527e0207628Sbeveloper 	if (flags & B_FLAVOR_IS_LOCAL) {
152852a38012Sejakowatz 		return InstantiateDormantNode(in_info,out_node);
152952a38012Sejakowatz 	}
153052a38012Sejakowatz 
1531e0207628Sbeveloper // XXX SOMETHING IS VERY WRONG HERE
1532e0207628Sbeveloper //	if ((in_info.flavor_flags & B_FLAVOR_IS_GLOBAL) || (flags & B_FLAVOR_IS_GLOBAL)) {
1533e0207628Sbeveloper 	if (flags & B_FLAVOR_IS_GLOBAL) {
153452a38012Sejakowatz 		// forward this request into the media_addon_server,
153552a38012Sejakowatz 		// which in turn will call InstantiateDormantNode()
153652a38012Sejakowatz 		// to create it there localy
15378c6a6096Sbeveloper 		addonserver_instantiate_dormant_node_request request;
15388c6a6096Sbeveloper 		addonserver_instantiate_dormant_node_reply reply;
153952a38012Sejakowatz 		status_t rv;
1540f4925104Sbeveloper 
1541f4925104Sbeveloper 		request.info = in_info;
1542f4925104Sbeveloper 		rv = QueryAddonServer(ADDONSERVER_INSTANTIATE_DORMANT_NODE, &request, sizeof(request), &reply, sizeof(reply));
1543f4925104Sbeveloper 		if (rv == B_OK) {
154452a38012Sejakowatz 			*out_node = reply.node;
1545f4925104Sbeveloper 		}
1546f4925104Sbeveloper 		return rv;
154752a38012Sejakowatz 	}
154852a38012Sejakowatz 
1549e0207628Sbeveloper // XXX SOMETHING IS VERY WRONG HERE
15505edd2016Sbeveloper 	printf("Error: BMediaRoster::InstantiateDormantNode addon_id %d, flavor_id %d, flags %#08lx\n", (int)in_info.addon, (int)in_info.flavor_id, flags);
155152a38012Sejakowatz 
155252a38012Sejakowatz 	return B_ERROR;
155352a38012Sejakowatz }
155452a38012Sejakowatz 
155552a38012Sejakowatz 
155652a38012Sejakowatz status_t
155752a38012Sejakowatz BMediaRoster::InstantiateDormantNode(const dormant_node_info & in_info,
155852a38012Sejakowatz 									 media_node * out_node)
155952a38012Sejakowatz {
156016b7eea4Sbeveloper 	CALLED();
156152a38012Sejakowatz 
156252a38012Sejakowatz 	// to instantiate a dormant node in the current address space, we need to
156352a38012Sejakowatz 	// either load the add-on from file and create a new BMediaAddOn class, or
156452a38012Sejakowatz 	// reuse the cached BMediaAddOn from a previous call
156552a38012Sejakowatz 	// call BMediaAddOn::InstantiateNodeFor()
156652a38012Sejakowatz 	// and cache the BMediaAddOn after that for later reuse.
156752a38012Sejakowatz 	// BeOS R5 does not seem to delete it when the application quits
156852a38012Sejakowatz 	// if B_FLAVOR_IS_GLOBAL, we need to use the BMediaAddOn object that
156952a38012Sejakowatz 	// resides in the media_addon_server
157052a38012Sejakowatz 
157152a38012Sejakowatz 	// RegisterNode() is called automatically for nodes instantiated from add-ons
157252a38012Sejakowatz 
157316b7eea4Sbeveloper 	//XXX TEST!
157416b7eea4Sbeveloper 	BMediaAddOn *addon;
157516b7eea4Sbeveloper 	BMediaNode *node;
157616b7eea4Sbeveloper 	BMessage config;
157716b7eea4Sbeveloper 	status_t out_error;
15788c6a6096Sbeveloper 	status_t rv;
157916b7eea4Sbeveloper 	addon = _DormantNodeManager->GetAddon(in_info.addon);
158016b7eea4Sbeveloper 	if (!addon) {
158116b7eea4Sbeveloper 		printf("BMediaRoster::InstantiateDormantNode: GetAddon failed\n");
158252a38012Sejakowatz 		return B_ERROR;
158352a38012Sejakowatz 	}
15841299bfb2Sbeveloper 	flavor_info temp; // XXX fix this!
15851299bfb2Sbeveloper 	temp.name = "XXX flavor_info name";
15861299bfb2Sbeveloper 	temp.info = "XXX flavor_info info";
158716b7eea4Sbeveloper 	temp.internal_id = in_info.flavor_id;
158816b7eea4Sbeveloper 	node = addon->InstantiateNodeFor(&temp, &config, &out_error);
158916b7eea4Sbeveloper 	if (!node) {
159016b7eea4Sbeveloper 		printf("BMediaRoster::InstantiateDormantNode: InstantiateNodeFor failed\n");
159116b7eea4Sbeveloper 		_DormantNodeManager->PutAddon(in_info.addon);
159216b7eea4Sbeveloper 		return B_ERROR;
159316b7eea4Sbeveloper 	}
15948c6a6096Sbeveloper 	rv = RegisterNode(node);
15958c6a6096Sbeveloper 	if (rv != B_OK) {
15968c6a6096Sbeveloper 		printf("BMediaRoster::InstantiateDormantNode: RegisterNode failed\n");
15978c6a6096Sbeveloper 		delete node;
15988c6a6096Sbeveloper 		_DormantNodeManager->PutAddon(in_info.addon);
15998c6a6096Sbeveloper 		return B_ERROR;
16008c6a6096Sbeveloper 	}
16018c6a6096Sbeveloper 
16028c6a6096Sbeveloper 	// XXX we must remember in_info.addon and call
16038c6a6096Sbeveloper 	// XXX _DormantNodeManager->PutAddon when the
16048c6a6096Sbeveloper 	// XXX node is unregistered
16059e9417d2Sbeveloper 	// should be handled by RegisterNode() and UnegisterNode() now
16068c6a6096Sbeveloper 
160716b7eea4Sbeveloper 	*out_node = node->Node();
160816b7eea4Sbeveloper 	return B_OK;
160916b7eea4Sbeveloper }
161052a38012Sejakowatz 
161152a38012Sejakowatz 
161252a38012Sejakowatz status_t
161352a38012Sejakowatz BMediaRoster::GetDormantNodeFor(const media_node & node,
161452a38012Sejakowatz 								dormant_node_info * out_info)
161552a38012Sejakowatz {
161685dfab2bSbeveloper 	CALLED();
161785dfab2bSbeveloper 	if (out_info == NULL)
161885dfab2bSbeveloper 		return B_BAD_VALUE;
161985dfab2bSbeveloper 	if (node.node <= 0)
162085dfab2bSbeveloper 		return B_MEDIA_BAD_NODE;
162152a38012Sejakowatz 
162285dfab2bSbeveloper 	server_get_dormant_node_for_request request;
162385dfab2bSbeveloper 	server_get_dormant_node_for_reply reply;
162485dfab2bSbeveloper 	status_t rv;
162585dfab2bSbeveloper 
162685dfab2bSbeveloper 	request.node = node;
162785dfab2bSbeveloper 
16281299bfb2Sbeveloper 	rv = QueryServer(SERVER_GET_DORMANT_NODE_FOR, &request, sizeof(request), &reply, sizeof(reply));
162985dfab2bSbeveloper 	if (rv != B_OK)
163085dfab2bSbeveloper 		return rv;
163185dfab2bSbeveloper 
163285dfab2bSbeveloper 	*out_info = reply.node_info;
163385dfab2bSbeveloper 	return B_OK;
163452a38012Sejakowatz }
163552a38012Sejakowatz 
163652a38012Sejakowatz 
163752a38012Sejakowatz status_t
163852a38012Sejakowatz BMediaRoster::GetDormantFlavorInfoFor(const dormant_node_info & in_dormant,
163952a38012Sejakowatz 									  dormant_flavor_info * out_flavor)
164052a38012Sejakowatz {
164152a38012Sejakowatz 	CALLED();
164252a38012Sejakowatz 
164352a38012Sejakowatz 	xfer_server_get_dormant_flavor_info msg;
164452a38012Sejakowatz 	xfer_server_get_dormant_flavor_info_reply *reply;
164552a38012Sejakowatz 	port_id port;
164652a38012Sejakowatz 	status_t rv;
164752a38012Sejakowatz 	int32 code;
164852a38012Sejakowatz 
164952a38012Sejakowatz 	port = find_port("media_server port");
165052a38012Sejakowatz 	if (port <= B_OK)
165152a38012Sejakowatz 		return B_ERROR;
165252a38012Sejakowatz 
165352a38012Sejakowatz 	reply = (xfer_server_get_dormant_flavor_info_reply *) malloc(16000);
165452a38012Sejakowatz 	if (reply == 0)
165552a38012Sejakowatz 		return B_ERROR;
165652a38012Sejakowatz 
165752a38012Sejakowatz 	msg.addon 		= in_dormant.addon;
165852a38012Sejakowatz 	msg.flavor_id 	= in_dormant.flavor_id;
165952a38012Sejakowatz 	msg.reply_port 	= _PortPool->GetPort();
166052a38012Sejakowatz 	rv = write_port(port, SERVER_GET_DORMANT_FLAVOR_INFO, &msg, sizeof(msg));
166152a38012Sejakowatz 	if (rv != B_OK) {
166252a38012Sejakowatz 		free(reply);
166352a38012Sejakowatz 		_PortPool->PutPort(msg.reply_port);
166452a38012Sejakowatz 		return rv;
166552a38012Sejakowatz 	}
166652a38012Sejakowatz 	rv = read_port(msg.reply_port, &code, reply, 16000);
166752a38012Sejakowatz 	_PortPool->PutPort(msg.reply_port);
166852a38012Sejakowatz 
166952a38012Sejakowatz 	if (rv < B_OK) {
167052a38012Sejakowatz 		free(reply);
167152a38012Sejakowatz 		return rv;
167252a38012Sejakowatz 	}
167352a38012Sejakowatz 
167452a38012Sejakowatz 	if (reply->result == B_OK)
167552a38012Sejakowatz 		rv = out_flavor->Unflatten(reply->dfi_type, &reply->dfi, reply->dfi_size);
167652a38012Sejakowatz 	else
167752a38012Sejakowatz 		rv = reply->result;
167852a38012Sejakowatz 
167952a38012Sejakowatz 	free(reply);
168052a38012Sejakowatz 	return rv;
168152a38012Sejakowatz }
168252a38012Sejakowatz 
168352a38012Sejakowatz 
168452a38012Sejakowatz status_t
168552a38012Sejakowatz BMediaRoster::GetLatencyFor(const media_node & producer,
168652a38012Sejakowatz 							bigtime_t * out_latency)
168752a38012Sejakowatz {
168852a38012Sejakowatz 	UNIMPLEMENTED();
168952a38012Sejakowatz 	*out_latency = 0;
169052a38012Sejakowatz 	return B_ERROR;
169152a38012Sejakowatz }
169252a38012Sejakowatz 
169352a38012Sejakowatz 
169452a38012Sejakowatz status_t
169552a38012Sejakowatz BMediaRoster::GetInitialLatencyFor(const media_node & producer,
169652a38012Sejakowatz 								   bigtime_t * out_latency,
169752a38012Sejakowatz 								   uint32 * out_flags)
169852a38012Sejakowatz {
169952a38012Sejakowatz 	UNIMPLEMENTED();
170052a38012Sejakowatz 	*out_latency = 0;
170152a38012Sejakowatz 	*out_flags = 0;
170252a38012Sejakowatz 	return B_ERROR;
170352a38012Sejakowatz }
170452a38012Sejakowatz 
170552a38012Sejakowatz 
170652a38012Sejakowatz status_t
170752a38012Sejakowatz BMediaRoster::GetStartLatencyFor(const media_node & time_source,
170852a38012Sejakowatz 								 bigtime_t * out_latency)
170952a38012Sejakowatz {
171052a38012Sejakowatz 	UNIMPLEMENTED();
171152a38012Sejakowatz 	*out_latency = 0;
171252a38012Sejakowatz 	return B_ERROR;
171352a38012Sejakowatz }
171452a38012Sejakowatz 
171552a38012Sejakowatz 
171652a38012Sejakowatz status_t
171752a38012Sejakowatz BMediaRoster::GetFileFormatsFor(const media_node & file_interface,
171852a38012Sejakowatz 								media_file_format * out_formats,
171952a38012Sejakowatz 								int32 * io_num_infos)
172052a38012Sejakowatz {
172152a38012Sejakowatz 	UNIMPLEMENTED();
172252a38012Sejakowatz 	return B_ERROR;
172352a38012Sejakowatz }
172452a38012Sejakowatz 
172552a38012Sejakowatz 
172652a38012Sejakowatz status_t
172752a38012Sejakowatz BMediaRoster::SetRefFor(const media_node & file_interface,
172852a38012Sejakowatz 						const entry_ref & file,
172952a38012Sejakowatz 						bool create_and_truncate,
173052a38012Sejakowatz 						bigtime_t * out_length)	/* if create is false */
173152a38012Sejakowatz {
173252a38012Sejakowatz 	UNIMPLEMENTED();
173352a38012Sejakowatz 	return B_ERROR;
173452a38012Sejakowatz }
173552a38012Sejakowatz 
173652a38012Sejakowatz 
173752a38012Sejakowatz status_t
173852a38012Sejakowatz BMediaRoster::GetRefFor(const media_node & node,
173952a38012Sejakowatz 						entry_ref * out_file,
174052a38012Sejakowatz 						BMimeType * mime_type)
174152a38012Sejakowatz {
174252a38012Sejakowatz 	UNIMPLEMENTED();
174352a38012Sejakowatz 	return B_ERROR;
174452a38012Sejakowatz }
174552a38012Sejakowatz 
174652a38012Sejakowatz 
174752a38012Sejakowatz status_t
174852a38012Sejakowatz BMediaRoster::SniffRefFor(const media_node & file_interface,
174952a38012Sejakowatz 						  const entry_ref & file,
175052a38012Sejakowatz 						  BMimeType * mime_type,
175152a38012Sejakowatz 						  float * out_capability)
175252a38012Sejakowatz {
175352a38012Sejakowatz 	UNIMPLEMENTED();
175452a38012Sejakowatz 	return B_ERROR;
175552a38012Sejakowatz }
175652a38012Sejakowatz 
175752a38012Sejakowatz 
175852a38012Sejakowatz /* This is the generic "here's a file, now can someone please play it" interface */
175952a38012Sejakowatz status_t
176052a38012Sejakowatz BMediaRoster::SniffRef(const entry_ref & file,
176152a38012Sejakowatz 					   uint64 require_node_kinds,		/* if you need an EntityInterface or BufferConsumer or something */
176252a38012Sejakowatz 					   dormant_node_info * out_node,
176352a38012Sejakowatz 					   BMimeType * mime_type)
176452a38012Sejakowatz {
176552a38012Sejakowatz 	UNIMPLEMENTED();
176652a38012Sejakowatz 	return B_ERROR;
176752a38012Sejakowatz }
176852a38012Sejakowatz 
176952a38012Sejakowatz 
177052a38012Sejakowatz status_t
177152a38012Sejakowatz BMediaRoster::GetDormantNodeForType(const BMimeType & type,
177252a38012Sejakowatz 									uint64 require_node_kinds,
177352a38012Sejakowatz 									dormant_node_info * out_node)
177452a38012Sejakowatz {
177552a38012Sejakowatz 	UNIMPLEMENTED();
177652a38012Sejakowatz 	return B_ERROR;
177752a38012Sejakowatz }
177852a38012Sejakowatz 
177952a38012Sejakowatz 
178052a38012Sejakowatz status_t
178152a38012Sejakowatz BMediaRoster::GetReadFileFormatsFor(const dormant_node_info & in_node,
178252a38012Sejakowatz 									media_file_format * out_read_formats,
178352a38012Sejakowatz 									int32 in_read_count,
178452a38012Sejakowatz 									int32 * out_read_count)
178552a38012Sejakowatz {
178652a38012Sejakowatz 	UNIMPLEMENTED();
178752a38012Sejakowatz 	return B_ERROR;
178852a38012Sejakowatz }
178952a38012Sejakowatz 
179052a38012Sejakowatz 
179152a38012Sejakowatz status_t
179252a38012Sejakowatz BMediaRoster::GetWriteFileFormatsFor(const dormant_node_info & in_node,
179352a38012Sejakowatz 									 media_file_format * out_write_formats,
179452a38012Sejakowatz 									 int32 in_write_count,
179552a38012Sejakowatz 									 int32 * out_write_count)
179652a38012Sejakowatz {
179752a38012Sejakowatz 	UNIMPLEMENTED();
179852a38012Sejakowatz 	return B_ERROR;
179952a38012Sejakowatz }
180052a38012Sejakowatz 
180152a38012Sejakowatz 
180252a38012Sejakowatz status_t
180352a38012Sejakowatz BMediaRoster::GetFormatFor(const media_output & output,
180452a38012Sejakowatz 						   media_format * io_format,
180552a38012Sejakowatz 						   uint32 flags)
180652a38012Sejakowatz {
180752a38012Sejakowatz 	UNIMPLEMENTED();
180852a38012Sejakowatz 	return B_ERROR;
180952a38012Sejakowatz }
181052a38012Sejakowatz 
181152a38012Sejakowatz 
181252a38012Sejakowatz status_t
181352a38012Sejakowatz BMediaRoster::GetFormatFor(const media_input & input,
181452a38012Sejakowatz 						   media_format * io_format,
181552a38012Sejakowatz 						   uint32 flags)
181652a38012Sejakowatz {
181752a38012Sejakowatz 	UNIMPLEMENTED();
181852a38012Sejakowatz 	return B_ERROR;
181952a38012Sejakowatz }
182052a38012Sejakowatz 
182152a38012Sejakowatz 
182252a38012Sejakowatz status_t
182352a38012Sejakowatz BMediaRoster::GetFormatFor(const media_node & node,
182452a38012Sejakowatz 						   media_format * io_format,
182552a38012Sejakowatz 						   float quality)
182652a38012Sejakowatz {
182752a38012Sejakowatz 	UNIMPLEMENTED();
182852a38012Sejakowatz 	return B_ERROR;
182952a38012Sejakowatz }
183052a38012Sejakowatz 
183152a38012Sejakowatz 
183252a38012Sejakowatz ssize_t
183352a38012Sejakowatz BMediaRoster::GetNodeAttributesFor(const media_node & node,
183452a38012Sejakowatz 								   media_node_attribute * outArray,
183552a38012Sejakowatz 								   size_t inMaxCount)
183652a38012Sejakowatz {
183752a38012Sejakowatz 	UNIMPLEMENTED();
183852a38012Sejakowatz 	return B_ERROR;
183952a38012Sejakowatz }
184052a38012Sejakowatz 
184152a38012Sejakowatz 
184252a38012Sejakowatz media_node_id
184352a38012Sejakowatz BMediaRoster::NodeIDFor(port_id source_or_destination_port)
184452a38012Sejakowatz {
18459e9417d2Sbeveloper 	CALLED();
18469e9417d2Sbeveloper 
18479e9417d2Sbeveloper 	server_node_id_for_request request;
18489e9417d2Sbeveloper 	server_node_id_for_reply reply;
18499e9417d2Sbeveloper 	status_t rv;
18509e9417d2Sbeveloper 
18519e9417d2Sbeveloper 	request.port = source_or_destination_port;
18529e9417d2Sbeveloper 
18539e9417d2Sbeveloper 	rv = QueryServer(SERVER_NODE_ID_FOR, &request, sizeof(request), &reply, sizeof(reply));
18549e9417d2Sbeveloper 	if (rv != B_OK) {
18559e9417d2Sbeveloper 		TRACE("BMediaRoster::NodeIDFor: failed (error %#lx)\n", rv);
18569e9417d2Sbeveloper 		return -1;
18579e9417d2Sbeveloper 	}
18589e9417d2Sbeveloper 
18599e9417d2Sbeveloper 	return reply.nodeid;
186052a38012Sejakowatz }
186152a38012Sejakowatz 
186252a38012Sejakowatz 
186352a38012Sejakowatz status_t
186452a38012Sejakowatz BMediaRoster::GetInstancesFor(media_addon_id addon,
186552a38012Sejakowatz 							  int32 flavor,
186652a38012Sejakowatz 							  media_node_id * out_id,
186752a38012Sejakowatz 							  int32 * io_count)
186852a38012Sejakowatz {
186985dfab2bSbeveloper 	CALLED();
187085dfab2bSbeveloper 	if (out_id == NULL || io_count == NULL)
187185dfab2bSbeveloper 		return B_BAD_VALUE;
187285dfab2bSbeveloper 	if (*io_count <= 0)
187385dfab2bSbeveloper 		return B_BAD_VALUE;
187485dfab2bSbeveloper 
187585dfab2bSbeveloper 	server_get_instances_for_request request;
187685dfab2bSbeveloper 	server_get_instances_for_reply reply;
187785dfab2bSbeveloper 	status_t rv;
187885dfab2bSbeveloper 
187985dfab2bSbeveloper 	request.maxcount = *io_count;
188085dfab2bSbeveloper 	request.addon_id = addon;
188185dfab2bSbeveloper 	request.addon_flavor_id = flavor;
188285dfab2bSbeveloper 
188385dfab2bSbeveloper 	rv = QueryServer(SERVER_GET_INSTANCES_FOR, &request, sizeof(request), &reply, sizeof(reply));
188485dfab2bSbeveloper 	if (rv != B_OK) {
188585dfab2bSbeveloper 		TRACE("BMediaRoster::GetLiveNodes failed\n");
188685dfab2bSbeveloper 		return rv;
188752a38012Sejakowatz 	}
188852a38012Sejakowatz 
188985dfab2bSbeveloper 	*io_count = reply.count;
189085dfab2bSbeveloper 	if (reply.count > 0)
189185dfab2bSbeveloper 		memcpy(out_id, reply.node_id, sizeof(media_node_id) * reply.count);
189285dfab2bSbeveloper 
189385dfab2bSbeveloper 	return B_OK;
189485dfab2bSbeveloper }
189552a38012Sejakowatz 
189652a38012Sejakowatz 
189752a38012Sejakowatz status_t
189852a38012Sejakowatz BMediaRoster::SetRealtimeFlags(uint32 in_enabled)
189952a38012Sejakowatz {
190052a38012Sejakowatz 	UNIMPLEMENTED();
190152a38012Sejakowatz 	return B_ERROR;
190252a38012Sejakowatz }
190352a38012Sejakowatz 
190452a38012Sejakowatz 
190552a38012Sejakowatz status_t
190652a38012Sejakowatz BMediaRoster::GetRealtimeFlags(uint32 * out_enabled)
190752a38012Sejakowatz {
190852a38012Sejakowatz 	UNIMPLEMENTED();
190952a38012Sejakowatz 	return B_ERROR;
191052a38012Sejakowatz }
191152a38012Sejakowatz 
191252a38012Sejakowatz 
191352a38012Sejakowatz ssize_t
191452a38012Sejakowatz BMediaRoster::AudioBufferSizeFor(int32 channel_count,
191552a38012Sejakowatz 								 uint32 sample_format,
191652a38012Sejakowatz 								 float frame_rate,
191752a38012Sejakowatz 								 bus_type bus_kind)
191852a38012Sejakowatz {
191952a38012Sejakowatz 	UNIMPLEMENTED();
192052a38012Sejakowatz 	return 4096;
192152a38012Sejakowatz }
192252a38012Sejakowatz 
192352a38012Sejakowatz 
192452a38012Sejakowatz /* Use MediaFlags to inquire about specific features of the Media Kit. */
192552a38012Sejakowatz /* Returns < 0 for "not present", positive size for output data size. */
192652a38012Sejakowatz /* 0 means that the capability is present, but no data about it. */
192752a38012Sejakowatz /* static */ ssize_t
192852a38012Sejakowatz BMediaRoster::MediaFlags(media_flags cap,
192952a38012Sejakowatz 						 void * buf,
193052a38012Sejakowatz 						 size_t maxSize)
193152a38012Sejakowatz {
193252a38012Sejakowatz 	UNIMPLEMENTED();
193352a38012Sejakowatz 	return 0;
193452a38012Sejakowatz }
193552a38012Sejakowatz 
193652a38012Sejakowatz 
193752a38012Sejakowatz 
193852a38012Sejakowatz /* BLooper overrides */
193952a38012Sejakowatz /* virtual */ void
194052a38012Sejakowatz BMediaRoster::MessageReceived(BMessage * message)
194152a38012Sejakowatz {
194252a38012Sejakowatz 	UNIMPLEMENTED();
194352a38012Sejakowatz }
194452a38012Sejakowatz 
194552a38012Sejakowatz /* virtual */ bool
194652a38012Sejakowatz BMediaRoster::QuitRequested()
194752a38012Sejakowatz {
194852a38012Sejakowatz 	UNIMPLEMENTED();
194952a38012Sejakowatz 	return true;
195052a38012Sejakowatz }
195152a38012Sejakowatz 
195252a38012Sejakowatz /* virtual */ BHandler *
195352a38012Sejakowatz BMediaRoster::ResolveSpecifier(BMessage *msg,
195452a38012Sejakowatz 				 int32 index,
195552a38012Sejakowatz 				 BMessage *specifier,
195652a38012Sejakowatz 				 int32 form,
195752a38012Sejakowatz 				 const char *property)
195852a38012Sejakowatz {
195952a38012Sejakowatz 	UNIMPLEMENTED();
196052a38012Sejakowatz 	return 0;
196152a38012Sejakowatz }
196252a38012Sejakowatz 
196352a38012Sejakowatz 
196452a38012Sejakowatz /* virtual */ status_t
196552a38012Sejakowatz BMediaRoster::GetSupportedSuites(BMessage *data)
196652a38012Sejakowatz {
196752a38012Sejakowatz 	UNIMPLEMENTED();
196852a38012Sejakowatz 	return B_ERROR;
196952a38012Sejakowatz }
197052a38012Sejakowatz 
197152a38012Sejakowatz 
197252a38012Sejakowatz BMediaRoster::~BMediaRoster()
197352a38012Sejakowatz {
197452a38012Sejakowatz 	CALLED();
197552a38012Sejakowatz 	BMessage msg(MEDIA_SERVER_UNREGISTER_APP);
197652a38012Sejakowatz 	BMessage reply;
197752a38012Sejakowatz 	msg.AddInt32("team",team);
1978f4925104Sbeveloper 	QueryServer(&msg, &reply);
197952a38012Sejakowatz }
198052a38012Sejakowatz 
198152a38012Sejakowatz 
198252a38012Sejakowatz /*************************************************************
198352a38012Sejakowatz  * private BMediaRoster
198452a38012Sejakowatz  *************************************************************/
198552a38012Sejakowatz 
198652a38012Sejakowatz // deprecated call
198752a38012Sejakowatz status_t
198852a38012Sejakowatz BMediaRoster::SetOutputBuffersFor(const media_source & output,
198952a38012Sejakowatz 								  BBufferGroup * group,
199052a38012Sejakowatz 								  bool will_reclaim )
199152a38012Sejakowatz {
199252a38012Sejakowatz 	UNIMPLEMENTED();
19939e9417d2Sbeveloper 	debugger("BMediaRoster::SetOutputBuffersFor missing\n");
199452a38012Sejakowatz 	return B_ERROR;
199552a38012Sejakowatz }
199652a38012Sejakowatz 
199752a38012Sejakowatz 
199852a38012Sejakowatz /* FBC stuffing (Mmmh, Stuffing!) */
199952a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_0(void *) { return B_ERROR; }
200052a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_1(void *) { return B_ERROR; }
200152a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_2(void *) { return B_ERROR; }
200252a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_3(void *) { return B_ERROR; }
200352a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_4(void *) { return B_ERROR; }
200452a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_5(void *) { return B_ERROR; }
200552a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_6(void *) { return B_ERROR; }
200652a38012Sejakowatz status_t BMediaRoster::_Reserved_MediaRoster_7(void *) { return B_ERROR; }
200752a38012Sejakowatz 
200852a38012Sejakowatz 
200952a38012Sejakowatz BMediaRoster::BMediaRoster() :
201052a38012Sejakowatz 	BLooper("BMediaRoster looper",B_NORMAL_PRIORITY,B_LOOPER_PORT_DEFAULT_CAPACITY)
201152a38012Sejakowatz {
201252a38012Sejakowatz 	CALLED();
201352a38012Sejakowatz 	BMessage msg(MEDIA_SERVER_REGISTER_APP);
201452a38012Sejakowatz 	BMessage reply;
201552a38012Sejakowatz 	msg.AddInt32("team",team);
2016f4925104Sbeveloper 	QueryServer(&msg,&reply);
201752a38012Sejakowatz }
201852a38012Sejakowatz 
201952a38012Sejakowatz /* static */ status_t
202052a38012Sejakowatz BMediaRoster::ParseCommand(BMessage & reply)
202152a38012Sejakowatz {
202252a38012Sejakowatz 	UNIMPLEMENTED();
202352a38012Sejakowatz 	return B_ERROR;
202452a38012Sejakowatz }
202552a38012Sejakowatz 
202652a38012Sejakowatz 
202752a38012Sejakowatz 
202852a38012Sejakowatz status_t
202952a38012Sejakowatz BMediaRoster::GetDefaultInfo(media_node_id for_default,
203052a38012Sejakowatz 							 BMessage & out_config)
203152a38012Sejakowatz {
203252a38012Sejakowatz 	UNIMPLEMENTED();
203352a38012Sejakowatz 	return B_ERROR;
203452a38012Sejakowatz }
203552a38012Sejakowatz 
203652a38012Sejakowatz 
203752a38012Sejakowatz 
203852a38012Sejakowatz status_t
203952a38012Sejakowatz BMediaRoster::SetRunningDefault(media_node_id for_default,
204052a38012Sejakowatz 								const media_node & node)
204152a38012Sejakowatz {
204252a38012Sejakowatz 	UNIMPLEMENTED();
204352a38012Sejakowatz 	return B_ERROR;
204452a38012Sejakowatz }
204552a38012Sejakowatz 
204652a38012Sejakowatz 
204752a38012Sejakowatz /*************************************************************
204852a38012Sejakowatz  * static BMediaRoster variables
204952a38012Sejakowatz  *************************************************************/
205052a38012Sejakowatz 
205152a38012Sejakowatz bool BMediaRoster::_isMediaServer;
205252a38012Sejakowatz port_id BMediaRoster::_mReplyPort;
205352a38012Sejakowatz int32 BMediaRoster::_mReplyPortRes;
205452a38012Sejakowatz int32 BMediaRoster::_mReplyPortUnavailCount;
205552a38012Sejakowatz BMediaRoster * BMediaRoster::_sDefault = NULL;
205652a38012Sejakowatz 
2057