938    .name = 
"bridge_profile",
 
  940    .category = 
"general",
 
  941    .matchfield = 
"type",
 
  942    .matchvalue = 
"bridge",
 
 
  975    .name  = 
"user_profile",
 
  977    .category = 
"general",
 
  978    .matchfield = 
"type",
 
  979    .matchvalue = 
"user",
 
 
 1008    .category = 
"general",
 
 1009    .matchfield = 
"type",
 
 1010    .matchvalue = 
"menu",
 
 
 1026    .category = 
"general",
 
 
 1048    const char *right_name = arg;
 
 1054        right_name = right->
name;
 
 1057        cmp = strcasecmp(left->
name, right_name);
 
 1060        cmp = strncasecmp(left->
name, right_name, strlen(right_name));
 
 
 1069    const char *
name = obj;
 
 
 1094    const char *right_name = arg;
 
 1100        right_name = right->
name;
 
 1103        cmp = strcasecmp(left->
name, right_name);
 
 1106        cmp = strncasecmp(left->
name, right_name, strlen(right_name));
 
 
 1115    const char *
name = obj;
 
 
 1151    const char *right_name = arg;
 
 1157        right_name = right->
name;
 
 1160        cmp = strcasecmp(left->
name, right_name);
 
 1163        cmp = strncasecmp(left->
name, right_name, strlen(right_name));
 
 
 1172    const char *
name = obj;
 
 
 1221    if (!strcasecmp(sound_name, 
"sound_only_person")) {
 
 1223    } 
else if (!strcasecmp(sound_name, 
"sound_only_one")) {
 
 1225    } 
else if (!strcasecmp(sound_name, 
"sound_has_joined")) {
 
 1227    } 
else if (!strcasecmp(sound_name, 
"sound_has_left")) {
 
 1229    } 
else if (!strcasecmp(sound_name, 
"sound_kicked")) {
 
 1231    } 
else if (!strcasecmp(sound_name, 
"sound_muted")) {
 
 1233    } 
else if (!strcasecmp(sound_name, 
"sound_unmuted")) {
 
 1235    } 
else if (!strcasecmp(sound_name, 
"sound_binaural_on")) {
 
 1237    } 
else if (!strcasecmp(sound_name, 
"sound_binaural_off")) {
 
 1239    } 
else if (!strcasecmp(sound_name, 
"sound_there_are")) {
 
 1241    } 
else if (!strcasecmp(sound_name, 
"sound_other_in_party")) {
 
 1243    } 
else if (!strcasecmp(sound_name, 
"sound_place_into_conference")) {
 
 1244        static int deprecation_warning = 1;
 
 1245        if (deprecation_warning) {
 
 1247                " and unused. Use sound_begin for similar functionality.");
 
 1248            deprecation_warning = 0;
 
 1251    } 
else if (!strcasecmp(sound_name, 
"sound_wait_for_leader")) {
 
 1253    } 
else if (!strcasecmp(sound_name, 
"sound_leader_has_left")) {
 
 1255    } 
else if (!strcasecmp(sound_name, 
"sound_get_pin")) {
 
 1257    } 
else if (!strcasecmp(sound_name, 
"sound_invalid_pin")) {
 
 1259    } 
else if (!strcasecmp(sound_name, 
"sound_locked")) {
 
 1261    } 
else if (!strcasecmp(sound_name, 
"sound_unlocked_now")) {
 
 1263    } 
else if (!strcasecmp(sound_name, 
"sound_locked_now")) {
 
 1265    } 
else if (!strcasecmp(sound_name, 
"sound_error_menu")) {
 
 1267    } 
else if (!strcasecmp(sound_name, 
"sound_join")) {
 
 1269    } 
else if (!strcasecmp(sound_name, 
"sound_leave")) {
 
 1271    } 
else if (!strcasecmp(sound_name, 
"sound_participants_muted")) {
 
 1273    } 
else if (!strcasecmp(sound_name, 
"sound_participants_unmuted")) {
 
 1275    } 
