970 .name =
"bridge_profile",
972 .category =
"general",
973 .matchfield =
"type",
974 .matchvalue =
"bridge",
1007 .name =
"user_profile",
1009 .category =
"general",
1010 .matchfield =
"type",
1011 .matchvalue =
"user",
1040 .category =
"general",
1041 .matchfield =
"type",
1042 .matchvalue =
"menu",
1058 .category =
"general",
1080 const char *right_name = arg;
1086 right_name = right->
name;
1089 cmp = strcasecmp(left->
name, right_name);
1092 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
1101 const char *
name = obj;
1126 const char *right_name = arg;
1132 right_name = right->
name;
1135 cmp = strcasecmp(left->
name, right_name);
1138 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
1147 const char *
name = obj;
1183 const char *right_name = arg;
1189 right_name = right->
name;
1192 cmp = strcasecmp(left->
name, right_name);
1195 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
1204 const char *
name = obj;
1253 if (!strcasecmp(sound_name,
"sound_only_person")) {
1255 }
else if (!strcasecmp(sound_name,
"sound_only_one")) {
1257 }
else if (!strcasecmp(sound_name,
"sound_has_joined")) {
1259 }
else if (!strcasecmp(sound_name,
"sound_has_left")) {
1261 }
else if (!strcasecmp(sound_name,
"sound_kicked")) {
1263 }
else if (!strcasecmp(sound_name,
"sound_muted")) {
1265 }
else if (!strcasecmp(sound_name,
"sound_unmuted")) {
1267 }
else if (!strcasecmp(sound_name,
"sound_binaural_on")) {
1269 }
else if (!strcasecmp(sound_name,
"sound_binaural_off")) {
1271 }
else if (!strcasecmp(sound_name,
"sound_there_are")) {
1273 }
else if (!strcasecmp(sound_name,
"sound_other_in_party")) {
1275 }
else if (!strcasecmp(sound_name,
"sound_place_into_conference")) {
1276 static int deprecation_warning = 1;
1277 if (deprecation_warning) {
1279 " and unused. Use sound_begin for similar functionality.");
1280 deprecation_warning = 0;
1283 }
else if (!strcasecmp(sound_name,
"sound_wait_for_leader")) {
1285 }
else if (!strcasecmp(sound_name,
"sound_leader_has_left")) {
1287 }
else if (!strcasecmp(sound_name,
"sound_get_pin")) {
1289 }
else if (!strcasecmp(sound_name,
"sound_invalid_pin")) {
1291 }
else if (!strcasecmp(sound_name,
"sound_locked")) {
1293 }
else if (!strcasecmp(sound_name,
"sound_unlocked_now")) {
1295 }
else if (!strcasecmp(sound_name,
"sound_locked_now")) {
1297 }
else if (!strcasecmp(sound_name,
"sound_error_menu")) {
1299 }
else if (!strcasecmp(sound_name,
"sound_join")) {
1301 }
else if (!strcasecmp(sound_name,
"sound_leave")) {
1303 }
else if (!strcasecmp(sound_name,
"sound_participants_muted")) {
1305 }
else if (!strcasecmp(sound_name,
"sound_participants_unmuted")) {
1307 }
else if (!strcasecmp(sound_name,
"sound_begin")) {
1340 .
type =
"confbridge",
1352 .file =
"CONFBRIDGE"
1388 datastore->
data = b_data;
1402 b_data = datastore->
data;
1412 tmpvar.
file =
"CONFBRIDGE";
1413 if (!strcasecmp(
args.type,
"bridge")) {
1414 if (!strcasecmp(
args.option,
"clear")) {
1428 if (b_data && !b_data->
b_usable && strcasecmp(
args.option,
"template")) {
1437 }
else if (!strcasecmp(
args.type,
"user")) {
1438 if (!strcasecmp(
args.option,
"clear")) {
1445 if (b_data && !b_data->
u_usable && strcasecmp(
args.option,
"template")) {
1454 }
else if (!strcasecmp(
args.type,
"menu")) {
1455 if (!strcasecmp(
args.option,
"clear")) {
1468 if (b_data && !b_data->
m_usable && strcasecmp(
args.option,
"template")) {
1479 ast_log(
LOG_WARNING,
"%s(%s,%s) cannot be set to '%s'. Invalid type, option, or value.\n",
1491 menu_action->
id =
id;
1560 char *tmp_action_names =
ast_strdupa(action_names);
1561 char *action =
NULL;
1565 char *delimiter =
",";
1567 if (!(menu_entry =
ast_calloc(1,
sizeof(*menu_entry)))) {
1575 unsigned int action_len;
1580 startbrace = strchr(tmp_action_names,
'(');
1581 endbrace = strchr(tmp_action_names,
')');
1582 comma = strchr(tmp_action_names,
',');
1586 if (startbrace && endbrace && comma && (comma > startbrace && comma < endbrace)) {
1592 if (!(action =
strsep(&tmp_action_names, delimiter))) {
1601 action_len = strlen(action);
1603 if (!strcasecmp(action,
"toggle_mute")) {
1605 }
else if (!strcasecmp(action,
"toggle_binaural")) {
1607 }
else if (!strcasecmp(action,
"no_op")) {
1609 }
else if (!strcasecmp(action,
"increase_listening_volume")) {
1611 }
else if (!strcasecmp(action,
"decrease_listening_volume")) {
1613 }
else if (!strcasecmp(action,
"increase_talking_volume")) {
1615 }
else if (!strcasecmp(action,
"reset_listening_volume")) {
1617 }
else if (!strcasecmp(action,
"reset_talking_volume")) {
1619 }
else if (!strcasecmp(action,
"decrease_talking_volume")) {
1621 }
else if (!strcasecmp(action,
"admin_toggle_conference_lock")) {
1623 }
else if (!strcasecmp(action,
"admin_toggle_mute_participants")) {
1625 }
else if (!strcasecmp(action,
"participant_count")) {
1627 }
else if (!strcasecmp(action,
"admin_kick_last")) {
1629 }
else if (!strcasecmp(action,
"leave_conference")) {
1631 }
else if (!strcasecmp(action,
"set_as_single_video_src")) {
1633 }
else if (!strcasecmp(action,
"release_as_single_video_src")) {
1635 }
else if (!strncasecmp(action,
"dialplan_exec(", 14)) {
1638 if ((action_args = strchr(action,
'('))) {
1644 if ((tmp = strchr(action,
')'))) {
1648 }
else if (action_len >= 21 && !strncasecmp(action,
"playback_and_continue(", 22)) {
1651 if ((action_args = strchr(action,
'(')) && (tmp = strrchr(action_args,
')'))) {
1656 }
else if (action_len >= 8 && !strncasecmp(action,
"playback(", 9)) {
1659 if ((action_args = strchr(action,
'(')) && (tmp = strrchr(action_args,
')'))) {
1676 if (!strcasecmp(cur->dtmf, menu_entry->
dtmf)) {
1694 int wordlen = strlen(
word);
1705 if (!strncasecmp(u_profile->
name,
word, wordlen) && ++which >
state) {
1725 e->
command =
"confbridge show profile users";
1727 "Usage: confbridge show profile users\n";
1737 ast_cli(
a->fd,
"--------- User Profiles -----------\n");
1755 e->
command =
"confbridge show profile user";
1757 "Usage: confbridge show profile user [<profile name>]\n";
1771 ast_cli(
a->fd,
"No conference user profile named '%s' found!\n",
a->argv[4]);
1775 ast_cli(
a->fd,
"--------------------------------------------\n");
1793 ast_cli(
a->fd,
"MOH When Empty: %s\n",
1795 "enabled" :
"disabled");
1799 ast_cli(
a->fd,
"Announcement: %s\n",
1803 "enabled" :
"disabled");
1806 "enabled" :
"disabled");
1809 "enabled" :
"disabled");
1810 ast_cli(
a->fd,
"END Marked (All): %s\n",
1812 "enabled" :
"disabled");
1813 ast_cli(
a->fd,
"END Marked (Any): %s\n",
1815 "enabled" :
"disabled");
1816 ast_cli(
a->fd,
"Drop_silence: %s\n",
1818 "enabled" :
"disabled");
1819 ast_cli(
a->fd,
"Silence Threshold: %ums\n",
1821 ast_cli(
a->fd,
"Talking Threshold: %u\n",
1825 "enabled" :
"disabled");
1826 ast_cli(
a->fd,
"Jitterbuffer: %s\n",
1828 "enabled" :
"disabled");
1829 ast_cli(
a->fd,
"Talk Detect Events: %s\n",
1831 "enabled" :
"disabled");
1832 ast_cli(
a->fd,
"DTMF Pass Through: %s\n",
1834 "enabled" :
"disabled");
1837 "None" : u_profile.
pin);
1838 ast_cli(
a->fd,
"Announce User Count: %s\n",
1840 "enabled" :
"disabled");
1841 ast_cli(
a->fd,
"Announce join/leave: %s\n",
1844 "enabled (with review)" :
"enabled" :
"disabled");
1845 ast_cli(
a->fd,
"Announce User Count all: %s\n",
1847 "enabled" :
"disabled");
1848 ast_cli(
a->fd,
"Text Messaging: %s\n",
1850 "enabled" :
"disabled");
1851 ast_cli(
a->fd,
"Answer Channel: %s\n",
1863 int wordlen = strlen(
word);
1874 if (!strncasecmp(b_profile->
name,
word, wordlen) && ++which >
state) {
1894 e->
command =
"confbridge show profile bridges";
1896 "Usage: confbridge show profile bridges\n";
1906 ast_cli(
a->fd,
"--------- Bridge Profiles -----------\n");
1926 e->
command =
"confbridge show profile bridge";
1928 "Usage: confbridge show profile bridge <profile name>\n";
1942 ast_cli(
a->fd,
"No conference bridge profile named '%s' found!\n",
a->argv[4]);
1946 ast_cli(
a->fd,
"--------------------------------------------\n");
1955 ast_cli(
a->fd,
"Internal Sample Rate: %s\n", tmp);
1962 ast_cli(
a->fd,
"Maximum Sample Rate: %s\n", tmp);
1967 ast_cli(
a->fd,
"Mixing Interval: Default 20ms\n");
1970 ast_cli(
a->fd,
"Record Conference: %s\n",
1974 ast_cli(
a->fd,
"Record File Append: %s\n",
1978 ast_cli(
a->fd,
"Record File Timestamp: %s\n",
1986 ast_cli(
a->fd,
"Record Options: %s\n",
1989 ast_cli(
a->fd,
"Record Command: %s\n",
1995 ast_cli(
a->fd,
"Max Members: No Limit\n");
2000 switch (b_profile.
flags
2006 ast_cli(
a->fd,
"Video Mode: last_marked\n");
2009 ast_cli(
a->fd,
"Video Mode: first_marked\n");
2012 ast_cli(
a->fd,
"Video Mode: follow_talker\n");
2015 ast_cli(
a->fd,
"Video Mode: sfu\n");
2018 ast_cli(
a->fd,
"Video Mode: no video\n");
2029 switch (b_profile.
flags
2034 ast_cli(
a->fd,
"REMB Behavior: average\n");
2037 ast_cli(
a->fd,
"REMB Behavior: lowest\n");
2040 ast_cli(
a->fd,
"REMB Behavior: highest\n");
2043 ast_cli(
a->fd,
"REMB Behavior: average_all\n");
2046 ast_cli(
a->fd,
"REMB Behavior: lowest_all\n");
2049 ast_cli(
a->fd,
"REMB Behavior: highest_all\n");
2056 ast_cli(
a->fd,
"Enable Events: %s\n",
2060 ast_cli(
a->fd,
"Announcements: %s\n",
2099 int wordlen = strlen(
word);
2110 if (!strncasecmp(menu->
name,
word, wordlen) && ++which >
state) {
2130 e->
command =
"confbridge show menus";
2132 "Usage: confbridge show profile menus\n";
2142 ast_cli(
a->fd,
"--------- Menus -----------\n");
2164 e->
command =
"confbridge show menu";
2166 "Usage: confbridge show menu [<menu name>]\n";
2183 if (!(menu =
menu_find(cfg->menus,
a->argv[3]))) {
2184 ast_cli(
a->fd,
"No conference menu named '%s' found!\n",
a->argv[3]);
2197 switch (menu_action->
id) {
2208 ast_cli(
a->fd,
"increase_listening_volume");
2211 ast_cli(
a->fd,
"decrease_listening_volume");
2214 ast_cli(
a->fd,
"reset_listening_volume");
2217 ast_cli(
a->fd,
"reset_talking_volume");
2220 ast_cli(
a->fd,
"increase_talking_volume");
2223 ast_cli(
a->fd,
"decrease_talking_volume");
2232 ast_cli(
a->fd,
"dialplan_exec(%s,%s,%d)",
2238 ast_cli(
a->fd,
"admin_toggle_conference_lock");
2241 ast_cli(
a->fd,
"admin_toggle_mute_participants");
2244 ast_cli(
a->fd,
"participant_count");
2250 ast_cli(
a->fd,
"leave_conference");
2253 ast_cli(
a->fd,
"set_as_single_video_src");
2256 ast_cli(
a->fd,
"release_as_single_video_src");
2323 if (strcasecmp(
var->name,
"announce_user_count_all")) {
2329 u_profile->
flags = u_profile->
flags & ~USER_OPT_ANNOUNCEUSERCOUNTALL;
2342 if (strcasecmp(
var->name,
"mixing_interval")) {
2363 if (strcasecmp(
var->name,
"video_mode")) {
2366 if (!strcasecmp(
var->value,
"first_marked")) {
2373 }
else if (!strcasecmp(
var->value,
"last_marked")) {
2380 }
else if (!strcasecmp(
var->value,
"follow_talker")) {
2387 }
else if (!strcasecmp(
var->value,
"sfu")) {
2394 }
else if (!strcasecmp(
var->value,
"none")) {
2410 if (strcasecmp(
var->name,
"remb_behavior")) {
2423 if (!strcasecmp(
var->value,
"average")) {
2425 }
else if (!strcasecmp(
var->value,
"lowest")) {
2427 }
else if (!strcasecmp(
var->value,
"highest")) {
2429 }
else if (!strcasecmp(
var->value,
"average_all")) {
2431 }
else if (!strcasecmp(
var->value,
"lowest_all")) {
2433 }
else if (!strcasecmp(
var->value,
"highest_all")) {
2435 }
else if (!strcasecmp(
var->value,
"force")) {
2455 if (!strcasecmp(
var->name,
"internal_sample_rate")) {
2457 if (!strcasecmp(
var->value,
"auto")) {
2461 }
else if (!strcasecmp(
var->name,
"maximum_sample_rate")) {
2463 if (!strcasecmp(
var->value,
"none")) {
2530 if (!(new_menu_action =
ast_calloc(1,
sizeof(*new_menu_action)))) {
2533 memcpy(new_menu_action, menu_action,
sizeof(*new_menu_action));
2632 if (!menu_profile) {
2634 if (!menu_profile) {
2761 b_data = datastore->
data;
2775 if (!(tmp2 =
ao2_find(cfg->user_profiles, user_profile_name,
OBJ_KEY))) {
2814 b_data = datastore->
data;
2828 if (!(tmp2 =
ao2_find(cfg->bridge_profiles, bridge_profile_name,
OBJ_KEY))) {
2879 if (!strcasecmp(menu_entry->
dtmf, dtmf_sequence)) {
2914 strcpy(
user->menu_name, menu->
name);
2933 b_data = datastore->
data;
void ast_cli_unregister_multiple(void)
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...
char * strsep(char **str, const char *delims)
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_GLOBAL_OBJ_STATIC(name)
Define a global object holder to be used to hold an ao2 object, statically initialized.
#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.
#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)
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 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_ANNOUNCEMENTS
@ 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.
#define CONFIG_INFO_STANDARD(name, arr, alloc,...)
Declare an aco_info struct with default module and preload values.
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.
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 phoneprov_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)