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