747 .name =
"bridge_profile",
749 .category =
"general",
750 .matchfield =
"type",
751 .matchvalue =
"bridge",
784 .name =
"user_profile",
786 .category =
"general",
787 .matchfield =
"type",
788 .matchvalue =
"user",
817 .category =
"general",
818 .matchfield =
"type",
819 .matchvalue =
"menu",
835 .category =
"general",
857 const char *right_name = arg;
863 right_name = right->
name;
866 cmp = strcasecmp(left->
name, right_name);
869 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
878 const char *
name = obj;
903 const char *right_name = arg;
909 right_name = right->
name;
912 cmp = strcasecmp(left->
name, right_name);
915 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
924 const char *
name = obj;
960 const char *right_name = arg;
966 right_name = right->
name;
969 cmp = strcasecmp(left->
name, right_name);
972 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
981 const char *
name = obj;
1030 if (!strcasecmp(sound_name,
"sound_only_person")) {
1032 }
else if (!strcasecmp(sound_name,
"sound_only_one")) {
1034 }
else if (!strcasecmp(sound_name,
"sound_has_joined")) {
1036 }
else if (!strcasecmp(sound_name,
"sound_has_left")) {
1038 }
else if (!strcasecmp(sound_name,
"sound_kicked")) {
1040 }
else if (!strcasecmp(sound_name,
"sound_muted")) {
1042 }
else if (!strcasecmp(sound_name,
"sound_unmuted")) {
1044 }
else if (!strcasecmp(sound_name,
"sound_binaural_on")) {
1046 }
else if (!strcasecmp(sound_name,
"sound_binaural_off")) {
1048 }
else if (!strcasecmp(sound_name,
"sound_there_are")) {
1050 }
else if (!strcasecmp(sound_name,
"sound_other_in_party")) {
1052 }
else if (!strcasecmp(sound_name,
"sound_place_into_conference")) {
1053 static int deprecation_warning = 1;
1054 if (deprecation_warning) {
1056 " and unused. Use sound_begin for similar functionality.");
1057 deprecation_warning = 0;
1060 }
else if (!strcasecmp(sound_name,
"sound_wait_for_leader")) {
1062 }
else if (!strcasecmp(sound_name,
"sound_leader_has_left")) {
1064 }
else if (!strcasecmp(sound_name,
"sound_get_pin")) {
1066 }
else if (!strcasecmp(sound_name,
"sound_invalid_pin")) {
1068 }
else if (!strcasecmp(sound_name,
"sound_locked")) {
1070 }
else if (!strcasecmp(sound_name,
"sound_unlocked_now")) {
1072 }
else if (!strcasecmp(sound_name,
"sound_locked_now")) {
1074 }
else if (!strcasecmp(sound_name,
"sound_error_menu")) {
1076 }
else if (!strcasecmp(sound_name,
"sound_join")) {
1078 }
else if (!strcasecmp(sound_name,
"sound_leave")) {
1080 }
else if (!strcasecmp(sound_name,
"sound_participants_muted")) {
1082 }
else if (!strcasecmp(sound_name,
"sound_participants_unmuted")) {
1084 }
else if (!strcasecmp(sound_name,
"sound_begin")) {
1117 .
type =
"confbridge",
1129 .file =
"CONFBRIDGE"
1165 datastore->
data = b_data;
1179 b_data = datastore->
data;
1189 tmpvar.
file =
"CONFBRIDGE";
1190 if (!strcasecmp(
args.type,
"bridge")) {
1191 if (!strcasecmp(
args.option,
"clear")) {
1205 if (b_data && !b_data->
b_usable && strcasecmp(
args.option,
"template")) {
1214 }
else if (!strcasecmp(
args.type,
"user")) {
1215 if (!strcasecmp(
args.option,
"clear")) {
1222 if (b_data && !b_data->
u_usable && strcasecmp(
args.option,
"template")) {
1231 }
else if (!strcasecmp(
args.type,
"menu")) {
1232 if (!strcasecmp(
args.option,
"clear")) {
1245 if (b_data && !b_data->
m_usable && strcasecmp(
args.option,
"template")) {
1256 ast_log(
LOG_WARNING,
"%s(%s,%s) cannot be set to '%s'. Invalid type, option, or value.\n",
1268 menu_action->
id =
id;
1337 char *tmp_action_names =
ast_strdupa(action_names);
1338 char *action =
NULL;
1342 char *delimiter =
",";
1344 if (!(menu_entry =
ast_calloc(1,
sizeof(*menu_entry)))) {
1352 unsigned int action_len;
1357 startbrace = strchr(tmp_action_names,
'(');
1358 endbrace = strchr(tmp_action_names,
')');
1359 comma = strchr(tmp_action_names,
',');
1363 if (startbrace && endbrace && comma && (comma > startbrace && comma < endbrace)) {
1369 if (!(action =
strsep(&tmp_action_names, delimiter))) {
1378 action_len = strlen(action);
1380 if (!strcasecmp(action,
"toggle_mute")) {
1382 }
else if (!strcasecmp(action,
"toggle_binaural")) {
1384 }
else if (!strcasecmp(action,
"no_op")) {
1386 }
else if (!strcasecmp(action,
"increase_listening_volume")) {
1388 }
else if (!strcasecmp(action,
"decrease_listening_volume")) {
1390 }
else if (!strcasecmp(action,
"increase_talking_volume")) {
1392 }
else if (!strcasecmp(action,
"reset_listening_volume")) {
1394 }
else if (!strcasecmp(action,
"reset_talking_volume")) {
1396 }
else if (!strcasecmp(action,
"decrease_talking_volume")) {
1398 }
else if (!strcasecmp(action,
"admin_toggle_conference_lock")) {
1400 }
else if (!strcasecmp(action,
"admin_toggle_mute_participants")) {
1402 }
else if (!strcasecmp(action,
"participant_count")) {
1404 }
else if (!strcasecmp(action,
"admin_kick_last")) {
1406 }
else if (!strcasecmp(action,
"leave_conference")) {
1408 }
else if (!strcasecmp(action,
"set_as_single_video_src")) {
1410 }
else if (!strcasecmp(action,
"release_as_single_video_src")) {
1412 }
else if (!strncasecmp(action,
"dialplan_exec(", 14)) {
1415 if ((action_args = strchr(action,
'('))) {
1421 if ((
tmp = strchr(action,
')'))) {
1425 }
else if (action_len >= 21 && !strncasecmp(action,
"playback_and_continue(", 22)) {
1428 if ((action_args = strchr(action,
'(')) && (
tmp = strrchr(action_args,
')'))) {
1433 }
else if (action_len >= 8 && !strncasecmp(action,
"playback(", 9)) {
1436 if ((action_args = strchr(action,
'(')) && (
tmp = strrchr(action_args,
')'))) {
1453 if (!strcasecmp(cur->dtmf, menu_entry->
dtmf)) {
1471 int wordlen = strlen(
word);
1482 if (!strncasecmp(u_profile->
name,
word, wordlen) && ++which >
state) {
1502 e->
command =
"confbridge show profile users";
1504 "Usage: confbridge show profile users\n";
1514 ast_cli(
a->fd,
"--------- User Profiles -----------\n");
1532 e->
command =
"confbridge show profile user";
1534 "Usage: confbridge show profile user [<profile name>]\n";
1548 ast_cli(
a->fd,
"No conference user profile named '%s' found!\n",
a->argv[4]);
1552 ast_cli(
a->fd,
"--------------------------------------------\n");
1570 ast_cli(
a->fd,
"MOH When Empty: %s\n",
1572 "enabled" :
"disabled");
1576 ast_cli(
a->fd,
"Announcement: %s\n",
1580 "enabled" :
"disabled");
1583 "enabled" :
"disabled");
1586 "enabled" :
"disabled");
1587 ast_cli(
a->fd,
"END Marked (All): %s\n",
1589 "enabled" :
"disabled");
1590 ast_cli(
a->fd,
"END Marked (Any): %s\n",
1592 "enabled" :
"disabled");
1593 ast_cli(
a->fd,
"Drop_silence: %s\n",
1595 "enabled" :
"disabled");
1596 ast_cli(
a->fd,
"Silence Threshold: %ums\n",
1598 ast_cli(
a->fd,
"Talking Threshold: %u\n",
1602 "enabled" :
"disabled");
1603 ast_cli(
a->fd,
"Jitterbuffer: %s\n",
1605 "enabled" :
"disabled");
1606 ast_cli(
a->fd,
"Talk Detect Events: %s\n",
1608 "enabled" :
"disabled");
1609 ast_cli(
a->fd,
"DTMF Pass Through: %s\n",
1611 "enabled" :
"disabled");
1614 "None" : u_profile.
pin);
1615 ast_cli(
a->fd,
"Announce User Count: %s\n",
1617 "enabled" :
"disabled");
1618 ast_cli(
a->fd,
"Announce join/leave: %s\n",
1621 "enabled (with review)" :
"enabled" :
"disabled");
1622 ast_cli(
a->fd,
"Announce User Count all: %s\n",
1624 "enabled" :
"disabled");
1625 ast_cli(
a->fd,
"Text Messaging: %s\n",
1627 "enabled" :
"disabled");
1628 ast_cli(
a->fd,
"Answer Channel: %s\n",
1640 int wordlen = strlen(
word);
1651 if (!strncasecmp(b_profile->
name,
word, wordlen) && ++which >
state) {
1671 e->
command =
"confbridge show profile bridges";
1673 "Usage: confbridge show profile bridges\n";
1683 ast_cli(
a->fd,
"--------- Bridge Profiles -----------\n");
1703 e->
command =
"confbridge show profile bridge";
1705 "Usage: confbridge show profile bridge <profile name>\n";
1719 ast_cli(
a->fd,
"No conference bridge profile named '%s' found!\n",
a->argv[4]);
1723 ast_cli(
a->fd,
"--------------------------------------------\n");
1744 ast_cli(
a->fd,
"Mixing Interval: Default 20ms\n");
1747 ast_cli(
a->fd,
"Record Conference: %s\n",
1751 ast_cli(
a->fd,
"Record File Append: %s\n",
1755 ast_cli(
a->fd,
"Record File Timestamp: %s\n",
1763 ast_cli(
a->fd,
"Record Options: %s\n",
1766 ast_cli(
a->fd,
"Record Command: %s\n",
1772 ast_cli(
a->fd,
"Max Members: No Limit\n");
1777 switch (b_profile.
flags
1783 ast_cli(
a->fd,
"Video Mode: last_marked\n");
1786 ast_cli(
a->fd,
"Video Mode: first_marked\n");
1789 ast_cli(
a->fd,
"Video Mode: follow_talker\n");
1792 ast_cli(
a->fd,
"Video Mode: sfu\n");
1795 ast_cli(
a->fd,
"Video Mode: no video\n");
1806 switch (b_profile.
flags
1811 ast_cli(
a->fd,
"REMB Behavior: average\n");
1814 ast_cli(
a->fd,
"REMB Behavior: lowest\n");
1817 ast_cli(
a->fd,
"REMB Behavior: highest\n");
1820 ast_cli(
a->fd,
"REMB Behavior: average_all\n");
1823 ast_cli(
a->fd,
"REMB Behavior: lowest_all\n");
1826 ast_cli(
a->fd,
"REMB Behavior: highest_all\n");
1833 ast_cli(
a->fd,
"Enable Events: %s\n",
1872 int wordlen = strlen(
word);
1883 if (!strncasecmp(menu->
name,
word, wordlen) && ++which >
state) {
1903 e->
command =
"confbridge show menus";
1905 "Usage: confbridge show profile menus\n";
1915 ast_cli(
a->fd,
"--------- Menus -----------\n");
1937 e->
command =
"confbridge show menu";
1939 "Usage: confbridge show menu [<menu name>]\n";
1956 if (!(menu =
menu_find(cfg->menus,
a->argv[3]))) {
1957 ast_cli(
a->fd,
"No conference menu named '%s' found!\n",
a->argv[3]);
1970 switch (menu_action->
id) {
1981 ast_cli(
a->fd,
"increase_listening_volume");
1984 ast_cli(
a->fd,
"decrease_listening_volume");
1987 ast_cli(
a->fd,
"reset_listening_volume");
1990 ast_cli(
a->fd,
"reset_talking_volume");
1993 ast_cli(
a->fd,
"increase_talking_volume");
1996 ast_cli(
a->fd,
"decrease_talking_volume");
2005 ast_cli(
a->fd,
"dialplan_exec(%s,%s,%d)",
2011 ast_cli(
a->fd,
"admin_toggle_conference_lock");
2014 ast_cli(
a->fd,
"admin_toggle_mute_participants");
2017 ast_cli(
a->fd,
"participant_count");
2023 ast_cli(
a->fd,
"leave_conference");
2026 ast_cli(
a->fd,
"set_as_single_video_src");
2029 ast_cli(
a->fd,
"release_as_single_video_src");
2096 if (strcasecmp(
var->name,
"announce_user_count_all")) {
2102 u_profile->
flags = u_profile->
flags & ~USER_OPT_ANNOUNCEUSERCOUNTALL;
2115 if (strcasecmp(
var->name,
"mixing_interval")) {
2136 if (strcasecmp(
var->name,
"video_mode")) {
2139 if (!strcasecmp(
var->value,
"first_marked")) {
2146 }
else if (!strcasecmp(
var->value,
"last_marked")) {
2153 }
else if (!strcasecmp(
var->value,
"follow_talker")) {
2160 }
else if (!strcasecmp(
var->value,
"sfu")) {
2167 }
else if (!strcasecmp(
var->value,
"none")) {
2183 if (strcasecmp(
var->name,
"remb_behavior")) {
2196 if (!strcasecmp(
var->value,
"average")) {
2198 }
else if (!strcasecmp(
var->value,
"lowest")) {
2200 }
else if (!strcasecmp(
var->value,
"highest")) {
2202 }
else if (!strcasecmp(
var->value,
"average_all")) {
2204 }
else if (!strcasecmp(
var->value,
"lowest_all")) {
2206 }
else if (!strcasecmp(
var->value,
"highest_all")) {
2208 }
else if (!strcasecmp(
var->value,
"force")) {
2228 if (!strcasecmp(
var->name,
"internal_sample_rate")) {
2230 if (!strcasecmp(
var->value,
"auto")) {
2234 }
else if (!strcasecmp(
var->name,
"maximum_sample_rate")) {
2236 if (!strcasecmp(
var->value,
"none")) {
2303 if (!(new_menu_action =
ast_calloc(1,
sizeof(*new_menu_action)))) {
2306 memcpy(new_menu_action, menu_action,
sizeof(*new_menu_action));
2405 if (!menu_profile) {
2407 if (!menu_profile) {
2533 b_data = datastore->
data;
2547 if (!(tmp2 =
ao2_find(cfg->user_profiles, user_profile_name,
OBJ_KEY))) {
2586 b_data = datastore->
data;
2600 if (!(tmp2 =
ao2_find(cfg->bridge_profiles, bridge_profile_name,
OBJ_KEY))) {
2651 if (!strcasecmp(menu_entry->
dtmf, dtmf_sequence)) {
2686 strcpy(
user->menu_name, menu->
name);
2705 b_data = datastore->
data;
const char * conf_get_sound(enum conf_sounds sound, struct bridge_profile_sounds *custom_sounds)
Looks to see if sound file is stored in bridge profile sounds, if not default sound is provided.
int conf_handle_dtmf(struct ast_bridge_channel *bridge_channel, struct confbridge_user *user, struct conf_menu_entry *menu_entry, struct conf_menu *menu)
Once a DTMF sequence matches a sequence in the user's DTMF menu, this function will get called to per...
Asterisk main include file. File version handling, generic pbx functions.
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ast_calloc(num, len)
A wrapper for calloc()
#define ao2_iterator_next(iter)
#define ao2_link(container, obj)
Add an object to a container.
@ AO2_ALLOC_OPT_LOCK_MUTEX
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
#define ao2_find(container, arg, flags)
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
#define ao2_global_obj_release(holder)
Release the ao2 object held in the global holder.
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ao2_alloc(data_size, destructor_fn)
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
int ast_bridge_dtmf_hook(struct ast_bridge_features *features, const char *dtmf, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Attach a DTMF hook to a bridge features structure.
static char regcontext[AST_MAX_CONTEXT]
static char language[MAX_LANGUAGE]
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
#define ast_channel_lock(chan)
#define ast_channel_unlock(chan)
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Standard Command Line Interface.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
int func_confbridge_helper(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static void bridge_profile_sounds_destroy_cb(void *obj)
static void * menu_find(struct ao2_container *container, const char *category)
static int user_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static struct aco_type bridge_type
static void menu_destructor(void *obj)
CONFIG_INFO_STANDARD(cfg_info, cfg_handle, confbridge_cfg_alloc,.files=ACO_FILES(&confbridge_conf),.pre_apply_config=verify_default_profiles,)
static int add_action_to_menu_entry(struct conf_menu_entry *menu_entry, enum conf_menu_action_id id, char *databuf)
int conf_reload_config(void)
reload confbridge.conf file
static AO2_GLOBAL_OBJ_STATIC(cfg_handle)
static int remb_behavior_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int menu_cmp_cb(void *obj, void *arg, int flags)
static void func_confbridge_data_destructor(struct func_confbridge_data *b_data)
static void bridge_profile_destructor(void *obj)
static int announce_user_count_all_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int bridge_hash_cb(const void *obj, const int flags)
static int user_cmp_cb(void *obj, void *arg, int flags)
static void confbridge_cfg_destructor(void *obj)
static void * menu_alloc(const char *category)
static char * complete_menu_name(const char *line, const char *word, int pos, int state)
static char * complete_bridge_profile_name(const char *line, const char *word, int pos, int state)
static void * bridge_profile_alloc(const char *category)
int conf_find_menu_entry_by_sequence(const char *dtmf_sequence, struct conf_menu *menu, struct conf_menu_entry *result)
Finds a menu_entry in a menu structure matched by DTMF sequence.
static void func_confbridge_destroy_cb(void *data)
void conf_bridge_profile_destroy(struct bridge_profile *b_profile)
Destroy a bridge profile found by 'conf_find_bridge_profile'.
static struct aco_type general_type
static char * handle_cli_confbridge_show_user_profiles(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int bridge_cmp_cb(void *obj, void *arg, int flags)
static void * bridge_profile_find(struct ao2_container *container, const char *category)
static char * handle_cli_confbridge_show_user_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int sample_rate_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int verify_default_profiles(void)
static int menu_hash_cb(const void *obj, const int flags)
static struct ast_cli_entry cli_confbridge_parser[]
int conf_load_config(void)
load confbridge.conf file
static char * handle_cli_confbridge_show_menus(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_cli_confbridge_show_bridge_profiles(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct aco_file confbridge_conf
static int add_menu_entry(struct conf_menu *menu, const char *dtmf, const char *action_names)
static void conf_user_profile_copy(struct user_profile *dst, struct user_profile *src)
static void * confbridge_cfg_alloc(void)
static struct aco_type * user_types[]
static void * user_profile_alloc(const char *category)
static int video_mode_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int user_hash_cb(const void *obj, const int flags)
static int apply_menu_to_user(struct confbridge_user *user, struct conf_menu *menu)
static char * handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
const struct bridge_profile * conf_find_bridge_profile(struct ast_channel *chan, const char *bridge_profile_name, struct bridge_profile *result)
Find a bridge profile given a bridge profile's name and store that profile in result structure.
int conf_set_menu_to_user(struct ast_channel *chan, struct confbridge_user *user, const char *menu_profile_name)
find a menu profile given a menu profile's name and apply the menu in DTMF hooks.
static int sound_option_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static char * handle_cli_confbridge_show_menu(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct aco_type * bridge_types[]
static struct aco_type * menu_types[]
void conf_bridge_profile_copy(struct bridge_profile *dst, struct bridge_profile *src)
copies a bridge profile
static void user_profile_destructor(void *obj)
static char * complete_user_profile_name(const char *line, const char *word, int pos, int state)
void conf_destroy_config(void)
destroy the information loaded from the confbridge.conf file
static struct aco_type menu_type
static int menu_option_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int set_sound(const char *sound_name, const char *sound_file, struct bridge_profile *b_profile)
static struct aco_type user_type
const struct user_profile * conf_find_user_profile(struct ast_channel *chan, const char *user_profile_name, struct user_profile *result)
find a user profile given a user profile's name and store that profile in result structure.
static struct bridge_profile_sounds * bridge_profile_sounds_alloc(void)
static int menu_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int menu_hook_callback(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
static int bridge_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int mix_interval_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int copy_menu_entry(struct conf_menu_entry *dst, struct conf_menu_entry *src)
static int conf_menu_profile_copy(struct conf_menu *dst, struct conf_menu *src)
static void * user_profile_find(struct ao2_container *container, const char *category)
static void menu_hook_destroy(void *hook_pvt)
static const struct ast_datastore_info confbridge_datastore
void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry)
Destroys and frees all the actions stored in a menu_entry structure.
#define DEFAULT_SILENCE_THRESHOLD
@ USER_OPT_ANNOUNCEUSERCOUNTALL
@ USER_OPT_HEAR_OWN_JOIN_SOUND
@ USER_OPT_TEXT_MESSAGING
@ USER_OPT_ANNOUNCEUSERCOUNT
@ USER_OPT_ANSWER_CHANNEL
@ USER_OPT_ANNOUNCE_JOIN_LEAVE
@ USER_OPT_ANNOUNCE_JOIN_LEAVE_REVIEW
@ CONF_SOUND_OTHER_IN_PARTY
@ CONF_SOUND_PARTICIPANTS_UNMUTED
@ CONF_SOUND_PARTICIPANTS_MUTED
@ CONF_SOUND_WAIT_FOR_LEADER
@ CONF_SOUND_BINAURAL_OFF
@ CONF_SOUND_LEADER_HAS_LEFT
@ CONF_SOUND_PLACE_IN_CONF
@ CONF_SOUND_UNLOCKED_NOW
#define DEFAULT_TALKING_THRESHOLD
#define DEFAULT_MENU_PROFILE
#define DEFAULT_BRIDGE_PROFILE
#define DEFAULT_USER_PROFILE
@ BRIDGE_OPT_REMB_BEHAVIOR_AVERAGE
@ BRIDGE_OPT_REMB_BEHAVIOR_HIGHEST_ALL
@ BRIDGE_OPT_REMB_BEHAVIOR_LOWEST
@ BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER
@ BRIDGE_OPT_VIDEO_SRC_LAST_MARKED
@ BRIDGE_OPT_VIDEO_SRC_SFU
@ BRIDGE_OPT_BINAURAL_ACTIVE
@ BRIDGE_OPT_RECORD_CONFERENCE
@ BRIDGE_OPT_REMB_BEHAVIOR_LOWEST_ALL
@ BRIDGE_OPT_RECORD_FILE_TIMESTAMP
@ BRIDGE_OPT_ENABLE_EVENTS
@ BRIDGE_OPT_REMB_BEHAVIOR_FORCE
@ BRIDGE_OPT_RECORD_FILE_APPEND
@ BRIDGE_OPT_REMB_BEHAVIOR_AVERAGE_ALL
@ BRIDGE_OPT_REMB_BEHAVIOR_HIGHEST
@ BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
@ MENU_ACTION_RELEASE_SINGLE_VIDEO_SRC
@ MENU_ACTION_SET_SINGLE_VIDEO_SRC
@ MENU_ACTION_ADMIN_KICK_LAST
@ MENU_ACTION_TOGGLE_BINAURAL
@ MENU_ACTION_RESET_LISTENING
@ MENU_ACTION_INCREASE_TALKING
@ MENU_ACTION_ADMIN_TOGGLE_MUTE_PARTICIPANTS
@ MENU_ACTION_INCREASE_LISTENING
@ MENU_ACTION_DIALPLAN_EXEC
@ MENU_ACTION_DECREASE_LISTENING
@ MENU_ACTION_PLAYBACK_AND_CONTINUE
@ MENU_ACTION_ADMIN_TOGGLE_LOCK
@ MENU_ACTION_DECREASE_TALKING
@ MENU_ACTION_PARTICIPANT_COUNT
@ MENU_ACTION_TOGGLE_MUTE
@ MENU_ACTION_RESET_TALKING
Configuration option-handling.
int aco_set_defaults(struct aco_type *type, const char *category, void *obj)
Set all default options of obj.
void aco_info_destroy(struct aco_info *info)
Destroy an initialized aco_info struct.
@ ACO_PROCESS_ERROR
Their was an error and no changes were applied.
int aco_info_init(struct aco_info *info)
Initialize an aco_info structure.
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
#define CHARFLDSET(type, field)
A helper macro to pass the appropriate arguments to aco_option_register for OPT_CHAR_ARRAY_T.
#define aco_option_register(info, name, matchtype, types, default_val, opt_type, flags,...)
Register a config option.
@ OPT_UINT_T
Type for default option handler for unsigned integers.
@ OPT_NOOP_T
Type for a default handler that should do nothing.
@ OPT_BOOLFLAG_T
Type for default option handler for bools (ast_true/ast_false) that are stored in a flag.
@ OPT_CHAR_ARRAY_T
Type for default option handler for character array strings.
#define aco_option_register_custom(info, name, matchtype, types, default_val, handler, flags)
Register a config option.
int aco_process_var(struct aco_type *type, const char *cat, struct ast_variable *var, void *obj)
Parse a single ast_variable and apply it to an object.
void * aco_pending_config(struct aco_info *info)
Get pending config changes.
enum aco_process_status aco_process_config(struct aco_info *info, int reload)
Process a config info via the options registered with an aco_info.
#define ACO_TYPES(...)
A helper macro to ensure that aco_info types always have a sentinel.
#define ast_datastore_alloc(info, uid)
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
char * strsep(char **str, const char *delims)
Configuration File Parser.
int ast_parse_arg(const char *arg, enum ast_parse_flags flags, void *p_result,...)
The argument parsing routine.
Support for logging to various files, console and syslog Configuration in file logger....
static unsigned char leave[]
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
#define SCOPED_AO2LOCK(varname, obj)
scoped lock specialization for ao2 mutexes.
Core PBX routines and definitions.
static struct stasis_rest_handlers sounds
REST handler for /api-docs/sounds.json.
static corosync_cfg_handle_t cfg_handle
struct ao2_container * container
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
static force_inline int attribute_pure ast_strlen_zero(const char *s)
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
The representation of a single configuration file to be processed.
Type information about a category-level configurable object.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Structure that contains information regarding a channel in a bridge.
Main Channel structure associated with a channel.
descriptor for a cli entry.
Structure for a data store type.
Structure for a data store object.
Structure for variables, used for configurations and for channel variables.
const ast_string_field waitforleader
const ast_string_field invalidpin
const ast_string_field placeintoconf
const ast_string_field onlyone
const ast_string_field otherinparty
const ast_string_field unlockednow
const ast_string_field binauralon
const ast_string_field getpin
const ast_string_field errormenu
const ast_string_field participantsunmuted
const ast_string_field participantsmuted
const ast_string_field leave
const ast_string_field locked
const ast_string_field join
const ast_string_field kicked
const ast_string_field hasleft
const ast_string_field unmuted
const ast_string_field leaderhasleft
const ast_string_field lockednow
const ast_string_field hasjoin
const ast_string_field binauraloff
const ast_string_field onlyperson
const ast_string_field thereare
const ast_string_field muted
const ast_string_field begin
unsigned int remb_send_interval
unsigned int maximum_sample_rate
char regcontext[AST_MAX_CONTEXT]
unsigned int mix_interval
unsigned int video_update_discard
unsigned int internal_sample_rate
char language[MAX_LANGUAGE]
char name[MAX_PROFILE_NAME]
struct bridge_profile_sounds * sounds
struct ao2_container * menus
struct ao2_container * bridge_profiles
struct ao2_container * user_profiles
The structure that represents a conference bridge user.
struct bridge_profile b_profile
struct user_profile u_profile
unsigned int silence_threshold
char announcement[PATH_MAX]
unsigned int talking_threshold
unsigned int announce_user_count_all_after
char name[MAX_PROFILE_NAME]
structure to hold users read from users.conf
int error(const char *format,...)
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define ast_clear_flag(p, flag)
#define ast_set_flag(p, flag)
#define ast_set_flags_to(p, flag, value)