else if (!strcasecmp(sound_name, 
"sound_begin")) {
 
 
 1308    .
type = 
"confbridge",
 
 
 1320        .file = 
"CONFBRIDGE" 
 1356        datastore->
data = b_data;
 
 1370        b_data = datastore->
data;
 
 1380    tmpvar.
file = 
"CONFBRIDGE";
 
 1381    if (!strcasecmp(
args.type, 
"bridge")) {
 
 1382        if (!strcasecmp(
args.option, 
"clear")) {
 
 1396        if (b_data && !b_data->
b_usable && strcasecmp(
args.option, 
"template")) {
 
 1405    } 
else if (!strcasecmp(
args.type, 
"user")) {
 
 1406        if (!strcasecmp(
args.option, 
"clear")) {
 
 1413        if (b_data && !b_data->
u_usable && strcasecmp(
args.option, 
"template")) {
 
 1422    } 
else if (!strcasecmp(
args.type, 
"menu")) {
 
 1423        if (!strcasecmp(
args.option, 
"clear")) {
 
 1436        if (b_data && !b_data->
m_usable && strcasecmp(
args.option, 
"template")) {
 
 1447    ast_log(
LOG_WARNING, 
"%s(%s,%s) cannot be set to '%s'. Invalid type, option, or value.\n",
 
 
 1459    menu_action->
id = 
id;
 
 
 1528    char *tmp_action_names = 
ast_strdupa(action_names);
 
 1529    char *action = 
NULL;
 
 1533    char *delimiter = 
",";
 
 1535    if (!(menu_entry = 
ast_calloc(1, 
sizeof(*menu_entry)))) {
 
 1543        unsigned int action_len;
 
 1548        startbrace = strchr(tmp_action_names, 
'(');
 
 1549        endbrace = strchr(tmp_action_names, 
')');
 
 1550        comma = strchr(tmp_action_names, 
',');
 
 1554        if (startbrace && endbrace && comma && (comma > startbrace && comma < endbrace)) {
 
 1560        if (!(action = 
strsep(&tmp_action_names, delimiter))) {
 
 1569        action_len = strlen(action);
 
 1571        if (!strcasecmp(action, 
"toggle_mute")) {
 
 1573        } 
else if (!strcasecmp(action, 
"toggle_binaural")) {
 
 1575        } 
else if (!strcasecmp(action, 
"no_op")) {
 
 1577        } 
else if (!strcasecmp(action, 
"increase_listening_volume")) {
 
 1579        } 
else if (!strcasecmp(action, 
"decrease_listening_volume")) {
 
 1581        } 
else if (!strcasecmp(action, 
"increase_talking_volume")) {
 
 1583        } 
else if (!strcasecmp(action, 
"reset_listening_volume")) {
 
 1585        } 
else if (!strcasecmp(action, 
"reset_talking_volume")) {
 
 1587        } 
else if (!strcasecmp(action, 
"decrease_talking_volume")) {
 
 1589        } 
else if (!strcasecmp(action, 
"admin_toggle_conference_lock")) {
 
 1591        } 
else if (!strcasecmp(action, 
"admin_toggle_mute_participants")) {
 
 1593        } 
else if (!strcasecmp(action, 
"participant_count")) {
 
 1595        } 
else if (!strcasecmp(action, 
"admin_kick_last")) {
 
 1597        } 
else if (!strcasecmp(action, 
"leave_conference")) {
 
 1599        } 
else if (!strcasecmp(action, 
"set_as_single_video_src")) {
 
 1601        } 
else if (!strcasecmp(action, 
"release_as_single_video_src")) {
 
 1603        } 
else if (!strncasecmp(action, 
"dialplan_exec(", 14)) {
 
 1606            if ((action_args = strchr(action, 
'('))) {
 
 1612            if ((tmp = strchr(action, 
')'))) {
 
 1616        } 
else if (action_len >= 21 && !strncasecmp(action, 
"playback_and_continue(", 22)) {
 
 1619            if ((action_args = strchr(action, 
'(')) && (tmp = strrchr(action_args, 
')'))) {
 
 1624        } 
else if (action_len >= 8 && !strncasecmp(action, 
"playback(", 9)) {
 
 1627            if ((action_args = strchr(action, 
'(')) && (tmp = strrchr(action_args, 
')'))) {
 
 1644        if (!strcasecmp(cur->dtmf, menu_entry->
dtmf)) {
 
 
 1662    int wordlen = strlen(
word);
 
 1673        if (!strncasecmp(u_profile->
name, 
word, wordlen) && ++which > 
state) {
 
 
 1693        e->
command = 
"confbridge show profile users";
 
 1695            "Usage: confbridge show profile users\n";
 
 1705    ast_cli(
a->fd,
"--------- User Profiles -----------\n");
 
 
 1723        e->
command = 
"confbridge show profile user";
 
 1725            "Usage: confbridge show profile user [<profile name>]\n";
 
 1739        ast_cli(
a->fd, 
"No conference user profile named '%s' found!\n", 
a->argv[4]);
 
 1743    ast_cli(
a->fd,
"--------------------------------------------\n");
 
 1761    ast_cli(
a->fd,
"MOH When Empty:          %s\n",
 
 1763        "enabled" : 
"disabled");
 
 1767    ast_cli(
a->fd,
"Announcement:            %s\n",
 
 1771        "enabled" : 
"disabled");
 
 1774        "enabled" : 
"disabled");
 
 1777        "enabled" : 
"disabled");
 
 1778    ast_cli(
a->fd,
"END Marked (All):        %s\n",
 
 1780        "enabled" : 
"disabled");
 
 1781    ast_cli(
a->fd,
"END Marked (Any):        %s\n",
 
 1783        "enabled" : 
"disabled");
 
 1784    ast_cli(
a->fd,
"Drop_silence:            %s\n",
 
 1786        "enabled" : 
"disabled");
 
 1787    ast_cli(
a->fd,
"Silence Threshold:       %ums\n",
 
 1789    ast_cli(
a->fd,
"Talking Threshold:       %u\n",
 
 1793        "enabled" : 
"disabled");
 
 1794    ast_cli(
a->fd,
"Jitterbuffer:            %s\n",
 
 1796        "enabled" : 
"disabled");
 
 1797    ast_cli(
a->fd,
"Talk Detect Events:      %s\n",
 
 1799        "enabled" : 
"disabled");
 
 1800    ast_cli(
a->fd,
"DTMF Pass Through:       %s\n",
 
 1802        "enabled" : 
"disabled");
 
 1805        "None" : u_profile.
pin);
 
 1806    ast_cli(
a->fd,
"Announce User Count:     %s\n",
 
 1808        "enabled" : 
"disabled");
 
 1809    ast_cli(
a->fd,
"Announce join/leave:     %s\n",
 
 1812        "enabled (with review)" : 
"enabled" : 
"disabled");
 
 1813    ast_cli(
a->fd,
"Announce User Count all: %s\n",
 
 1815        "enabled" : 
"disabled");
 
 1816    ast_cli(
a->fd,
"Text Messaging:          %s\n",
 
 1818            "enabled" : 
"disabled");
 
 1819    ast_cli(
a->fd,
"Answer Channel:          %s\n",
 
 
 1831    int wordlen = strlen(
word);
 
 1842        if (!strncasecmp(b_profile->
name, 
word, wordlen) && ++which > 
state) {
 
 
 1862        e->
command = 
"confbridge show profile bridges";
 
 1864            "Usage: confbridge show profile bridges\n";
 
 1874    ast_cli(
a->fd,
"--------- Bridge Profiles -----------\n");
 
 
 1894        e->
command = 
"confbridge show profile bridge";
 
 1896            "Usage: confbridge show profile bridge <profile name>\n";
 
 1910        ast_cli(
a->fd, 
"No conference bridge profile named '%s' found!\n", 
a->argv[4]);
 
 1914    ast_cli(
a->fd,
"--------------------------------------------\n");
 
 1923    ast_cli(
a->fd,
"Internal Sample Rate: %s\n", tmp);
 
 1930    ast_cli(
a->fd,
"Maximum Sample Rate: %s\n", tmp);
 
 1935        ast_cli(
a->fd,
"Mixing Interval:      Default 20ms\n");
 
 1938    ast_cli(
a->fd,
"Record Conference:    %s\n",
 
 1942    ast_cli(
a->fd,
"Record File Append:    %s\n",
 
 1946    ast_cli(
a->fd,
"Record File Timestamp: %s\n",
 
 1954    ast_cli(
a->fd,
"Record Options:       %s\n",
 
 1957    ast_cli(
a->fd,
"Record Command:       %s\n",
 
 1963        ast_cli(
a->fd,
"Max Members:          No Limit\n");
 
 1968    switch (b_profile.
flags 
 1974        ast_cli(
a->fd, 
"Video Mode:           last_marked\n");
 
 1977        ast_cli(
a->fd, 
"Video Mode:           first_marked\n");
 
 1980        ast_cli(
a->fd, 
"Video Mode:           follow_talker\n");
 
 1983        ast_cli(
a->fd, 
"Video Mode:           sfu\n");
 
 1986        ast_cli(
a->fd, 
"Video Mode:           no video\n");
 
 1997    switch (b_profile.
flags 
 2002        ast_cli(
a->fd, 
"REMB Behavior:           average\n");
 
 2005        ast_cli(
a->fd, 
"REMB Behavior:           lowest\n");
 
 2008        ast_cli(
a->fd, 
"REMB Behavior:           highest\n");
 
 2011        ast_cli(
a->fd, 
"REMB Behavior:           average_all\n");
 
 2014        ast_cli(
a->fd, 
"REMB Behavior:           lowest_all\n");
 
 2017        ast_cli(
a->fd, 
"REMB Behavior:           highest_all\n");
 
 2024    ast_cli(
a->fd,
"Enable Events:             %s\n",
 
 
 2063    int wordlen = strlen(
word);
 
 2074        if (!strncasecmp(menu->
name, 
word, wordlen) && ++which > 
state) {
 
 
 2094        e->
command = 
"confbridge show menus";
 
 2096            "Usage: confbridge show profile menus\n";
 
 2106    ast_cli(
a->fd,
"--------- Menus -----------\n");
 
 
 2128        e->
command = 
"confbridge show menu";
 
 2130            "Usage: confbridge show menu [<menu name>]\n";
 
 2147    if (!(menu = 
menu_find(cfg->menus, 
a->argv[3]))) {
 
 2148        ast_cli(
a->fd, 
"No conference menu named '%s' found!\n", 
a->argv[3]);
 
 2161            switch (menu_action->
id) {
 
 2172                ast_cli(
a->fd, 
"increase_listening_volume");
 
 2175                ast_cli(
a->fd, 
"decrease_listening_volume");
 
 2178                ast_cli(
a->fd, 
"reset_listening_volume");
 
 2181                ast_cli(
a->fd, 
"reset_talking_volume");
 
 2184                ast_cli(
a->fd, 
"increase_talking_volume");
 
 2187                ast_cli(
a->fd, 
"decrease_talking_volume");
 
 2196                ast_cli(
a->fd, 
"dialplan_exec(%s,%s,%d)",
 
 2202                ast_cli(
a->fd, 
"admin_toggle_conference_lock");
 
 2205                ast_cli(
a->fd, 
"admin_toggle_mute_participants");
 
 2208                ast_cli(
a->fd, 
"participant_count");
 
 2214                ast_cli(
a->fd, 
"leave_conference");
 
 2217                ast_cli(
a->fd, 
"set_as_single_video_src");
 
 2220                ast_cli(
a->fd, 
"release_as_single_video_src");
 
 
 2287    if (strcasecmp(
var->name, 
"announce_user_count_all")) {
 
 2293        u_profile->
flags = u_profile->
flags & ~USER_OPT_ANNOUNCEUSERCOUNTALL;
 
 
 2306    if (strcasecmp(
var->name, 
"mixing_interval")) {
 
 
 2327    if (strcasecmp(
var->name, 
"video_mode")) {
 
 2330    if (!strcasecmp(
var->value, 
"first_marked")) {
 
 2337    } 
else if (!strcasecmp(
var->value, 
"last_marked")) {
 
 2344    } 
else if (!strcasecmp(
var->value, 
"follow_talker")) {
 
 2351    } 
else if (!strcasecmp(
var->value, 
"sfu")) {
 
 2358    } 
else if (!strcasecmp(
var->value, 
"none")) {
 
 
 2374    if (strcasecmp(
var->name, 
"remb_behavior")) {
 
 2387    if (!strcasecmp(
var->value, 
"average")) {
 
 2389    } 
else if (!strcasecmp(
var->value, 
"lowest")) {
 
 2391    } 
else if (!strcasecmp(
var->value, 
"highest")) {
 
 2393    } 
else if (!strcasecmp(
var->value, 
"average_all")) {
 
 2395    } 
else if (!strcasecmp(
var->value, 
"lowest_all")) {
 
 2397    } 
else if (!strcasecmp(
var->value, 
"highest_all")) {
 
 2399    } 
else if (!strcasecmp(
var->value, 
"force")) {
 
 
 2419    if (!strcasecmp(
var->name, 
"internal_sample_rate")) {
 
 2421        if (!strcasecmp(
var->value, 
"auto")) {
 
 2425    } 
else if (!strcasecmp(
var->name, 
"maximum_sample_rate")) {
 
 2427        if (!strcasecmp(
var->value, 
"none")) {
 
 
 2494        if (!(new_menu_action = 
ast_calloc(1, 
sizeof(*new_menu_action)))) {
 
 2497        memcpy(new_menu_action, menu_action, 
sizeof(*new_menu_action));
 
 
 2596    if (!menu_profile) {
 
 2598        if (!menu_profile) {
 
 
 2724            b_data = datastore->
data;
 
 2738    if (!(tmp2 = 
ao2_find(cfg->user_profiles, user_profile_name, 
OBJ_KEY))) {
 
 
 2777            b_data = datastore->
data;
 
 2791    if (!(tmp2 = 
ao2_find(cfg->bridge_profiles, bridge_profile_name, 
OBJ_KEY))) {
 
 
 2842        if (!strcasecmp(menu_entry->
dtmf, dtmf_sequence)) {
 
 
 2877    strcpy(
user->menu_name, menu->
name); 
 
 
 2896            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_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)