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