1/*
2 * Copyright 2002, Marcus Overhagen. All Rights Reserved.
3 * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef _SERVER_INTERFACE_H_
7#define _SERVER_INTERFACE_H_
8
9
10#include <string.h>
11
12#include <Buffer.h>
13#include <Entry.h>
14#include <MediaAddOn.h>
15#include <MediaDefs.h>
16#include <MediaFormats.h>
17#include <MediaNode.h>
18#include <Messenger.h>
19
20
21// BMessage based server communication
22enum {
23	// BMediaRoster notification service
24	MEDIA_SERVER_REQUEST_NOTIFICATIONS = 1000,
25	MEDIA_SERVER_CANCEL_NOTIFICATIONS,
26	MEDIA_SERVER_SEND_NOTIFICATIONS,
27
28	MEDIA_SERVER_GET_FORMATS,
29	MEDIA_SERVER_MAKE_FORMAT_FOR,
30
31	// add_system_beep_event()
32	MEDIA_SERVER_ADD_SYSTEM_BEEP_EVENT,
33
34	// media add-on server
35	MEDIA_ADD_ON_SERVER_PLAY_MEDIA = '_TRU'
36};
37
38// Raw port based communication
39enum {
40	GENERAL_PURPOSE_WAKEUP = 0,	// when no action but wait termination needed
41
42	ADD_ON_SERVER_RESCAN_ADD_ON_FLAVORS = 0x50,
43	ADD_ON_SERVER_RESCAN_FINISHED_NOTIFY,
44	ADD_ON_SERVER_INSTANTIATE_DORMANT_NODE,
45
46	SERVER_MESSAGE_START = 0x100,
47	SERVER_REGISTER_APP,
48	SERVER_UNREGISTER_APP,
49	SERVER_GET_NODE,
50	SERVER_SET_NODE,
51	SERVER_PUBLISH_INPUTS,
52	SERVER_PUBLISH_OUTPUTS,
53	SERVER_NODE_ID_FOR,
54	SERVER_GET_LIVE_NODE_INFO,
55	SERVER_GET_LIVE_NODES,
56	SERVER_GET_NODE_FOR,
57	SERVER_RELEASE_NODE,
58	SERVER_RELEASE_NODE_ALL,
59	SERVER_REGISTER_NODE,
60	SERVER_UNREGISTER_NODE,
61	SERVER_GET_DORMANT_NODE_FOR,
62	SERVER_GET_INSTANCES_FOR,
63	SERVER_GET_SHARED_BUFFER_AREA,
64	SERVER_REGISTER_BUFFER,
65	SERVER_UNREGISTER_BUFFER,
66	SERVER_RESCAN_DEFAULTS,
67	SERVER_SET_NODE_CREATOR,
68	SERVER_CHANGE_FLAVOR_INSTANCES_COUNT,
69	SERVER_GET_MEDIA_FILE_TYPES,
70	SERVER_GET_MEDIA_FILE_ITEMS,
71	SERVER_GET_REF_FOR,
72	SERVER_SET_REF_FOR,
73	SERVER_INVALIDATE_MEDIA_ITEM,
74	SERVER_REMOVE_MEDIA_ITEM,
75	SERVER_GET_ITEM_AUDIO_GAIN,
76	SERVER_SET_ITEM_AUDIO_GAIN,
77	SERVER_GET_FORMAT_FOR_DESCRIPTION,
78	SERVER_GET_DESCRIPTION_FOR_FORMAT,
79	SERVER_GET_READERS,
80	SERVER_GET_DECODER_FOR_FORMAT,
81	SERVER_GET_WRITER_FOR_FORMAT_FAMILY,
82	SERVER_GET_FILE_FORMAT_FOR_COOKIE,
83	SERVER_GET_CODEC_INFO_FOR_COOKIE,
84	SERVER_GET_ENCODER_FOR_CODEC_INFO,
85	SERVER_REGISTER_ADD_ON,
86	SERVER_UNREGISTER_ADD_ON,
87	SERVER_GET_ADD_ON_REF,
88	SERVER_REGISTER_DORMANT_NODE,
89	SERVER_GET_DORMANT_NODES,
90	SERVER_GET_DORMANT_FLAVOR_INFO,
91	SERVER_MESSAGE_END,
92
93	NODE_MESSAGE_START = 0x200,
94	NODE_START,
95	NODE_STOP,
96	NODE_SEEK,
97	NODE_SET_RUN_MODE,
98	NODE_TIME_WARP,
99	NODE_PREROLL,
100	NODE_SET_TIMESOURCE,
101	NODE_GET_TIMESOURCE,
102	NODE_REQUEST_COMPLETED,
103	NODE_FINAL_RELEASE,
104	NODE_MESSAGE_END,
105
106	CONSUMER_MESSAGE_START = 0x300,
107	CONSUMER_GET_NEXT_INPUT,
108	CONSUMER_DISPOSE_INPUT_COOKIE,
109	CONSUMER_ACCEPT_FORMAT,
110	CONSUMER_CONNECTED,
111	CONSUMER_DISCONNECTED,
112	CONSUMER_BUFFER_RECEIVED,
113	CONSUMER_PRODUCER_DATA_STATUS,
114	CONSUMER_GET_LATENCY_FOR,
115	CONSUMER_FORMAT_CHANGED,
116	CONSUMER_SEEK_TAG_REQUESTED,
117	CONSUMER_MESSAGE_END,
118
119	PRODUCER_MESSAGE_START = 0x400,
120	PRODUCER_GET_NEXT_OUTPUT,
121	PRODUCER_DISPOSE_OUTPUT_COOKIE,
122	PRODUCER_FORMAT_PROPOSAL,
123	PRODUCER_PREPARE_TO_CONNECT,
124	PRODUCER_CONNECT,
125	PRODUCER_DISCONNECT,
126	PRODUCER_LATE_NOTICE_RECEIVED,
127	PRODUCER_LATENCY_CHANGED,
128	PRODUCER_ADDITIONAL_BUFFER_REQUESTED,
129	PRODUCER_VIDEO_CLIPPING_CHANGED,
130	PRODUCER_FORMAT_CHANGE_REQUESTED,
131	PRODUCER_SET_BUFFER_GROUP,
132	PRODUCER_GET_LATENCY,
133	PRODUCER_GET_INITIAL_LATENCY,
134	PRODUCER_FORMAT_SUGGESTION_REQUESTED,
135	PRODUCER_SET_PLAY_RATE,
136	PRODUCER_ENABLE_OUTPUT,
137	PRODUCER_SET_RUN_MODE_DELAY,
138	PRODUCER_MESSAGE_END,
139
140	FILEINTERFACE_MESSAGE_START = 0x500,
141	FILEINTERFACE_SET_REF,
142	FILEINTERFACE_GET_REF,
143	FILEINTERFACE_SNIFF_REF,
144	FILEINTERFACE_MESSAGE_END,
145
146	CONTROLLABLE_MESSAGE_START = 0x600,
147	CONTROLLABLE_GET_PARAMETER_WEB,
148	CONTROLLABLE_GET_PARAMETER_DATA,
149	CONTROLLABLE_SET_PARAMETER_DATA,
150	CONTROLLABLE_START_CONTROL_PANEL,
151	CONTROLLABLE_MESSAGE_END,
152
153	TIMESOURCE_MESSAGE_START = 0x700,
154	TIMESOURCE_OP, // datablock is a struct time_source_op_info
155	TIMESOURCE_ADD_SLAVE_NODE,
156	TIMESOURCE_REMOVE_SLAVE_NODE,
157	TIMESOURCE_GET_START_LATENCY,
158	TIMESOURCE_MESSAGE_END,
159};
160
161
162namespace BPrivate {
163namespace media {
164
165
166struct reply_data;
167struct request_data;
168struct command_data;
169
170
171// The base struct used for all raw requests
172struct request_data {
173	port_id					reply_port;
174
175	request_data();
176	~request_data();
177
178	status_t SendReply(status_t result, reply_data* reply,
179		size_t replySize) const;
180};
181
182// The base struct used for all raw replys
183struct reply_data {
184	status_t				result;
185};
186
187// The base struct used for all raw commands (asynchronous, no answer)
188struct command_data {
189	// yes, it's empty ;)
190
191#if __GNUC__ == 4
192	int32 _padding;
193		// GCC 2 and GCC 4 treat empty structures differently
194#endif
195};
196
197// The base struct used for all requests using an area
198struct area_request_data : request_data {
199	area_id					area;
200};
201
202// The base struct used for all requests requesting an area
203struct request_area_data : request_data {
204	team_id					team;
205};
206
207// The base struct used for all replies using an area
208struct area_reply_data : reply_data {
209	area_id					area;
210	void*					address;
211};
212
213
214/* We can't send an entry_ref through a port to another team,
215 * but we can assign it to an xfer_entry_ref and send this one,
216 * when we receive it we can assign it to a normal entry_ref
217 */
218struct xfer_entry_ref {
219public:
220	xfer_entry_ref()
221	{
222		device = -1;
223		directory = -1;
224		name[0] = 0;
225	}
226
227	operator entry_ref() const
228	{
229		entry_ref ref(device, directory, name);
230		return ref;
231	}
232
233	xfer_entry_ref& operator=(const entry_ref& ref)
234	{
235		device = ref.device;
236		directory = ref.directory;
237		if (ref.name)
238			strcpy(name, ref.name);
239		else
240			name[0] = 0;
241
242		return *this;
243	}
244
245private:
246	dev_t	device;
247	ino_t	directory;
248	char	name[B_FILE_NAME_LENGTH];
249};
250
251
252}	// namespace media
253}	// namespace BPrivate
254
255using namespace BPrivate::media;
256
257// used by SERVER_GET_NODE and SERVER_SET_NODE
258enum node_type {
259	VIDEO_INPUT,
260	AUDIO_INPUT,
261	VIDEO_OUTPUT,
262	AUDIO_MIXER,
263	AUDIO_OUTPUT,
264	AUDIO_OUTPUT_EX,
265	TIME_SOURCE,
266	SYSTEM_TIME_SOURCE
267};
268
269// used by SERVER_PUBLISH_INPUTS and SERVER_PUBLISH_OUTPUTS
270enum {
271	MAX_OUTPUTS = 8,
272	MAX_INPUTS = 8,
273};
274
275// used by SERVER_GET_LIVE_NODES
276enum {
277	MAX_LIVE_INFO = 16,
278};
279
280// used by SERVER_GET_INSTANCES_FOR
281enum {
282	MAX_NODE_ID = 4000,
283};
284
285// used by SERVER_GET_READERS
286enum {
287	MAX_READERS = 40,
288};
289
290
291// #pragma mark - media add-on server commands
292
293
294struct add_on_server_instantiate_dormant_node_request : request_data {
295	media_addon_id			add_on_id;
296	int32					flavor_id;
297	team_id					creator_team;
298};
299
300struct add_on_server_instantiate_dormant_node_reply : reply_data {
301	media_node				node;
302};
303
304struct add_on_server_rescan_flavors_command : command_data {
305	media_addon_id			add_on_id;
306};
307
308struct add_on_server_rescan_finished_notify_command : command_data {
309};
310
311
312// #pragma mark - media server commands
313
314
315struct server_set_node_request : request_data {
316	node_type				type;
317	bool					use_node;
318	media_node				node;
319	bool					use_dni;
320	dormant_node_info		dni;
321	bool					use_input;
322	media_input				input;
323};
324
325struct server_set_node_reply : reply_data {
326};
327
328struct server_get_node_request : request_data {
329	node_type				type;
330	team_id					team;
331};
332
333struct server_get_node_reply : public reply_data {
334	media_node				node;
335
336	// for AUDIO_OUTPUT_EX
337	char					input_name[B_MEDIA_NAME_LENGTH];
338	int32					input_id;
339};
340
341struct server_publish_inputs_request : request_data {
342	media_node				node;
343	int32					count;
344	area_id area;	// if count > MAX_INPUTS, inputs are in the area
345					// area is created in the library, and also deleted
346					// in the library after the reply has been received
347	media_input inputs[MAX_INPUTS];
348};
349
350struct server_publish_inputs_reply : reply_data {
351};
352
353struct server_publish_outputs_request : area_request_data {
354	media_node				node;
355	int32					count;
356		// if count > MAX_OUTPUTS, outputs are in the area
357		// area is created in the library, and also deleted
358		// in the library after the reply has been received
359	media_output outputs[MAX_OUTPUTS];
360};
361
362struct server_publish_outputs_reply : reply_data {
363};
364
365struct server_register_app_request : request_data {
366	team_id					team;
367	BMessenger				messenger;
368};
369
370struct server_register_app_reply : reply_data {
371};
372
373struct server_unregister_app_request : request_data {
374	team_id					team;
375};
376
377struct server_unregister_app_reply : reply_data {
378};
379
380struct server_set_node_creator_request : request_data {
381	media_node_id			node;
382	team_id					creator;
383};
384
385struct server_set_node_creator_reply : reply_data {
386};
387
388struct server_change_flavor_instances_count_request : request_data {
389	media_addon_id			add_on_id;
390	int32					flavor_id;
391	int32					delta; // must be +1 or -1
392	team_id					team;
393};
394
395struct server_change_flavor_instances_count_reply : reply_data {
396};
397
398struct server_register_node_request : request_data {
399	media_addon_id			add_on_id;
400	int32					flavor_id;
401	char					name[B_MEDIA_NAME_LENGTH];
402	uint64					kinds;
403	port_id					port;
404	team_id					team;
405};
406
407struct server_register_node_reply : reply_data {
408	media_node_id			node_id;
409};
410
411struct server_unregister_node_request : request_data {
412	media_node_id			node_id;
413	team_id					team;
414};
415
416struct server_unregister_node_reply : reply_data {
417	media_addon_id			add_on_id;
418	int32					flavor_id;
419};
420
421struct server_get_live_node_info_request : request_data {
422	media_node				node;
423};
424
425struct server_get_live_node_info_reply : reply_data {
426	live_node_info			live_info;
427};
428
429struct server_get_live_nodes_request : request_area_data {
430	int32					max_count;
431	bool					has_input;
432	bool					has_output;
433	bool					has_name;
434	media_format			input_format;
435	media_format			output_format;
436	char					name[B_MEDIA_NAME_LENGTH + 1];
437								// +1 for a trailing "*"
438	uint64					require_kinds;
439};
440
441struct server_get_live_nodes_reply : area_reply_data {
442	int32					count;
443		// if count > MAX_LIVE_INFO, live_node_infos are in the area
444		// area is created in the server, but deleted in the library
445	live_node_info			live_info[MAX_LIVE_INFO];
446};
447
448struct server_node_id_for_request : request_data {
449	port_id					port;
450};
451
452struct server_node_id_for_reply : reply_data {
453	media_node_id			node_id;
454};
455
456struct server_get_node_for_request : request_data {
457	media_node_id			node_id;
458	team_id					team;
459};
460
461struct server_get_node_for_reply : reply_data {
462	media_node				clone;
463};
464
465struct server_release_node_request : request_data {
466	media_node				node;
467	team_id					team;
468};
469
470struct server_release_node_reply : reply_data {
471};
472
473struct server_get_dormant_node_for_request : request_data {
474	media_node				node;
475};
476
477struct server_get_dormant_node_for_reply : reply_data {
478	dormant_node_info		node_info;
479};
480
481struct server_get_instances_for_request : request_data {
482	media_addon_id			add_on_id;
483	int32					flavor_id;
484	int32					max_count;
485};
486
487struct server_get_instances_for_reply : reply_data {
488	int32					count;
489	media_node_id			node_id[MAX_NODE_ID];
490		// no area here, MAX_NODE_ID is really large
491};
492
493struct server_rescan_defaults_command : command_data {
494};
495
496struct server_register_add_on_request : request_data {
497	xfer_entry_ref			ref;
498};
499
500struct server_register_add_on_reply : reply_data {
501	media_addon_id			add_on_id;
502};
503
504struct server_unregister_add_on_command : command_data {
505	media_addon_id			add_on_id;
506};
507
508struct server_get_add_on_ref_request : request_data {
509	media_addon_id			add_on_id;
510};
511
512struct server_get_add_on_ref_reply : reply_data {
513	xfer_entry_ref			ref;
514};
515
516struct server_get_shared_buffer_area_request : request_data {
517};
518
519struct server_get_shared_buffer_area_reply : area_reply_data {
520};
521
522struct server_register_buffer_request : request_data {
523	team_id					team;
524	buffer_clone_info		info;
525		// either info.buffer is != 0, or the area, size, offset is used
526};
527
528struct server_register_buffer_reply : reply_data {
529	buffer_clone_info		info;
530};
531
532struct server_unregister_buffer_command : command_data {
533	team_id					team;
534	media_buffer_id			buffer_id;
535};
536
537struct server_get_media_types_request : request_area_data {
538};
539
540struct server_get_media_types_reply : area_reply_data {
541	int32					count;
542};
543
544struct server_get_media_items_request : request_area_data {
545	char					type[B_MEDIA_NAME_LENGTH];
546};
547
548struct server_get_media_items_reply : area_reply_data {
549	int32					count;
550};
551
552struct server_get_ref_for_request : request_data {
553	char					type[B_MEDIA_NAME_LENGTH];
554	char					item[B_MEDIA_NAME_LENGTH];
555};
556
557struct server_get_ref_for_reply : reply_data {
558	xfer_entry_ref			ref;
559};
560
561struct server_set_ref_for_request : request_data {
562	char					type[B_MEDIA_NAME_LENGTH];
563	char					item[B_MEDIA_NAME_LENGTH];
564	xfer_entry_ref			ref;
565};
566
567struct server_set_ref_for_reply : reply_data {
568};
569
570struct server_invalidate_item_request : request_data {
571	char					type[B_MEDIA_NAME_LENGTH];
572	char					item[B_MEDIA_NAME_LENGTH];
573};
574
575struct server_invalidate_item_reply : reply_data {
576};
577
578struct server_remove_media_item_request : request_data {
579	char					type[B_MEDIA_NAME_LENGTH];
580	char					item[B_MEDIA_NAME_LENGTH];
581};
582
583struct server_remove_media_item_reply : reply_data {
584};
585
586struct server_get_item_audio_gain_request : request_data {
587	char					type[B_MEDIA_NAME_LENGTH];
588	char					item[B_MEDIA_NAME_LENGTH];
589};
590
591struct server_get_item_audio_gain_reply : reply_data {
592	float					gain;
593};
594
595struct server_set_item_audio_gain_request : request_data {
596	char					type[B_MEDIA_NAME_LENGTH];
597	char					item[B_MEDIA_NAME_LENGTH];
598	float					gain;
599};
600
601struct server_set_item_audio_gain_reply : reply_data {
602};
603
604struct server_get_decoder_for_format_request : request_data {
605	media_format			format;
606};
607
608struct server_get_decoder_for_format_reply : reply_data {
609	xfer_entry_ref			ref;
610		// a ref to the decoder
611};
612
613struct server_get_encoder_for_codec_info_request : request_data {
614	int32					id;
615};
616
617struct server_get_encoder_for_codec_info_reply : reply_data {
618	xfer_entry_ref			ref;
619		// a ref to the encoder
620};
621
622struct server_get_readers_request : request_data {
623};
624
625struct server_get_readers_reply : reply_data {
626	xfer_entry_ref			ref[MAX_READERS];
627		// a list of refs to the reader
628	int32					count;
629};
630
631struct server_get_writer_request : request_data {
632	uint32					internal_id;
633};
634
635struct server_get_writer_reply : reply_data {
636	xfer_entry_ref			ref;
637		// a ref to the writer
638};
639
640struct server_get_file_format_request : request_data {
641	int32					cookie;
642};
643
644struct server_get_file_format_reply : reply_data {
645	media_file_format		file_format;
646		// the file format matching the cookie
647};
648
649struct server_get_codec_info_request : request_data {
650	int32					cookie;
651};
652
653struct server_get_codec_info_reply : reply_data {
654	media_codec_info		codec_info;
655	media_format_family		format_family;
656	media_format			input_format;
657	media_format			output_format;
658		// the codec info matching the cookie
659};
660
661struct server_get_dormant_flavor_info_request : request_data {
662	media_addon_id	add_on_id;
663	int32			flavor_id;
664};
665
666struct server_get_dormant_flavor_info_reply : reply_data {
667	type_code		type; // the flatten type_code
668	size_t 			flattened_size;
669	char 			flattened_data[1];
670		// a flattened dormant_flavor_info, flattened_size large
671};
672
673struct server_get_dormant_nodes_request : request_data {
674	int32			max_count;
675	bool			has_input;
676	media_format	input_format;
677	bool			has_output;
678	media_format	output_format;
679	bool			has_name;
680	char			name[B_MEDIA_NAME_LENGTH + 1]; // 1 for a trailing "*"
681	uint64			require_kinds;
682	uint64			deny_kinds;
683};
684
685struct server_get_dormant_nodes_reply : reply_data {
686	int32			count;
687		// if count > 0, a second reply containing count dormant_node_infos
688		// is send
689};
690
691struct server_register_dormant_node_command : command_data {
692	media_addon_id	purge_id;
693		// if > 0, server must first remove all dormant_flavor_infos
694		// belonging to that id
695	type_code		type; // the flatten type_code
696	size_t 			flattened_size;
697	char 			flattened_data[1];
698		// a flattened dormant_flavor_info, flattened_size large
699};
700
701
702// #pragma mark - buffer producer commands
703
704
705struct producer_format_proposal_request : public request_data {
706	media_source			output;
707	media_format			format;
708};
709
710struct producer_format_proposal_reply : reply_data {
711	media_format			format;
712};
713
714struct producer_prepare_to_connect_request : request_data {
715	media_source			source;
716	media_destination		destination;
717	media_format			format;
718	char					name[B_MEDIA_NAME_LENGTH];
719};
720
721struct producer_prepare_to_connect_reply : reply_data {
722	media_format			format;
723	media_source			out_source;
724	char					name[B_MEDIA_NAME_LENGTH];
725};
726
727struct producer_connect_request : request_data {
728	status_t				error;
729	media_source			source;
730	media_destination		destination;
731	media_format			format;
732	char					name[B_MEDIA_NAME_LENGTH];
733};
734
735struct producer_connect_reply : reply_data {
736	char					name[B_MEDIA_NAME_LENGTH];
737};
738
739struct producer_disconnect_request : request_data {
740	media_source			source;
741	media_destination		destination;
742};
743
744struct producer_disconnect_reply : reply_data {
745};
746
747struct producer_format_suggestion_requested_request : request_data {
748	media_type				type;
749	int32					quality;
750};
751
752struct producer_format_suggestion_requested_reply : reply_data {
753	media_format			format;
754};
755
756struct producer_set_play_rate_request : request_data {
757	int32					numer;
758	int32					denom;
759};
760
761struct producer_set_play_rate_reply : reply_data {
762};
763
764struct producer_get_initial_latency_request : request_data {
765};
766
767struct producer_get_initial_latency_reply : reply_data {
768	bigtime_t				initial_latency;
769	uint32					flags;
770};
771
772struct producer_get_latency_request : request_data {
773};
774
775struct producer_get_latency_reply : reply_data {
776	bigtime_t				latency;
777};
778
779struct producer_set_buffer_group_command : command_data {
780	media_source			source;
781	media_destination		destination;
782	void*					user_data;
783	int32					change_tag;
784	int32					buffer_count;
785	media_buffer_id			buffers[1];
786};
787
788struct producer_format_change_requested_command : command_data {
789	media_source			source;
790	media_destination		destination;
791	media_format			format;
792	void*					user_data;
793	int32					change_tag;
794};
795
796struct producer_video_clipping_changed_command : command_data {
797	media_source			source;
798	media_destination		destination;
799	media_video_display_info display;
800	void*					user_data;
801	int32					change_tag;
802	int32					short_count;
803	int16					shorts[1];
804};
805
806struct producer_additional_buffer_requested_command : command_data {
807	media_source			source;
808	media_buffer_id			prev_buffer;
809	bigtime_t				prev_time;
810	bool					has_seek_tag;
811	media_seek_tag			prev_tag;
812};
813
814struct producer_latency_changed_command : command_data {
815	media_source			source;
816	media_destination		destination;
817	bigtime_t				latency;
818	uint32					flags;
819};
820
821struct producer_enable_output_command : command_data {
822	media_source			source;
823	media_destination		destination;
824	bool					enabled;
825	void*					user_data;
826	int32					change_tag;
827};
828
829struct producer_late_notice_received_command : command_data {
830	media_source			source;
831	bigtime_t				how_much;
832	bigtime_t				performance_time;
833};
834
835struct producer_set_run_mode_delay_command : command_data {
836	BMediaNode::run_mode	mode;
837	bigtime_t				delay;
838};
839
840struct producer_get_next_output_request : request_data {
841	int32					cookie;
842};
843
844struct producer_get_next_output_reply : reply_data
845{
846	int32					cookie;
847	media_output			output;
848};
849
850struct producer_dispose_output_cookie_request : request_data
851{
852	int32					cookie;
853};
854
855struct producer_dispose_output_cookie_reply : reply_data {
856};
857
858
859// #pragma mark - buffer consumer commands
860
861
862struct consumer_accept_format_request : request_data {
863	media_destination		dest;
864	media_format			format;
865};
866
867struct consumer_accept_format_reply : reply_data {
868	media_format			format;
869};
870
871struct consumer_connected_request : request_data {
872	media_input				input;
873};
874
875struct consumer_connected_reply : reply_data {
876	media_input				input;
877};
878
879struct consumer_get_next_input_request : request_data {
880	int32					cookie;
881};
882
883struct consumer_get_next_input_reply : reply_data {
884	int32					cookie;
885	media_input				input;
886};
887
888struct consumer_dispose_input_cookie_request : request_data {
889	int32					cookie;
890};
891
892struct consumer_dispose_input_cookie_reply : reply_data {
893};
894
895struct consumer_disconnected_request : request_data {
896	media_source			source;
897	media_destination		destination;
898};
899
900struct consumer_disconnected_reply : reply_data {
901};
902
903struct consumer_buffer_received_command : command_data {
904	media_buffer_id			buffer;
905	media_header			header;
906};
907
908struct consumer_producer_data_status_command : command_data {
909	media_destination		for_whom;
910	int32					status;
911	bigtime_t				at_performance_time;
912};
913
914struct consumer_get_latency_for_request : request_data {
915	media_destination		for_whom;
916};
917
918struct consumer_get_latency_for_reply : reply_data {
919	bigtime_t				latency;
920	media_node_id			timesource;
921};
922
923struct consumer_format_changed_request : request_data {
924	media_source			producer;
925	media_destination		consumer;
926	int32					change_tag;
927	media_format			format;
928};
929
930struct consumer_format_changed_reply : reply_data {
931};
932
933struct consumer_seek_tag_requested_request : request_data {
934	media_destination		destination;
935	bigtime_t				target_time;
936	uint32					flags;
937};
938
939struct consumer_seek_tag_requested_reply : reply_data {
940	media_seek_tag			seek_tag;
941	bigtime_t				tagged_time;
942	uint32					flags;
943};
944
945
946// #pragma mark - node commands
947
948
949struct node_request_completed_command : command_data {
950	media_request_info		info;
951};
952
953struct node_start_command : command_data {
954	bigtime_t				performance_time;
955};
956
957struct node_stop_command : command_data {
958	bigtime_t				performance_time;
959	bool					immediate;
960};
961
962struct node_seek_command : command_data {
963	bigtime_t				media_time;
964	bigtime_t				performance_time;
965};
966
967struct node_set_run_mode_command : command_data {
968	BMediaNode::run_mode	mode;
969};
970
971struct node_time_warp_command : command_data {
972	bigtime_t				at_real_time;
973	bigtime_t				to_performance_time;
974};
975
976struct node_set_timesource_command : command_data {
977	media_node_id			timesource_id;
978};
979
980struct node_get_timesource_request : request_data {
981};
982
983struct node_get_timesource_reply : reply_data {
984	media_node_id			timesource_id;
985};
986
987struct node_final_release_command : command_data {
988};
989
990
991// #pragma mark - time source commands
992
993
994struct timesource_add_slave_node_command : command_data {
995	media_node				node;
996};
997
998struct timesource_remove_slave_node_command : command_data {
999	media_node				node;
1000};
1001
1002struct timesource_get_start_latency_request : request_data {
1003};
1004
1005struct timesource_get_start_latency_reply : reply_data {
1006	bigtime_t				start_latency;
1007};
1008
1009
1010// #pragma mark - file interface commands
1011
1012
1013struct fileinterface_set_ref_request : request_data {
1014	dev_t					device;
1015	ino_t					directory;
1016	char					name[B_FILE_NAME_LENGTH];
1017	bigtime_t				duration;
1018	bool					create;
1019};
1020
1021struct fileinterface_set_ref_reply : reply_data {
1022	bigtime_t				duration;
1023};
1024
1025struct fileinterface_get_ref_request : request_data {
1026};
1027
1028struct fileinterface_get_ref_reply : reply_data {
1029	dev_t					device;
1030	ino_t					directory;
1031	char					name[B_FILE_NAME_LENGTH];
1032	char					mimetype[B_MIME_TYPE_LENGTH];
1033};
1034
1035struct fileinterface_sniff_ref_request : request_data {
1036	dev_t					device;
1037	ino_t					directory;
1038	char					name[B_FILE_NAME_LENGTH];
1039};
1040
1041struct fileinterface_sniff_ref_reply : reply_data {
1042	char					mimetype[B_MIME_TYPE_LENGTH];
1043	float					capability;
1044};
1045
1046
1047// #pragma mark - controllable commands
1048
1049
1050struct controllable_get_parameter_web_request : area_request_data {
1051	int32					max_size;
1052};
1053
1054struct controllable_get_parameter_web_reply : reply_data {
1055	type_code				code;
1056	int32					size;
1057		// = -1: parameter web data too large,
1058		// = 0: no p.w., > 0: flattened p.w. data
1059};
1060
1061#define MAX_PARAMETER_DATA (B_MEDIA_MESSAGE_SIZE - 100)
1062
1063struct controllable_get_parameter_data_request : area_request_data {
1064	int32					parameter_id;
1065	size_t					request_size;
1066};
1067
1068struct controllable_get_parameter_data_reply : reply_data {
1069	bigtime_t				last_change;
1070	char					raw_data[MAX_PARAMETER_DATA];
1071	size_t					size;
1072};
1073
1074struct controllable_set_parameter_data_request : area_request_data {
1075	int32					parameter_id;
1076	bigtime_t				when;
1077	size_t					size;
1078	char					raw_data[MAX_PARAMETER_DATA];
1079};
1080
1081struct controllable_set_parameter_data_reply : reply_data {
1082};
1083
1084struct controllable_start_control_panel_request : request_data {
1085	media_node				node;
1086};
1087
1088struct controllable_start_control_panel_reply : reply_data {
1089	team_id					team;
1090};
1091
1092
1093#endif	// _SERVER_INTERFACE_H_
1094