1 /*
2  * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
3  * Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
4  *
5  * Version: MPL 1.1
6  *
7  * The contents of this file are subject to the Mozilla Public License Version
8  * 1.1 (the "License"); you may not use this file except in compliance with
9  * the License. You may obtain a copy of the License at
10  * http://www.mozilla.org/MPL/
11  *
12  * Software distributed under the License is distributed on an "AS IS" basis,
13  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14  * for the specific language governing rights and limitations under the
15  * License.
16  *
17  * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
18  *
19  * The Initial Developer of the Original Code is
20  * Anthony Minessale II <anthm@freeswitch.org>
21  * Portions created by the Initial Developer are Copyright (C)
22  * the Initial Developer. All Rights Reserved.
23  *
24  * Contributor(s):
25  *
26  * Anthony Minessale II <anthm@freeswitch.org>
27  * Neal Horman <neal at wanlink dot com>
28  * Bret McDanel <trixter at 0xdecafbad dot com>
29  * Dale Thatcher <freeswitch at dalethatcher dot com>
30  * Chris Danielson <chris at maxpowersoft dot com>
31  * Rupa Schomaker <rupa@rupa.com>
32  * David Weekly <david@weekly.org>
33  * Joao Mesquita <jmesquita@gmail.com>
34  * Raymond Chandler <intralanman@freeswitch.org>
35  * Seven Du <dujinfang@gmail.com>
36  * Emmanuel Schmidbauer <e.schmidbauer@gmail.com>
37  * William King <william.king@quentustech.com>
38  *
39  * mod_conference.c -- Software Conference Bridge
40  *
41  */
42 
43 #ifndef MOD_CONFERENCE_H
44 #define MOD_CONFERENCE_H
45 
46 #include <switch.h>
47 
48 /* DEFINES */
49 
50 #ifdef OPENAL_POSITIONING
51 #define AL_ALEXT_PROTOTYPES
52 #include <AL/al.h>
53 #include <AL/alc.h>
54 #include <AL/alext.h>
55 #endif
56 
57 #define DEFAULT_LAYER_TIMEOUT 10
58 #define DEFAULT_AGC_LEVEL 1100
59 #define CONFERENCE_UUID_VARIABLE "conference_uuid"
60 
61 /* Size to allocate for audio buffers */
62 #define CONF_BUFFER_SIZE 1024 * 128
63 #define CONF_EVENT_MAINT "conference::maintenance"
64 #define CONF_EVENT_CDR "conference::cdr"
65 #define CONF_DEFAULT_LEADIN 20
66 
67 #define CONF_DBLOCK_SIZE CONF_BUFFER_SIZE
68 #define CONF_DBUFFER_SIZE CONF_BUFFER_SIZE
69 #define CONF_DBUFFER_MAX 0
70 #define CONF_CHAT_PROTO "conf"
71 
72 #ifndef MIN
73 #define MIN(a, b) ((a)<(b)?(a):(b))
74 #endif
75 
76 /* the rate at which the infinite impulse response filter on speaker score will decay. */
77 #define SCORE_DECAY 0.8
78 /* the maximum value for the IIR score [keeps loud & longwinded people from getting overweighted] */
79 #define SCORE_MAX_IIR 25000
80 /* the minimum score for which you can be considered to be loud enough to now have the floor */
81 #define SCORE_IIR_SPEAKING_MAX 300
82 /* the threshold below which you cede the floor to someone loud (see above value). */
83 #define SCORE_IIR_SPEAKING_MIN 100
84 /* the FPS of the conference canvas */
85 #define FPS 30
86 /* max supported layers in one mcu */
87 #define MCU_MAX_LAYERS 64
88 
89 /* video layout scale factor */
90 #define VIDEO_LAYOUT_SCALE 360.0f
91 
92 #define CONFERENCE_MUX_DEFAULT_LAYOUT "group:grid"
93 #define CONFERENCE_MUX_DEFAULT_SUPER_LAYOUT "grid"
94 #define CONFERENCE_CANVAS_DEFAULT_WIDTH 1280
95 #define CONFERENCE_CANVAS_DEFAULT_HIGHT 720
96 #define MAX_CANVASES 20
97 #define SUPER_CANVAS_ID MAX_CANVASES
98 #define test_eflag(conference, flag) ((conference)->eflags & flag)
99 
100 #define lock_member(_member) switch_mutex_lock(_member->write_mutex); switch_mutex_lock(_member->read_mutex)
101 #define unlock_member(_member) switch_mutex_unlock(_member->read_mutex); switch_mutex_unlock(_member->write_mutex)
102 
103 //#define lock_member(_member) switch_mutex_lock(_member->write_mutex)
104 //#define unlock_member(_member) switch_mutex_unlock(_member->write_mutex)
105 
106 #define CONFFUNCAPISIZE (sizeof(conference_api_sub_commands)/sizeof(conference_api_sub_commands[0]))
107 
108 #define MAX_MUX_CODECS 50
109 
110 #define ALC_HRTF_SOFT  0x1992
111 
112 #define validate_pin(buf, pin, mpin)									\
113 	pin_valid = (!zstr(pin) && strcmp(buf, pin) == 0);					\
114 	if (!pin_valid && !zstr(mpin) && strcmp(buf, mpin) == 0) {			\
115 		switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Moderator PIN found!\n"); \
116 		pin_valid = 1;													\
117 		mpin_matched = 1;												\
118 	}
119 
120 /* STRUCTS */
121 
122 typedef enum {
123 	CONF_SILENT_REQ = (1 << 0),
124 	CONF_SILENT_DONE = (1 << 1)
125 } conference_app_flag_t;
126 
127 extern char *mod_conference_cf_name;
128 extern char *api_syntax;
129 extern int EC;
130 
131 typedef enum {
132 	FILE_STOP_CURRENT,
133 	FILE_STOP_ALL,
134 	FILE_STOP_ASYNC
135 } file_stop_t;
136 
137 /* Global Values */
138 typedef struct conference_globals_s {
139 	switch_memory_pool_t *conference_pool;
140 	switch_mutex_t *conference_mutex;
141 	switch_hash_t *conference_hash;
142 	switch_mutex_t *id_mutex;
143 	switch_mutex_t *hash_mutex;
144 	switch_mutex_t *setup_mutex;
145 	uint32_t id_pool;
146 	int32_t running;
147 	uint32_t threads;
148 	switch_event_channel_id_t event_channel_id;
149 } conference_globals_t;
150 
151 extern conference_globals_t conference_globals;
152 
153 /* forward declaration for conference_obj and caller_control */
154 struct conference_member;
155 typedef struct conference_member conference_member_t;
156 
157 struct caller_control_actions;
158 
159 typedef struct caller_control_actions {
160 	char *binded_dtmf;
161 	char *data;
162 	char *expanded_data;
163 } caller_control_action_t;
164 
165 typedef struct caller_control_menu_info {
166 	switch_ivr_menu_t *stack;
167 	char *name;
168 } caller_control_menu_info_t;
169 
170 typedef enum {
171 	MFLAG_RUNNING,
172 	MFLAG_CAN_SPEAK,
173 	MFLAG_CAN_HEAR,
174 	MFLAG_KICKED,
175 	MFLAG_ITHREAD,
176 	MFLAG_NOCHANNEL,
177 	MFLAG_INTREE,
178 	MFLAG_NO_MINIMIZE_ENCODING,
179 	MFLAG_FLUSH_BUFFER,
180 	MFLAG_ENDCONF,
181 	MFLAG_HAS_AUDIO,
182 	MFLAG_TALKING,
183 	MFLAG_RESTART,
184 	MFLAG_MINTWO,
185 	MFLAG_MUTE_DETECT,
186 	MFLAG_DIST_DTMF,
187 	MFLAG_MOD,
188 	MFLAG_INDICATE_MUTE,
189 	MFLAG_INDICATE_UNMUTE,
190 	MFLAG_INDICATE_BLIND,
191 	MFLAG_INDICATE_UNBLIND,
192 	MFLAG_NOMOH,
193 	MFLAG_VIDEO_BRIDGE,
194 	MFLAG_INDICATE_MUTE_DETECT,
195 	MFLAG_PAUSE_RECORDING,
196 	MFLAG_ACK_VIDEO,
197 	MFLAG_GHOST,
198 	MFLAG_JOIN_ONLY,
199 	MFLAG_POSITIONAL,
200 	MFLAG_NO_POSITIONAL,
201 	MFLAG_JOIN_VID_FLOOR,
202 	MFLAG_RECEIVING_VIDEO,
203 	MFLAG_CAN_SEE,
204 	MFLAG_CAN_BE_SEEN,
205 	MFLAG_SECOND_SCREEN,
206 	MFLAG_SILENT,
207 	MFLAG_FLIP_VIDEO,
208 	MFLAG_ROTATE_VIDEO,
209 	MFLAG_MIRROR_VIDEO,
210 	MFLAG_INDICATE_DEAF,
211 	MFLAG_INDICATE_UNDEAF,
212 	MFLAG_TALK_DATA_EVENTS,
213 	MFLAG_NO_VIDEO_BLANKS,
214 	MFLAG_VIDEO_JOIN,
215 	MFLAG_DED_VID_LAYER,
216 	MFLAG_HOLD,
217 	///////////////////////////
218 	MFLAG_MAX
219 } member_flag_t;
220 
221 typedef enum {
222 	CFLAG_RUNNING,
223 	CFLAG_DYNAMIC,
224 	CFLAG_ENFORCE_MIN,
225 	CFLAG_DESTRUCT,
226 	CFLAG_LOCKED,
227 	CFLAG_ANSWERED,
228 	CFLAG_BRIDGE_TO,
229 	CFLAG_WAIT_MOD,
230 	CFLAG_VID_FLOOR,
231 	CFLAG_WASTE_FLAG,
232 	CFLAG_OUTCALL,
233 	CFLAG_INHASH,
234 	CFLAG_EXIT_SOUND,
235 	CFLAG_ENTER_SOUND,
236 	CFLAG_USE_ME,
237 	CFLAG_AUDIO_ALWAYS,
238 	CFLAG_ENDCONF_FORCED,
239 	CFLAG_RFC4579,
240 	CFLAG_FLOOR_CHANGE,
241 	CFLAG_VID_FLOOR_LOCK,
242 	CFLAG_JSON_EVENTS,
243 	CFLAG_LIVEARRAY_SYNC,
244 	CFLAG_CONF_RESTART_AUTO_RECORD,
245 	CFLAG_POSITIONAL,
246 	CFLAG_TRANSCODE_VIDEO,
247 	CFLAG_VIDEO_MUXING,
248 	CFLAG_MINIMIZE_VIDEO_ENCODING,
249 	CFLAG_MANAGE_INBOUND_VIDEO_BITRATE,
250 	CFLAG_JSON_STATUS,
251 	CFLAG_VIDEO_BRIDGE_FIRST_TWO,
252 	CFLAG_VIDEO_REQUIRED_FOR_CANVAS,
253 	CFLAG_PERSONAL_CANVAS,
254 	CFLAG_REFRESH_LAYOUT,
255 	CFLAG_VIDEO_MUTE_EXIT_CANVAS,
256 	CFLAG_NO_MOH,
257 	CFLAG_DED_VID_LAYER_AUDIO_FLOOR,
258 	/////////////////////////////////
259 	CFLAG_MAX
260 } conference_flag_t;
261 
262 typedef struct conference_cdr_node_s {
263 	switch_caller_profile_t *cp;
264 	char *record_path;
265 	switch_time_t join_time;
266 	switch_time_t leave_time;
267 	member_flag_t mflags[MFLAG_MAX];
268 	uint32_t id;
269 	conference_member_t *member;
270 	switch_event_t *var_event;
271 	struct conference_cdr_node_s *next;
272 } conference_cdr_node_t;
273 
274 typedef enum {
275 	CDRR_LOCKED = 1,
276 	CDRR_PIN,
277 	CDRR_MAXMEMBERS
278 } cdr_reject_reason_t;
279 
280 typedef struct conference_cdr_reject_s {
281 	switch_caller_profile_t *cp;
282 	switch_time_t reject_time;
283 	cdr_reject_reason_t reason;
284 	struct conference_cdr_reject_s *next;
285 } conference_cdr_reject_t;
286 
287 typedef enum {
288 	CDRE_NONE,
289 	CDRE_AS_CONTENT,
290 	CDRE_AS_FILE
291 } cdr_event_mode_t;
292 
293 
294 struct call_list {
295 	char *string;
296 	int iteration;
297 	struct call_list *next;
298 };
299 typedef struct call_list call_list_t;
300 
301 
302 
303 typedef enum {
304 	RFLAG_CAN_SPEAK = (1 << 0),
305 	RFLAG_CAN_HEAR = (1 << 1),
306 	RFLAG_CAN_SEND_VIDEO = (1 << 2)
307 } relation_flag_t;
308 
309 typedef enum {
310 	NODE_TYPE_FILE,
311 	NODE_TYPE_SPEECH
312 } node_type_t;
313 
314 typedef enum {
315 	NFLAG_NONE = (1 << 0),
316 	NFLAG_PAUSE = (1 << 1)
317 } node_flag_t;
318 
319 typedef enum {
320 	EFLAG_HOLD_MEMBER = (1 << 0),
321 	EFLAG_DEL_MEMBER = (1 << 1),
322 	EFLAG_ENERGY_LEVEL = (1 << 2),
323 	EFLAG_VOLUME_LEVEL = (1 << 3),
324 	EFLAG_GAIN_LEVEL = (1 << 4),
325 	EFLAG_DTMF = (1 << 5),
326 	EFLAG_STOP_TALKING = (1 << 6),
327 	EFLAG_START_TALKING = (1 << 7),
328 	EFLAG_MUTE_MEMBER = (1 << 8),
329 	EFLAG_BLIND_MEMBER = (1 << 9),
330 	EFLAG_DEAF_MEMBER = (1 << 10),
331 	EFLAG_UNUSED1 = (1 << 11),
332 	EFLAG_KICK_MEMBER = (1 << 12),
333 	EFLAG_DTMF_MEMBER = (1 << 13),
334 	EFLAG_ENERGY_LEVEL_MEMBER = (1 << 14),
335 	EFLAG_VOLUME_IN_MEMBER = (1 << 15),
336 	EFLAG_VOLUME_OUT_MEMBER = (1 << 16),
337 	EFLAG_PLAY_FILE = (1 << 17),
338 	EFLAG_PLAY_FILE_MEMBER = (1 << 18),
339 	EFLAG_SPEAK_TEXT = (1 << 19),
340 	EFLAG_SPEAK_TEXT_MEMBER = (1 << 20),
341 	EFLAG_LOCK = (1 << 21),
342 	EFLAG_UNLOCK = (1 << 22),
343 	EFLAG_TRANSFER = (1 << 23),
344 	EFLAG_BGDIAL_RESULT = (1 << 24),
345 	EFLAG_FLOOR_CHANGE = (1 << 25),
346 	EFLAG_MUTE_DETECT = (1 << 26),
347 	EFLAG_RECORD = (1 << 27),
348 	EFLAG_HUP_MEMBER = (1 << 28),
349 	EFLAG_PLAY_FILE_DONE = (1 << 29),
350 	EFLAG_SET_POSITION_MEMBER = (1 << 30)
351 } event_type_t;
352 
353 #ifdef OPENAL_POSITIONING
354 typedef struct al_handle_s {
355 	switch_mutex_t *mutex;
356 	ALCdevice *device;
357 	ALCcontext *context;
358 	ALuint source;
359 	ALuint buffer_in[2];
360 	int setpos;
361 	ALfloat pos_x;
362 	ALfloat pos_y;
363 	ALfloat pos_z;
364 } al_handle_t;
365 
366 void conference_al_close(al_handle_t *al);
367 #else
368 typedef struct al_handle_s {
369 	int unsupported;
370 	switch_mutex_t *mutex;
371 } al_handle_t;
372 #endif
373 struct conference_obj;
374 
375 typedef struct conference_file_node {
376 	switch_file_handle_t fh;
377 	switch_speech_handle_t *sh;
378 	node_flag_t flags;
379 	node_type_t type;
380 	uint8_t done;
381 	uint8_t async;
382 	switch_memory_pool_t *pool;
383 	uint32_t leadin;
384 	struct conference_file_node *next;
385 	char *file;
386 	switch_bool_t mux;
387 	uint32_t member_id;
388 	al_handle_t *al;
389 	int layer_id;
390 	int canvas_id;
391 	struct conference_obj *conference;
392 	char *res_id;
393 	int loops;
394 	int new_fnode;
395 	int layer_lock;
396 	switch_core_video_filter_t filters;
397 } conference_file_node_t;
398 
399 typedef enum {
400 	REC_ACTION_STOP = 1,
401 	REC_ACTION_PAUSE,
402 	REC_ACTION_RESUME
403 } recording_action_type_t;
404 
405 /* conference xml config sections */
406 typedef struct conference_xml_cfg {
407 	switch_xml_t profile;
408 	switch_xml_t controls;
409 } conference_xml_cfg_t;
410 
411 struct vid_helper {
412 	conference_member_t *member_a;
413 	conference_member_t *member_b;
414 	int up;
415 };
416 
417 
418 typedef struct mcu_layer_geometry_s {
419 	int x;
420 	int y;
421 	int scale;
422 	int hscale;
423 	int floor;
424 	int flooronly;
425 	int fileonly;
426 	int overlap;
427 	int zoom;
428 	int border;
429 	char *res_id;
430 	char *role_id;
431 	char *audio_position;
432 } mcu_layer_geometry_t;
433 
434 typedef struct mcu_layer_def_s {
435 	char *name;
436 	mcu_layer_geometry_t layers[MCU_MAX_LAYERS];
437 } mcu_layer_def_t;
438 
439 
440 typedef struct mcu_layer_cam_opts_s {
441 	int manual_pan;
442 	int manual_zoom;
443 	int autozoom;
444 	int autopan;
445 	int zoom_factor;
446 	int snap_factor;
447 	int zoom_move_factor;
448 	int pan_speed;
449 	int pan_accel_speed;
450 	int pan_accel_min;
451 	int zoom_speed;
452 	int zoom_accel_speed;
453 	int zoom_accel_min;
454 } mcu_layer_cam_opts_t;
455 
456 struct mcu_canvas_s;
457 
458 typedef struct mcu_layer_s {
459 	mcu_layer_geometry_t geometry;
460 	int member_id;
461 	int idx;
462 	int tagged;
463 	int bugged;
464 	uint32_t screen_w;
465 	uint32_t screen_h;
466 	int x_pos;
467 	int y_pos;
468 	int banner_patched;
469 	int mute_patched;
470 	int avatar_patched;
471 	int refresh;
472 	int clear;
473 	int is_avatar;
474 	int crop_x;
475 	int crop_y;
476 	int crop_w;
477 	int crop_h;
478 	int last_w;
479 	int last_h;
480 	uint32_t img_count;
481 	switch_image_t *img;
482 	switch_image_t *cur_img;
483 	switch_image_t *overlay_img;
484 	switch_image_t *banner_img;
485 	switch_image_t *logo_img;
486 	switch_image_t *mute_img;
487 	switch_img_txt_handle_t *txthandle;
488 	conference_file_node_t *fnode;
489 	switch_img_position_t logo_pos;
490 	switch_img_fit_t logo_fit;
491 	struct mcu_canvas_s *canvas;
492 	int need_patch;
493 	conference_member_t *member;
494 	switch_frame_t bug_frame;
495 	switch_frame_geometry_t last_geometry;
496 	switch_frame_geometry_t auto_geometry;
497 	switch_frame_geometry_t zoom_geometry;
498 	switch_frame_geometry_t pan_geometry;
499 	switch_frame_geometry_t manual_geometry;
500 	mcu_layer_cam_opts_t cam_opts;
501 	switch_mutex_t *overlay_mutex;
502 	switch_core_video_filter_t overlay_filters;
503 	int manual_border;
504 } mcu_layer_t;
505 
506 typedef struct video_layout_s {
507 	char *name;
508 	char *audio_position;
509 	char *bgimg;
510 	char *fgimg;
511 	char *transition_in;
512 	char *transition_out;
513 	mcu_layer_geometry_t images[MCU_MAX_LAYERS];
514 	int layers;
515 } video_layout_t;
516 
517 typedef struct video_layout_node_s {
518 	video_layout_t *vlayout;
519 	struct video_layout_node_s *next;
520 } video_layout_node_t;
521 
522 typedef struct layout_group_s {
523 	video_layout_node_t *layouts;
524 } layout_group_t;
525 
526 typedef struct codec_set_s {
527 	switch_codec_t codec;
528 	switch_frame_t frame;
529 	uint8_t *packet;
530 	switch_image_t *scaled_img;
531 	uint8_t fps_divisor;
532 	uint32_t frame_count;
533 	char *video_codec_group;
534 } codec_set_t;
535 
536 
537 typedef struct mcu_canvas_s {
538 	int width;
539 	int height;
540 	switch_image_t *img;
541 	mcu_layer_t layers[MCU_MAX_LAYERS];
542 	int res_count;
543 	int role_count;
544 	int total_layers;
545 	int layers_used;
546 	int layout_floor_id;
547 	int refresh;
548 	int send_keyframe;
549 	int play_file;
550 	int video_count;
551 	char *video_layout_group;
552 	switch_rgb_color_t bgcolor;
553 	switch_rgb_color_t border_color;
554 	switch_rgb_color_t letterbox_bgcolor;
555 	switch_mutex_t *mutex;
556 	switch_mutex_t *write_mutex;
557 	switch_timer_t timer;
558 	switch_memory_pool_t *pool;
559 	video_layout_t *vlayout;
560 	video_layout_t *new_vlayout;
561 	int canvas_id;
562 	struct conference_obj *conference;
563 	switch_thread_t *video_muxing_thread;
564 	int video_timer_reset;
565 	switch_queue_t *video_queue;
566 	int recording;
567 	switch_image_t *bgimg;
568 	switch_image_t *fgimg;
569 	int playing_video_file;
570 	int overlay_video_file;
571 	codec_set_t *write_codecs[MAX_MUX_CODECS];
572 	int write_codecs_count;
573 	switch_bool_t disable_auto_clear;
574 } mcu_canvas_t;
575 
576 /* Record Node */
577 typedef struct conference_record {
578 	struct conference_obj *conference;
579 	char *path;
580 	switch_memory_pool_t *pool;
581 	switch_bool_t autorec;
582 	struct conference_record *next;
583 	switch_file_handle_t fh;
584 	int canvas_id;
585 } conference_record_t;
586 
587 typedef enum {
588 	CONF_VIDEO_MODE_PASSTHROUGH,
589 	CONF_VIDEO_MODE_TRANSCODE,
590 	CONF_VIDEO_MODE_MUX
591 } conference_video_mode_t;
592 
593 /* Conference Object */
594 typedef struct conference_obj {
595 	char *name;
596 	char *la_name;
597 	char *la_event_channel;
598 	char *chat_event_channel;
599 	char *mod_event_channel;
600 	char *info_event_channel;
601 	char *desc;
602 	char *timer_name;
603 	char *tts_engine;
604 	char *tts_voice;
605 	char *member_enter_sound;
606 	char *enter_sound;
607 	char *exit_sound;
608 	char *alone_sound;
609 	char *perpetual_sound;
610 	char *moh_sound;
611 	char *tmp_moh_sound;
612 	char *muted_sound;
613 	char *mute_detect_sound;
614 	char *unmuted_sound;
615 	char *deaf_sound;
616 	char *undeaf_sound;
617 	char *blind_sound;
618 	char *unblind_sound;
619 	char *locked_sound;
620 	char *is_locked_sound;
621 	char *is_unlocked_sound;
622 	char *kicked_sound;
623 	char *join_only_sound;
624 	char *caller_id_name;
625 	char *caller_id_number;
626 	char *sound_prefix;
627 	char *special_announce;
628 	char *auto_record;
629 	int auto_record_canvas;
630 	char *record_filename;
631 	char *outcall_templ;
632 	char *video_layout_conf;
633 	char *video_layout_name;
634 	char *video_layout_group;
635 	char *video_canvas_bgcolor;
636 	char *video_canvas_bgimg;
637 	char *video_border_color;
638 	char *video_super_canvas_bgcolor;
639 	char *video_letterbox_bgcolor;
640 	char *video_mute_banner;
641 	char *no_video_avatar;
642 	switch_event_t *variables;
643 	conference_video_mode_t conference_video_mode;
644 	int video_quality;
645 	int members_with_video;
646 	int members_seeing_video;
647 	int members_with_avatar;
648 	uint32_t auto_kps_debounce;
649 	switch_codec_settings_t video_codec_settings;
650 	uint32_t canvas_width;
651 	uint32_t canvas_height;
652 	uint32_t terminate_on_silence;
653 	uint32_t max_members;
654 	uint32_t doc_version;
655 	uint32_t video_border_size;
656 	char *maxmember_sound;
657 	uint32_t announce_count;
658 	char *pin;
659 	char *mpin;
660 	char *pin_sound;
661 	char *bad_pin_sound;
662 	char *profile_name;
663 	char *domain;
664 	char *chat_id;
665 	char *caller_controls;
666 	char *moderator_controls;
667 	switch_live_array_t *la;
668 	conference_flag_t flags[CFLAG_MAX];
669 	member_flag_t mflags[MFLAG_MAX];
670 	switch_call_cause_t bridge_hangup_cause;
671 	switch_mutex_t *flag_mutex;
672 	switch_mutex_t *file_mutex;
673 	uint32_t rate;
674 	uint32_t interval;
675 	uint32_t channels;
676 	switch_mutex_t *mutex;
677 	conference_member_t *members;
678 	uint32_t floor_holder;
679 	uint32_t video_floor_holder;
680 	uint32_t last_video_floor_holder;
681 	switch_mutex_t *member_mutex;
682 	conference_file_node_t *fnode;
683 	conference_file_node_t *async_fnode;
684 	switch_memory_pool_t *pool;
685 	switch_thread_rwlock_t *rwlock;
686 	uint32_t count;
687 	int32_t energy_level;
688 	int32_t auto_energy_level;
689 	int32_t max_energy_level;
690 	uint32_t agc_level;
691 	uint32_t agc_low_energy_level;
692 	uint32_t agc_margin;
693 	uint32_t agc_change_factor;
694 	uint32_t agc_period_len;
695 	int32_t max_energy_hit_trigger;
696 	int32_t auto_energy_sec;
697 	uint32_t burst_mute_count;
698 	uint8_t min;
699 	switch_speech_handle_t lsh;
700 	switch_speech_handle_t *sh;
701 	switch_byte_t *not_talking_buf;
702 	uint32_t not_talking_buf_len;
703 	int pin_retries;
704 	int broadcast_chat_messages;
705 	int comfort_noise_level;
706 	int auto_recording;
707 	char *recording_metadata;
708 	int record_count;
709 	uint32_t min_recording_participants;
710 	int ivr_dtmf_timeout;
711 	int ivr_input_timeout;
712 	uint32_t eflags;
713 	uint32_t verbose_events;
714 	int end_count;
715 	uint32_t count_ghosts;
716 	/* allow extra time after 'endconf' member leaves */
717 	switch_time_t endconference_time;
718 	int endconference_grace_time;
719 
720 	uint32_t relationship_total;
721 	uint32_t score;
722 	int mux_loop_count;
723 	int member_loop_count;
724 	switch_time_t run_time;
725 	char *uuid_str;
726 	uint32_t originating;
727 	switch_call_cause_t cancel_cause;
728 	conference_cdr_node_t *cdr_nodes;
729 	conference_cdr_reject_t *cdr_rejected;
730 	switch_time_t start_time;
731 	switch_time_t end_time;
732 	char *log_dir;
733 	cdr_event_mode_t cdr_event_mode;
734 	struct vid_helper vh[2];
735 	struct vid_helper mh;
736 	conference_record_t *rec_node_head;
737 	int last_speech_channels;
738 	mcu_canvas_t *canvases[MAX_CANVASES+1];
739 	uint32_t canvas_count;
740 	int super_canvas_label_layers;
741 	int super_canvas_show_all_layers;
742 	int canvas_running_count;
743 	switch_mutex_t *canvas_mutex;
744 	switch_hash_t *layout_hash;
745 	switch_hash_t *layout_group_hash;
746 	switch_fps_t video_fps;
747 	int recording_members;
748 	uint32_t video_floor_packets;
749 	video_layout_t *new_personal_vlayout;
750 	int max_bw_in;
751 	int force_bw_in;
752 
753 	/* special use case, scalling shared h264 canvas*/
754 	int scale_h264_canvas_width;
755 	int scale_h264_canvas_height;
756 	int scale_h264_canvas_fps_divisor;
757 	char *scale_h264_canvas_bandwidth;
758 	uint32_t moh_wait;
759 	uint32_t floor_holder_score_iir;
760 	char *default_layout_name;
761 	int mux_paused;
762 	char *video_codec_config_profile_name;
763 } conference_obj_t;
764 
765 /* Relationship with another member */
766 typedef struct conference_relationship {
767 	uint32_t id;
768 	uint32_t flags;
769 	struct conference_relationship *next;
770 } conference_relationship_t;
771 
772 /* Conference Member Object */
773 struct conference_member {
774 	uint32_t id;
775 	switch_core_session_t *session;
776 	switch_channel_t *channel;
777 	conference_obj_t *conference;
778 	switch_memory_pool_t *pool;
779 	switch_buffer_t *audio_buffer;
780 	switch_buffer_t *mux_buffer;
781 	switch_buffer_t *resample_buffer;
782 	member_flag_t flags[MFLAG_MAX];
783 	int32_t score;
784 	int32_t last_score;
785 	uint32_t score_iir;
786 	switch_mutex_t *flag_mutex;
787 	switch_mutex_t *write_mutex;
788 	switch_mutex_t *audio_in_mutex;
789 	switch_mutex_t *audio_out_mutex;
790 	switch_mutex_t *read_mutex;
791 	switch_mutex_t *fnode_mutex;
792 	switch_thread_rwlock_t *rwlock;
793 	switch_codec_implementation_t read_impl;
794 	switch_codec_implementation_t orig_read_impl;
795 	switch_codec_t read_codec;
796 	switch_codec_t write_codec;
797 	char *rec_path;
798 	switch_time_t rec_time;
799 	conference_record_t *rec;
800 	uint8_t *frame;
801 	uint8_t *last_frame;
802 	uint32_t frame_size;
803 	uint8_t *mux_frame;
804 	uint32_t read;
805 	uint32_t vol_period;
806 	int32_t energy_level;
807 	int32_t auto_energy_level;
808 	int32_t max_energy_level;
809 	int32_t agc_level;
810 	uint32_t agc_low_energy_level;
811 	uint32_t agc_margin;
812 	uint32_t agc_change_factor;
813 	uint32_t agc_period_len;
814 	switch_agc_t *agc;
815 	uint32_t mute_counter;
816 	uint32_t burst_mute_count;
817 	uint32_t score_avg;
818 	uint32_t max_energy_hits;
819 	uint32_t max_energy_hit_trigger;
820 	int32_t volume_in_level;
821 	int32_t volume_out_level;
822 	switch_time_t join_time;
823 	time_t last_talking;
824 	switch_time_t first_talk_detect;
825 	uint32_t talk_detects;
826 	uint32_t auto_energy_track;
827 	uint32_t talk_track;
828 	uint32_t score_count;
829 	uint32_t score_accum;
830 	uint32_t score_delta_accum;
831 	uint32_t native_rate;
832 	uint32_t gate_open;
833 	uint32_t gate_count;
834 	uint32_t nogate_count;
835 	uint32_t talking_count;
836 	switch_audio_resampler_t *read_resampler;
837 	int16_t *resample_out;
838 	uint32_t resample_out_len;
839 	conference_file_node_t *fnode;
840 	conference_relationship_t *relationships;
841 	switch_speech_handle_t lsh;
842 	switch_speech_handle_t *sh;
843 	uint32_t verbose_events;
844 	struct conference_member *next;
845 	switch_ivr_dmachine_t *dmachine;
846 	conference_cdr_node_t *cdr_node;
847 	char *kicked_sound;
848 	switch_queue_t *dtmf_queue;
849 	switch_queue_t *video_queue;
850 	switch_thread_t *video_muxing_write_thread;
851 	switch_thread_t *video_layer_thread;
852 	int layer_thread_running;
853 	switch_thread_t *input_thread;
854 	switch_thread_cond_t *layer_cond;
855 	switch_mutex_t *layer_cond_mutex;
856 	cJSON *json;
857 	cJSON *status_field;
858 	uint8_t loop_loop;
859 	al_handle_t *al;
860 	int last_speech_channels;
861 	int video_layer_id;
862 	int canvas_id;
863 	int watching_canvas_id;
864 	int layer_timeout;
865 	int video_codec_index;
866 	int video_codec_id;
867 	char *video_banner_text;
868 	switch_image_t *video_logo;
869 	switch_img_position_t logo_pos;
870 	switch_img_fit_t logo_fit;
871 	char *video_mute_png;
872 	char *video_reservation_id;
873 	char *video_role_id;
874 	char *video_codec_group;
875 	switch_vid_params_t vid_params;
876 	uint32_t auto_kps_debounce_ticks;
877 	uint32_t layer_loops;
878 	switch_frame_buffer_t *fb;
879 	switch_image_t *avatar_png_img;
880 	switch_image_t *video_mute_img;
881 	uint32_t floor_packets;
882 	int blanks;
883 	int managed_kps;
884 	int managed_kps_set;
885 	int blackouts;
886 	int good_img;
887 	int auto_avatar;
888 	int avatar_patched;
889 	switch_media_flow_t video_media_flow;
890 	mcu_canvas_t *canvas;
891 	switch_image_t *pcanvas_img;
892 	int max_bw_in;
893 	int force_bw_in;
894 	int max_bw_out;
895 	int reset_media;
896 	int flip;
897 	int flip_count;
898 
899 	switch_mutex_t *text_mutex;
900 	switch_buffer_t *text_buffer;
901 	char *text_framedata;
902 	uint32_t text_framesize;
903 
904 	mcu_layer_cam_opts_t cam_opts;
905 	switch_core_video_filter_t video_filters;
906 	int video_manual_border;
907 };
908 
909 typedef enum {
910 	CONF_API_SUB_ARGS_SPLIT,
911 	CONF_API_SUB_MEMBER_TARGET,
912 	CONF_API_SUB_ARGS_AS_ONE
913 } conference_fntype_t;
914 
915 typedef void (*void_fn_t) (void);
916 
917 /* API command parser */
918 typedef struct api_command {
919 	char *pname;
920 	void_fn_t pfnapicmd;
921 	conference_fntype_t fntype;
922 	char *pcommand;
923 	char *psyntax;
924 } api_command_t;
925 
926 typedef void (*conference_key_callback_t) (conference_member_t *, struct caller_control_actions *);
927 
928 typedef struct {
929 	conference_member_t *member;
930 	caller_control_action_t action;
931 	conference_key_callback_t handler;
932 } key_binding_t;
933 
934 struct _mapping {
935 	const char *name;
936 	conference_key_callback_t handler;
937 };
938 
939 typedef enum {
940 	CONF_API_COMMAND_LIST = 0,
941 	CONF_API_COMMAND_ENERGY,
942 	CONF_API_COMMAND_VOLUME_IN,
943 	CONF_API_COMMAND_VOLUME_OUT,
944 	CONF_API_COMMAND_PLAY,
945 	CONF_API_COMMAND_SAY,
946 	CONF_API_COMMAND_SAYMEMBER,
947 	CONF_API_COMMAND_STOP,
948 	CONF_API_COMMAND_DTMF,
949 	CONF_API_COMMAND_KICK,
950 	CONF_API_COMMAND_MUTE,
951 	CONF_API_COMMAND_UNMUTE,
952 	CONF_API_COMMAND_DEAF,
953 	CONF_API_COMMAND_UNDEAF,
954 	CONF_API_COMMAND_RELATE,
955 	CONF_API_COMMAND_LOCK,
956 	CONF_API_COMMAND_UNLOCK,
957 	CONF_API_COMMAND_DIAL,
958 	CONF_API_COMMAND_BGDIAL,
959 	CONF_API_COMMAND_TRANSFER,
960 	CONF_API_COMMAND_RECORD,
961 	CONF_API_COMMAND_NORECORD,
962 	CONF_API_COMMAND_EXIT_SOUND,
963 	CONF_API_COMMAND_ENTER_SOUND,
964 	CONF_API_COMMAND_PIN,
965 	CONF_API_COMMAND_NOPIN,
966 	CONF_API_COMMAND_GET,
967 	CONF_API_COMMAND_SET,
968 } api_command_type_t;
969 
970 struct bg_call {
971 	conference_obj_t *conference;
972 	switch_core_session_t *session;
973 	char *bridgeto;
974 	uint32_t timeout;
975 	char *flags;
976 	char *cid_name;
977 	char *cid_num;
978 	char *conference_name;
979 	char *uuid;
980 	char *profile;
981 	switch_call_cause_t *cancel_cause;
982 	switch_event_t *var_event;
983 	switch_memory_pool_t *pool;
984 };
985 
986 /* FUNCTION DEFINITIONS */
987 
988 
989 switch_bool_t conference_utils_test_flag(conference_obj_t *conference, conference_flag_t flag);
990 conference_relationship_t *conference_member_get_relationship(conference_member_t *member, conference_member_t *other_member);
991 
992 uint32_t next_member_id(void);
993 void conference_utils_set_cflags(const char *flags, conference_flag_t *f);
994 void conference_utils_set_mflags(const char *flags, member_flag_t *f);
995 void conference_utils_merge_mflags(member_flag_t *a, member_flag_t *b);
996 void conference_utils_clear_eflags(char *events, uint32_t *f);
997 void conference_event_pres_handler(switch_event_t *event);
998 void conference_data_event_handler(switch_event_t *event);
999 void conference_event_call_setup_handler(switch_event_t *event);
1000 void conference_member_add_file_data(conference_member_t *member, int16_t *data, switch_size_t file_data_len);
1001 void conference_send_notify(conference_obj_t *conference, const char *status, const char *call_id, switch_bool_t final);
1002 switch_status_t conference_file_close(conference_obj_t *conference, conference_file_node_t *node);
1003 void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *thread, void *obj);
1004 switch_status_t conference_close_open_files(conference_obj_t *conference);
1005 void conference_al_gen_arc(conference_obj_t *conference, switch_stream_handle_t *stream);
1006 void conference_al_process(al_handle_t *al, void *data, switch_size_t datalen, int rate);
1007 
1008 void conference_utils_member_set_flag_locked(conference_member_t *member, member_flag_t flag);
1009 void conference_utils_member_set_flag(conference_member_t *member, member_flag_t flag);
1010 
1011 void conference_member_update_status_field(conference_member_t *member);
1012 void conference_video_vmute_snap(conference_member_t *member, switch_bool_t clear);
1013 void conference_video_reset_video_bitrate_counters(conference_member_t *member);
1014 void conference_video_clear_layer(mcu_layer_t *layer);
1015 int conference_member_get_canvas_id(conference_member_t *member, const char *val, switch_bool_t watching);
1016 void conference_video_reset_member_codec_index(conference_member_t *member);
1017 void conference_video_detach_video_layer(conference_member_t *member);
1018 void conference_utils_set_flag(conference_obj_t *conference, conference_flag_t flag);
1019 void conference_utils_set_flag_locked(conference_obj_t *conference, conference_flag_t flag);
1020 void conference_utils_clear_flag(conference_obj_t *conference, conference_flag_t flag);
1021 void conference_utils_clear_flag_locked(conference_obj_t *conference, conference_flag_t flag);
1022 switch_status_t conference_loop_dmachine_dispatcher(switch_ivr_dmachine_match_t *match);
1023 
1024 mcu_layer_t *conference_video_get_layer_locked(conference_member_t *member);
1025 void conference_video_release_layer(mcu_layer_t **layer);
1026 mcu_canvas_t *conference_video_get_canvas_locked(conference_member_t *member);
1027 void conference_video_release_canvas(mcu_canvas_t **canvasP);
1028 switch_status_t conference_video_change_res(conference_obj_t *conference, int w, int h, int id);
1029 int conference_member_setup_media(conference_member_t *member, conference_obj_t *conference);
1030 
1031 al_handle_t *conference_al_create(switch_memory_pool_t *pool);
1032 switch_status_t conference_member_parse_position(conference_member_t *member, const char *data);
1033 video_layout_t *conference_video_find_best_layout(conference_obj_t *conference, layout_group_t *lg, uint32_t count, uint32_t file_count);
1034 void conference_list_count_only(conference_obj_t *conference, switch_stream_handle_t *stream);
1035 void conference_member_set_floor_holder(conference_obj_t *conference, conference_member_t *member, uint32_t id);
1036 void conference_utils_member_clear_flag(conference_member_t *member, member_flag_t flag);
1037 void conference_utils_member_clear_flag_locked(conference_member_t *member, member_flag_t flag);
1038 switch_status_t conference_video_attach_video_layer(conference_member_t *member, mcu_canvas_t *canvas, int idx);
1039 int conference_video_set_fps(conference_obj_t *conference, float fps);
1040 void conference_member_set_logo(conference_member_t *member, const char *path);
1041 void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *layer);
1042 void conference_video_layer_set_banner(conference_member_t *member, mcu_layer_t *layer, const char *text);
1043 void conference_fnode_seek(conference_file_node_t *fnode, switch_stream_handle_t *stream, char *arg);
1044 uint32_t conference_member_stop_file(conference_member_t *member, file_stop_t stop);
1045 switch_bool_t conference_utils_member_test_flag(conference_member_t *member, member_flag_t flag);
1046 void conference_list_pretty(conference_obj_t *conference, switch_stream_handle_t *stream);
1047 switch_status_t conference_record_stop(conference_obj_t *conference, switch_stream_handle_t *stream, char *path);
1048 switch_status_t conference_record_action(conference_obj_t *conference, char *path, recording_action_type_t action);
1049 void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, int off);
1050 void conference_jlist(conference_obj_t *conference, cJSON *json_conferences);
1051 void conference_event_send_json(conference_obj_t *conference);
1052 void conference_event_send_rfc(conference_obj_t *conference);
1053 void conference_member_update_status_field(conference_member_t *member);
1054 void conference_event_la_command_handler(switch_live_array_t *la, const char *cmd, const char *sessid, cJSON *jla, void *user_data);
1055 void conference_event_adv_la(conference_obj_t *conference, conference_member_t *member, switch_bool_t join);
1056 void conference_event_adv_layout(conference_obj_t *conference, mcu_canvas_t *canvas, video_layout_t *vlayout);
1057 switch_status_t conference_video_init_canvas(conference_obj_t *conference, video_layout_t *vlayout, mcu_canvas_t **canvasP);
1058 switch_status_t conference_video_attach_canvas(conference_obj_t *conference, mcu_canvas_t *canvas, int super);
1059 void conference_video_init_canvas_layers(conference_obj_t *conference, mcu_canvas_t *canvas, video_layout_t *vlayout, switch_bool_t force);
1060 switch_status_t conference_video_attach_video_layer(conference_member_t *member, mcu_canvas_t *canvas, int idx);
1061 void conference_video_reset_video_bitrate_counters(conference_member_t *member);
1062 void conference_video_layer_set_banner(conference_member_t *member, mcu_layer_t *layer, const char *text);
1063 void conference_video_detach_video_layer(conference_member_t *member);
1064 void conference_video_check_used_layers(mcu_canvas_t *canvas);
1065 void conference_video_check_flush(conference_member_t *member, switch_bool_t force);
1066 void conference_video_set_canvas_letterbox_bgcolor(mcu_canvas_t *canvas, char *color);
1067 void conference_video_set_canvas_bgcolor(mcu_canvas_t *canvas, char *color);
1068 void conference_video_scale_and_patch(mcu_layer_t *layer, switch_image_t *ximg, switch_bool_t freeze);
1069 void conference_video_reset_layer(mcu_layer_t *layer);
1070 void conference_video_reset_layer_cam(mcu_layer_t *layer);
1071 void conference_video_clear_layer(mcu_layer_t *layer);
1072 void conference_video_reset_image(switch_image_t *img, switch_rgb_color_t *color);
1073 void conference_video_parse_layouts(conference_obj_t *conference, int WIDTH, int HEIGHT);
1074 int conference_video_set_fps(conference_obj_t *conference, float fps);
1075 video_layout_t *conference_video_get_layout(conference_obj_t *conference, const char *video_layout_name, const char *video_layout_group);
1076 void conference_video_check_avatar(conference_member_t *member, switch_bool_t force);
1077 void conference_video_find_floor(conference_member_t *member, switch_bool_t entering);
1078 void conference_video_destroy_canvas(mcu_canvas_t **canvasP);
1079 void conference_video_fnode_check(conference_file_node_t *fnode, int canvas_id);
1080 switch_status_t conference_video_set_canvas_bgimg(mcu_canvas_t *canvas, const char *img_path);
1081 switch_status_t conference_video_set_canvas_fgimg(mcu_canvas_t *canvas, const char *img_path);
1082 switch_status_t conference_al_parse_position(al_handle_t *al, const char *data);
1083 switch_status_t conference_video_thread_callback(switch_core_session_t *session, switch_frame_t *frame, void *user_data);
1084 switch_status_t conference_text_thread_callback(switch_core_session_t *session, switch_frame_t *frame, void *user_data);
1085 void *SWITCH_THREAD_FUNC conference_video_muxing_write_thread_run(switch_thread_t *thread, void *obj);
1086 void conference_video_launch_layer_thread(conference_member_t *member);
1087 void conference_video_wake_layer_thread(conference_member_t *member);
1088 
1089 int conference_member_noise_gate_check(conference_member_t *member);
1090 void conference_member_check_channels(switch_frame_t *frame, conference_member_t *member, switch_bool_t in);
1091 
1092 void conference_fnode_toggle_pause(conference_file_node_t *fnode, switch_stream_handle_t *stream);
1093 void conference_fnode_check_status(conference_file_node_t *fnode, switch_stream_handle_t *stream);
1094 void conference_member_set_score_iir(conference_member_t *member, uint32_t score);
1095 // static conference_relationship_t *conference_member_get_relationship(conference_member_t *member, conference_member_t *other_member);
1096 // static void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim);
1097 
1098 conference_relationship_t *conference_member_add_relationship(conference_member_t *member, uint32_t id);
1099 conference_member_t *conference_member_get(conference_obj_t *conference, uint32_t id);
1100 conference_member_t *conference_member_get_by_var(conference_obj_t *conference, const char *var, const char *val);
1101 conference_member_t *conference_member_get_by_role(conference_obj_t *conference, const char *role_id);
1102 switch_status_t conference_member_del_relationship(conference_member_t *member, uint32_t id);
1103 switch_status_t conference_member_add(conference_obj_t *conference, conference_member_t *member);
1104 switch_status_t conference_member_del(conference_obj_t *conference, conference_member_t *member);
1105 void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *obj);
1106 void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thread, void *obj);
1107 void *SWITCH_THREAD_FUNC conference_video_super_muxing_thread_run(switch_thread_t *thread, void *obj);
1108 void conference_loop_output(conference_member_t *member);
1109 uint32_t conference_file_stop(conference_obj_t *conference, file_stop_t stop);
1110 switch_status_t conference_file_play(conference_obj_t *conference, char *file, uint32_t leadin, switch_channel_t *channel, uint8_t async);
1111 void conference_member_send_all_dtmf(conference_member_t *member, conference_obj_t *conference, const char *dtmf);
1112 switch_status_t conference_say(conference_obj_t *conference, const char *text, uint32_t leadin);
1113 conference_obj_t *conference_find(char *name, char *domain);
1114 void conference_member_bind_controls(conference_member_t *member, const char *controls);
1115 void conference_send_presence(conference_obj_t *conference);
1116 void conference_video_set_floor_holder(conference_obj_t *conference, conference_member_t *member, switch_bool_t force);
1117 void conference_video_canvas_del_fnode_layer(conference_obj_t *conference, conference_file_node_t *fnode);
1118 void conference_video_canvas_set_fnode_layer(mcu_canvas_t *canvas, conference_file_node_t *fnode, int idx);
1119 void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim);
1120 const char *conference_utils_combine_flag_var(switch_core_session_t *session, const char *var_name);
1121 int conference_loop_mapping_len();
1122 void conference_api_set_agc(conference_member_t *member, const char *data);
1123 
1124 switch_status_t conference_outcall(conference_obj_t *conference,
1125 								   char *conference_name,
1126 								   switch_core_session_t *session,
1127 								   char *bridgeto, uint32_t timeout,
1128 								   char *flags,
1129 								   char *cid_name,
1130 								   char *cid_num,
1131 								   char *profile,
1132 								   switch_call_cause_t *cause,
1133 								   switch_call_cause_t *cancel_cause,
1134 								   switch_event_t *var_event,
1135 								   char** peer_uuid);
1136 switch_status_t conference_outcall_bg(conference_obj_t *conference,
1137 									  char *conference_name,
1138 									  switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
1139 									  const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause,
1140 									  switch_event_t **var_event);
1141 
1142 void conference_video_launch_muxing_thread(conference_obj_t *conference, mcu_canvas_t *canvas, int super);
1143 void conference_launch_thread(conference_obj_t *conference);
1144 void conference_video_launch_muxing_write_thread(conference_member_t *member);
1145 void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *obj);
1146 switch_status_t conference_file_local_play(conference_obj_t *conference, switch_core_session_t *session, char *path, uint32_t leadin, void *buf,
1147 										   uint32_t buflen);
1148 switch_status_t conference_member_play_file(conference_member_t *member, char *file, uint32_t leadin, switch_bool_t mux);
1149 switch_status_t conference_member_say(conference_member_t *member, char *text, uint32_t leadin);
1150 uint32_t conference_member_stop_file(conference_member_t *member, file_stop_t stop);
1151 conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_core_session_t *session, switch_memory_pool_t *pool);
1152 switch_status_t chat_send(switch_event_t *message_event);
1153 
1154 
1155 void conference_record_launch_thread(conference_obj_t *conference, char *path, int canvas_id, switch_bool_t autorec);
1156 
1157 typedef switch_status_t (*conference_api_args_cmd_t) (conference_obj_t *, switch_stream_handle_t *, int, char **);
1158 typedef switch_status_t (*conference_api_member_cmd_t) (conference_member_t *, switch_stream_handle_t *, void *);
1159 typedef switch_status_t (*conference_api_text_cmd_t) (conference_obj_t *, switch_stream_handle_t *, const char *);
1160 
1161 switch_status_t conference_event_add_data(conference_obj_t *conference, switch_event_t *event);
1162 switch_status_t conference_member_add_event_data(conference_member_t *member, switch_event_t *event);
1163 
1164 cJSON *conference_cdr_json_render(conference_obj_t *conference, cJSON *req);
1165 char *conference_cdr_rfc4579_render(conference_obj_t *conference, switch_event_t *event, switch_event_t *revent);
1166 void conference_cdr_del(conference_member_t *member);
1167 void conference_cdr_add(conference_member_t *member);
1168 void conference_cdr_rejected(conference_obj_t *conference, switch_channel_t *channel, cdr_reject_reason_t reason);
1169 void conference_cdr_render(conference_obj_t *conference);
1170 void conference_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
1171 void conference_event_la_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
1172 void conference_event_mod_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
1173 void conference_event_chat_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
1174 
1175 void conference_member_itterator(conference_obj_t *conference, switch_stream_handle_t *stream, uint8_t non_mod, conference_api_member_cmd_t pfncallback, void *data);
1176 int conference_video_flush_queue(switch_queue_t *q, int min);
1177 
1178 switch_status_t conference_api_sub_canvas_auto_clear(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1179 switch_status_t conference_api_sub_mute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1180 switch_status_t conference_api_sub_tmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1181 switch_status_t conference_api_sub_unmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1182 switch_status_t conference_api_sub_vmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1183 switch_status_t conference_api_sub_tvmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1184 switch_status_t conference_api_sub_unvmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1185 switch_status_t conference_api_sub_vblind(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1186 switch_status_t conference_api_sub_tvblind(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1187 switch_status_t conference_api_sub_unvblind(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1188 switch_status_t conference_api_sub_deaf(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1189 switch_status_t conference_api_sub_undeaf(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1190 switch_status_t conference_api_sub_video_filter(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1191 switch_status_t conference_api_sub_floor(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1192 switch_status_t conference_api_sub_vid_floor(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1193 switch_status_t conference_api_sub_clear_vid_floor(conference_obj_t *conference, switch_stream_handle_t *stream, void *data);
1194 switch_status_t conference_api_sub_position(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1195 switch_status_t conference_api_sub_conference_video_vmute_snap(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1196 switch_status_t conference_api_sub_dtmf(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1197 switch_status_t conference_api_sub_pause_play(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1198 switch_status_t conference_api_sub_play_status(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1199 switch_status_t conference_api_sub_play(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1200 switch_status_t conference_api_sub_moh(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1201 switch_status_t conference_api_sub_say(conference_obj_t *conference, switch_stream_handle_t *stream, const char *text);
1202 switch_status_t conference_api_sub_dial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1203 switch_status_t conference_api_sub_bgdial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1204 switch_status_t conference_api_sub_auto_position(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1205 switch_status_t conference_api_sub_saymember(conference_obj_t *conference, switch_stream_handle_t *stream, const char *text);
1206 switch_status_t conference_api_sub_check_record(conference_obj_t *conference, switch_stream_handle_t *stream, int arc, char **argv);
1207 switch_status_t conference_api_sub_check_record(conference_obj_t *conference, switch_stream_handle_t *stream, int arc, char **argv);
1208 switch_status_t conference_api_sub_volume_in(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1209 switch_status_t conference_api_sub_file_seek(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1210 switch_status_t conference_api_sub_cam(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1211 switch_status_t conference_api_sub_stop(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1212 switch_status_t conference_api_sub_hup(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1213 switch_status_t conference_api_sub_hold(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1214 switch_status_t conference_api_sub_unhold(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1215 switch_status_t conference_api_sub_pauserec(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1216 switch_status_t conference_api_sub_volume_out(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1217 switch_status_t conference_api_sub_lock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1218 switch_status_t conference_api_sub_unlock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1219 switch_status_t conference_api_sub_relate(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1220 switch_status_t conference_api_sub_pin(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1221 switch_status_t conference_api_sub_exit_sound(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1222 switch_status_t conference_api_sub_vid_banner(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1223 switch_status_t conference_api_sub_enter_sound(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1224 switch_status_t conference_api_sub_set(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1225 switch_status_t conference_api_sub_vid_res_id(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1226 switch_status_t conference_api_sub_vid_res_id_member(conference_member_t *member, switch_stream_handle_t *stream, char *res_id, int clear, int force);
1227 switch_status_t conference_api_sub_vid_role_id(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1228 switch_status_t conference_api_sub_get_uuid(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1229 switch_status_t conference_api_sub_get(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1230 switch_status_t conference_api_sub_vid_mute_img(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1231 switch_status_t conference_api_sub_vid_codec_group(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1232 switch_status_t conference_api_sub_vid_logo_img(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1233 switch_status_t conference_api_sub_vid_fps(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1234 switch_status_t conference_api_sub_vid_res(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1235 switch_status_t conference_api_sub_canvas_fgimg(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1236 switch_status_t conference_api_sub_canvas_bgimg(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1237 switch_status_t conference_api_sub_write_png(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1238 switch_status_t conference_api_sub_file_vol(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1239 switch_status_t conference_api_sub_recording(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1240 switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1241 switch_status_t conference_api_sub_count(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1242 switch_status_t conference_api_sub_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1243 switch_status_t conference_api_sub_xml_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1244 switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1245 switch_status_t conference_api_sub_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1246 switch_status_t conference_api_sub_auto_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1247 switch_status_t conference_api_sub_agc(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1248 switch_status_t conference_api_sub_max_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1249 switch_status_t conference_api_sub_watching_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1250 switch_status_t conference_api_sub_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1251 switch_status_t conference_api_sub_layer(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1252 switch_status_t conference_api_sub_kick(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1253 switch_status_t conference_api_sub_vid_flip(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1254 switch_status_t conference_api_sub_vid_border(conference_member_t *member, switch_stream_handle_t *stream, void *data);
1255 switch_status_t conference_api_sub_transfer(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1256 switch_status_t conference_api_sub_record(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1257 switch_status_t conference_api_sub_norecord(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1258 switch_status_t conference_api_sub_vid_bandwidth(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1259 switch_status_t conference_api_sub_vid_personal(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
1260 switch_status_t conference_api_dispatch(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv, const char *cmdline, int argn);
1261 switch_status_t conference_api_sub_syntax(char **syntax);
1262 switch_status_t conference_api_main_real(const char *cmd, switch_core_session_t *session, switch_stream_handle_t *stream);
1263 switch_status_t conference_api_set_moh(conference_obj_t *conference, const char *what);
1264 
1265 void conference_loop_mute_on(conference_member_t *member, caller_control_action_t *action);
1266 void conference_loop_mute_toggle(conference_member_t *member, caller_control_action_t *action);
1267 void conference_loop_energy_dn(conference_member_t *member, caller_control_action_t *action);
1268 void conference_loop_energy_equ_conf(conference_member_t *member, caller_control_action_t *action);
1269 void conference_loop_volume_talk_zero(conference_member_t *member, caller_control_action_t *action);
1270 void conference_loop_volume_talk_up(conference_member_t *member, caller_control_action_t *action);
1271 void conference_loop_volume_listen_dn(conference_member_t *member, caller_control_action_t *action);
1272 void conference_loop_lock_toggle(conference_member_t *member, caller_control_action_t *action);
1273 void conference_loop_volume_listen_up(conference_member_t *member, caller_control_action_t *action);
1274 void conference_loop_volume_listen_zero(conference_member_t *member, caller_control_action_t *action);
1275 void conference_loop_volume_talk_dn(conference_member_t *member, caller_control_action_t *action);
1276 void conference_loop_energy_up(conference_member_t *member, caller_control_action_t *action);
1277 void conference_loop_floor_toggle(conference_member_t *member, caller_control_action_t *action);
1278 void conference_loop_vid_floor_toggle(conference_member_t *member, caller_control_action_t *action);
1279 void conference_loop_energy_up(conference_member_t *member, caller_control_action_t *action);
1280 void conference_loop_floor_toggle(conference_member_t *member, caller_control_action_t *action);
1281 void conference_loop_vid_floor_force(conference_member_t *member, caller_control_action_t *action);
1282 void conference_loop_vmute_off(conference_member_t *member, caller_control_action_t *action);
1283 void conference_loop_conference_video_vmute_snap(conference_member_t *member, caller_control_action_t *action);
1284 void conference_loop_conference_video_vmute_snapoff(conference_member_t *member, caller_control_action_t *action);
1285 void conference_loop_vmute_toggle(conference_member_t *member, caller_control_action_t *action);
1286 void conference_loop_vmute_on(conference_member_t *member, caller_control_action_t *action);
1287 void conference_loop_moh_toggle(conference_member_t *member, caller_control_action_t *action);
1288 void conference_loop_border(conference_member_t *member, caller_control_action_t *action);
1289 void conference_loop_deafmute_toggle(conference_member_t *member, caller_control_action_t *action);
1290 void conference_loop_hangup(conference_member_t *member, caller_control_action_t *action);
1291 void conference_loop_transfer(conference_member_t *member, caller_control_action_t *action);
1292 void conference_loop_mute_off(conference_member_t *member, caller_control_action_t *action);
1293 void conference_loop_event(conference_member_t *member, caller_control_action_t *action);
1294 void conference_loop_transfer(conference_member_t *member, caller_control_action_t *action);
1295 void conference_loop_exec_app(conference_member_t *member, caller_control_action_t *action);
1296 void conference_loop_deaf_toggle(conference_member_t *member, caller_control_action_t *action);
1297 void conference_loop_deaf_on(conference_member_t *member, caller_control_action_t *action);
1298 void conference_loop_deaf_off(conference_member_t *member, caller_control_action_t *action);
1299 void conference_set_variable(conference_obj_t *conference, const char *var, const char *val);
1300 const char *conference_get_variable(conference_obj_t *conference, const char *var);
1301 
1302 
1303 /* Global Structs */
1304 
1305 
1306 /* API Interface Function sub-commands */
1307 /* Entries in this list should be kept in sync with the enum above */
1308 extern api_command_t conference_api_sub_commands[];
1309 extern struct _mapping control_mappings[];
1310 
1311 
1312 #endif /* MOD_CONFERENCE_H */
1313 
1314 /* For Emacs:
1315  * Local Variables:
1316  * mode:c
1317  * indent-tabs-mode:t
1318  * tab-width:4
1319  * c-basic-offset:4
1320  * End:
1321  * For VIM:
1322  * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
1323  */
1324