428 static const char app[] =
"ConfBridge";
431 #define CONFERENCE_BRIDGE_BUCKETS 53 434 #define RECORD_FILENAME_INITIAL_SPACE 128 451 const char *
name = obj;
457 name = conference->
name;
476 const char *right_name = arg;
482 right_name = right->
name;
485 cmp = strcasecmp(left->
name, right_name);
488 cmp = strncasecmp(left->
name, right_name, strlen(right_name));
498 return S_OR(custom_sounds->
hasjoin,
"conf-hasjoin");
500 return S_OR(custom_sounds->
hasleft,
"conf-hasleft");
502 return S_OR(custom_sounds->
kicked,
"conf-kicked");
504 return S_OR(custom_sounds->
muted,
"conf-muted");
506 return S_OR(custom_sounds->
unmuted,
"conf-unmuted");
512 return S_OR(custom_sounds->
onlyone,
"conf-onlyone");
524 return S_OR(custom_sounds->
getpin,
"conf-getpin");
530 return S_OR(custom_sounds->
locked,
"conf-locked");
538 return S_OR(custom_sounds->
join,
"confbridge-join");
540 return S_OR(custom_sounds->
leave,
"confbridge-leave");
546 return S_OR(custom_sounds->
begin,
"confbridge-conf-begin");
560 "conference", conference->
name);
599 "conference", conference->
name);
611 if (!bridge_snapshot) {
643 "muted", user->
muted);
723 ext = strrchr(rec_file,
'.');
728 ast_str_set(filename, 0,
"%s-%u", rec_file, (
unsigned int) now);
742 if (!*orig_rec_file) {
897 const char *filename)
900 const char *stop_digits;
903 if (bridge_channel) {
904 chan = bridge_channel->
chan;
983 if (
play_file(bridge_channel, user->
chan, other_in_party) < 0) {
1025 if (user->
chan == chan) {
1070 if (user->
chan == chan) {
1145 ast_debug(1,
"Destroying conference bridge '%s'\n", conference->
name);
1169 if (conference->
bridge) {
1250 mute_user = user->
muted;
1261 mute_effective = mute_user || mute_system;
1263 ast_debug(1,
"User %s is %s: user:%d system:%d.\n",
1265 mute_user, mute_system);
1269 "Conference: %s\r\n" 1271 mute_effective ?
"muted" :
"unmuted",
1283 user->
muted = mute ? 1 : 0;
1287 "Message: participant %s %s\r\n" 1288 "Conference: %s\r\n" 1291 mute ?
"muted" :
"unmuted",
1416 if (!(action =
ast_calloc(1,
sizeof(*action)))) {
1486 ast_debug(1,
"Created announcer channel '%s' to conference bridge '%s'\n",
1490 "Confbridge/%s", conference->
name);
1534 char *confbr_name =
NULL;
1546 new_snapshot = msg->
target;
1573 comma = strchr(confbr_name,
',');
1611 ast_log(
LOG_ERROR,
"Unable to find user profile for channel '%s' in bridge '%s'\n",
1612 old_snapshot->
base->
name, confbr_name);
1631 "muted", user->
muted);
1651 int max_members_reached = 0;
1656 ast_debug(1,
"Trying to find conference bridge '%s'\n", conference_name);
1667 ast_debug(1,
"Conference '%s' is locked and caller is not an admin\n", conference_name);
1680 ast_log(
LOG_ERROR,
"Conference '%s' could not be created.\n", conference_name);
1700 if (!conference->
bridge) {
1703 ast_log(
LOG_ERROR,
"Conference '%s' mixing bridge could not be created.\n", conference_name);
1744 if (!
ao2_link(conference_bridges, conference)) {
1748 "Conference '%s' could not be added to the conferences list.\n", conference_name);
1759 ast_log(
LOG_ERROR,
"Could not allocate announcer channel for conference '%s'\n", conference_name);
1767 ast_log(
LOG_ERROR,
"Could not add announcer channel for conference '%s' bridge\n", conference_name);
1785 ast_debug(1,
"Created conference '%s' and linked to container.\n", conference_name);
1853 if (user_count_res) {
1903 }
else if (say_number >= 0) {
1971 if (say_number < 0) {
1982 filename, conference->
name);
1985 say_number, conference->
name);
2049 .
type =
"Confbridge async playback",
2085 if (async_datastore) {
2088 add = async_datastore->
data;
2095 if (!async_datastore) {
2100 if (!async_datastore->
data) {
2115 aptd =
ast_malloc(
sizeof(*aptd) + strlen(filename) + 1);
2178 if (!async_datastore) {
2182 add = async_datastore->
data;
2223 if (say_number < 0) {
2238 filename, conference->
name);
2241 say_number, conference->
name);
2264 if (!async_datastore) {
2268 add = async_datastore->
data;
2307 "talking_status", talking ?
"on" :
"off",
2309 if (!talking_extras) {
2320 char pin_guess[
MAX_PIN+1] = { 0, };
2322 char *
tmp = pin_guess;
2332 for (i = 0; i < 3; i++) {
2335 tmp, len, 0) >= 0) {
2336 if (!strcasecmp(pin, pin_guess)) {
2348 pin_guess[1] =
'\0';
2349 tmp = pin_guess + 1;
2380 "%s/confbridge-name-%s-%s", destdir,
2422 atd =
ast_malloc(
sizeof(*atd) + strlen(filename) + 1);
2478 conference->
name, filename);
2514 int res = 0, volume_adjustments[2];
2516 int async_delete_task_pushed = 0;
2518 const char *b_profile_name =
NULL;
2519 const char *u_profile_name =
NULL;
2520 const char *menu_profile_name =
NULL;
2526 .tech_args.drop_silence = 0,
2545 goto confbridge_cleanup;
2557 goto confbridge_cleanup;
2564 goto confbridge_cleanup;
2569 b_profile_name =
args.b_profile_name;
2573 ast_log(
LOG_WARNING,
"Conference bridge profile %s does not exist\n", b_profile_name ?
2576 goto confbridge_cleanup;
2581 u_profile_name =
args.u_profile_name;
2588 goto confbridge_cleanup;
2599 goto confbridge_cleanup;
2610 goto confbridge_cleanup;
2616 menu_profile_name =
args.menu_profile_name;
2621 ast_log(
LOG_WARNING,
"Conference menu profile %s does not exist\n", menu_profile_name ?
2624 goto confbridge_cleanup;
2655 goto confbridge_cleanup;
2663 goto confbridge_cleanup;
2720 join_hook_data =
ast_malloc(
sizeof(*join_hook_data));
2721 if (!join_hook_data) {
2723 goto confbridge_cleanup;
2733 goto confbridge_cleanup;
2736 leave_hook_data =
ast_malloc(
sizeof(*leave_hook_data));
2737 if (!leave_hook_data) {
2740 goto confbridge_cleanup;
2751 goto confbridge_cleanup;
2784 goto confbridge_cleanup;
2796 async_delete_task_pushed = 1;
2806 if (!quiet && user.
kicked) {
2817 if (volume_adjustments[0]) {
2820 if (volume_adjustments[1]) {
2840 mute = !user->
muted;
2852 unsigned int binaural;
2865 const char *sound_to_play;
2871 mute = !conference->
muted;
2909 while ((file =
strsep(&file_copy,
"&"))) {
2922 const char *playback_file,
2923 const char *cur_dtmf,
2933 while ((file =
strsep(&file_copy,
"&"))) {
2943 }
else if (digit == -1) {
2965 dtmf[i] = cur_dtmf[i];
2967 dtmf[i] = (char) digit;
2983 &new_menu_entry, menu);
2999 ast_log(
LOG_WARNING,
"Only admin users can use the kick_last menu action. Channel %s of conf %s is not an admin.\n",
3016 }
else if (!last_user->
kicked) {
3035 memset(&args, 0,
sizeof(args));
3078 int stop_prompts = 0;
3082 switch (menu_action->
id) {
3099 if (!stop_prompts) {
3102 "Message: %s\r\nChannel: %s",
3129 if (!(stop_prompts)) {
3206 int all = !strcasecmp(
"all", channel);
3207 int participants = !strcasecmp(
"participants", channel);
3252 int wordlen = strlen(word);
3257 if (!strncasecmp(conference->
name, word, wordlen) && ++which > state) {
3275 int wordlen = strlen(word);
3282 if (!strncasecmp(
"all", word, wordlen) && ++which > state) {
3286 if (!strncasecmp(
"participants", word, wordlen) && ++which > state) {
3316 e->
command =
"confbridge kick";
3318 "Usage: confbridge kick <conference> <channel>\n" 3319 " Kicks a channel out of the conference bridge.\n" 3320 " (all to kick everyone, participants to kick non-admins).\n";
3338 ast_cli(a->
fd,
"No conference bridge named '%s' found!\n", a->
argv[2]);
3344 if (!strcasecmp(
"all", a->
argv[3]) || !strcasecmp(
"participants", a->
argv[3])) {
3345 ast_cli(a->
fd,
"No participants found!\n");
3347 ast_cli(a->
fd,
"No participant named '%s' found!\n", a->
argv[3]);
3357 char flag_str[6 + 1];
3362 flag_str[pos++] =
'A';
3365 flag_str[pos++] =
'M';
3368 flag_str[pos++] =
'W';
3371 flag_str[pos++] =
'E';
3374 flag_str[pos++] =
'm';
3377 flag_str[pos++] =
'w';
3379 flag_str[pos] =
'\0';
3381 ast_cli(a->
fd,
"%-30s %-6s %-16s %-16s %-16s %s\n",
3397 e->
command =
"confbridge list";
3399 "Usage: confbridge list [<name>]\n" 3400 " Lists all currently active conference bridges or a specific conference bridge.\n" 3402 " When a conference bridge name is provided, flags may be shown for users. Below\n" 3403 " are the flags and what they represent.\n" 3406 " A - The user is an admin\n" 3407 " M - The user is a marked user\n" 3408 " W - The user must wait for a marked user to join\n" 3409 " E - The user will be kicked after the last marked user leaves the conference\n" 3410 " m - The user is muted\n" 3411 " w - The user is waiting for a marked user to join\n";
3423 ast_cli(a->
fd,
"Conference Bridge Name Users Marked Locked Muted\n");
3424 ast_cli(a->
fd,
"================================ ====== ====== ====== =====\n");
3427 ast_cli(a->
fd,
"%-32s %6u %6u %-6s %s\n",
3444 ast_cli(a->
fd,
"No conference bridge named '%s' found!\n", a->
argv[2]);
3447 ast_cli(a->
fd,
"Channel Flags User Profile Bridge Profile Menu CallerID\n");
3448 ast_cli(a->
fd,
"============================== ====== ================ ================ ================ ================\n");
3496 const char *chan_name)
3500 int all = !strcasecmp(
"all", chan_name);
3501 int participants = !strcasecmp(
"participants", chan_name);
3546 ast_cli(a->
fd,
"No conference bridge named '%s' found!\n", a->
argv[2]);
3548 }
else if (res == -2) {
3549 if (!strcasecmp(
"all", a->
argv[3]) || !strcasecmp(
"participants", a->
argv[3])) {
3550 ast_cli(a->
fd,
"No participants found in conference %s\n", a->
argv[2]);
3552 ast_cli(a->
fd,
"No channel named '%s' found in conference %s\n", a->
argv[3], a->
argv[2]);
3556 ast_cli(a->
fd,
"%s %s from confbridge %s\n", mute ?
"Muting" :
"Unmuting", a->
argv[3], a->
argv[2]);
3564 e->
command =
"confbridge mute";
3566 "Usage: confbridge mute <conference> <channel>\n" 3567 " Mute a channel in a conference.\n" 3568 " (all to mute everyone, participants to mute non-admins)\n" 3569 " If the specified channel is a prefix,\n" 3570 " the action will be taken on the first\n" 3571 " matching channel.\n";
3595 e->
command =
"confbridge unmute";
3597 "Usage: confbridge unmute <conference> <channel>\n" 3598 " Unmute a channel in a conference.\n" 3599 " (all to unmute everyone, participants to unmute non-admins)\n" 3600 " If the specified channel is a prefix,\n" 3601 " the action will be taken on the first\n" 3602 " matching channel.\n";
3626 e->
command =
"confbridge lock";
3628 "Usage: confbridge lock <conference>\n" 3629 " Lock a conference. While locked, no new non-admins\n" 3630 " may join the conference.\n";
3653 e->
command =
"confbridge unlock";
3655 "Usage: confbridge unlock <conference>\n" 3656 " Unlock a previously locked conference.\n";
3677 const char *rec_file =
NULL;
3682 e->
command =
"confbridge record start";
3684 "Usage: confbridge record start <conference> <file>\n" 3685 " <file> is optional, Otherwise the bridge profile\n" 3686 " record file will be used. If the bridge profile\n" 3687 " has no record file specified, a file will automatically\n" 3688 " be generated in the monitor directory\n";
3700 rec_file = a->
argv[4];
3705 ast_cli(a->
fd,
"Conference not found.\n");
3710 ast_cli(a->
fd,
"Conference is already being recorded.\n");
3720 ast_cli(a->
fd,
"Could not start recording due to internal error.\n");
3739 e->
command =
"confbridge record stop";
3741 "Usage: confbridge record stop <conference>\n" 3742 " Stop a previously started recording.\n";
3756 ast_cli(a->
fd,
"Conference not found.\n");
3762 ast_cli(a->
fd,
"Recording %sstopped.\n", ret ?
"could not be " :
"");
3778 .
name =
"CONFBRIDGE",
3784 .
name =
"CONFBRIDGE_INFO",
3805 "Event: ConfbridgeList\r\n" 3807 "Conference: %s\r\n" 3809 "MarkedUser: %s\r\n" 3810 "WaitMarked: %s\r\n" 3815 "AnsweredTime: %d\r\n" 3847 snprintf(id_text,
sizeof(id_text),
"ActionID: %s\r\n", actionid);
3886 char id_text[512] =
"";
3890 snprintf(id_text,
sizeof(id_text),
"ActionID: %s\r\n", actionid);
3907 "Event: ConfbridgeListRooms\r\n" 3909 "Conference: %s\r\n" 3957 }
else if (res == -2) {
3992 astman_send_ack(s, m, lock ?
"Conference locked" :
"Conference unlocked");
4030 astman_send_ack(s, m, !strcmp(
"all", channel) ?
"All participants kicked" :
"User kicked");
4185 snprintf(buf, len,
"0");
4191 if (!strcasecmp(
args.type,
"parties")) {
4198 }
else if (!strcasecmp(
args.type,
"admins")) {
4204 }
else if (!strcasecmp(
args.type,
"marked")) {
4210 }
else if (!strcasecmp(
args.type,
"locked")) {
4211 count = conference->
locked;
4212 }
else if (!strcasecmp(
args.type,
"muted")) {
4213 count = conference->
muted;
4217 snprintf(buf, len,
"%d", count);
4338 conference_bridges =
NULL;
4377 if (!conference_bridges) {
4421 .optional_modules =
"codec_speex,func_jitterbuffer",
struct stasis_message_type * confbridge_start_record_type(void)
get the confbridge start_record stasis message type
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
static void conf_moh_unsuspend(struct confbridge_user *user)
void conf_remove_user_marked(struct confbridge_conference *conference, struct confbridge_user *user)
Remove a conference bridge user from the marked active conference users in the conference.
int ast_audiohook_volume_set(struct ast_channel *chan, enum ast_audiohook_direction direction, int volume)
Adjust the volume on frames read from or written to a channel.
const ast_string_field unlockednow
void ast_bridge_set_sfu_video_mode(struct ast_bridge *bridge)
Set the bridge to be a selective forwarding unit.
const ast_string_field data
void conf_add_user_active(struct confbridge_conference *conference, struct confbridge_user *user)
Add a conference bridge user as an unmarked active user of the conference.
const ast_string_field thereare
Options for ast_pbx_run()
static int action_confbridgekick(struct mansession *s, const struct message *m)
static void send_leave_event(struct confbridge_user *user, struct confbridge_conference *conference)
#define ast_channel_lock(chan)
static char * handle_cli_confbridge_mute(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char exten[AST_MAX_EXTENSION]
Main Channel structure associated with a channel.
int ast_bridge_remove(struct ast_bridge *bridge, struct ast_channel *chan)
Remove a channel from a bridge.
static int announce_user_count(struct confbridge_conference *conference, struct confbridge_user *user, struct ast_bridge_channel *bridge_channel)
Announce number of users in the conference bridge to the caller.
void ast_bridge_features_cleanup(struct ast_bridge_features *features)
Clean up the contents of a bridge features structure.
conference_event_fn join_unmarked
#define AST_CLI_DEFINE(fn, txt,...)
int conf_add_post_join_action(struct confbridge_user *user, int(*func)(struct confbridge_user *user))
Queue a function to run with the given conference bridge user as an argument once the state transitio...
char * str
Subscriber phone number (Malloced)
void ast_bridge_set_mixing_interval(struct ast_bridge *bridge, unsigned int mixing_interval)
Adjust the internal mixing interval of a bridge used during multimix mode.
void ast_taskprocessor_build_name(char *buf, unsigned int size, const char *format,...)
Build a taskprocessor name with a sequence number on the end.
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
struct ast_channel_snapshot_base * base
Asterisk locking-related definitions:
void astman_append(struct mansession *s, const char *fmt,...)
Asterisk main include file. File version handling, generic pbx functions.
int ast_shutting_down(void)
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
const ast_string_field join
static void conf_moh_suspend(struct confbridge_user *user)
void conf_remove_user_active(struct confbridge_conference *conference, struct confbridge_user *user)
Remove a conference bridge user from the unmarked active conference users in the conference.
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
int manager_confbridge_init(void)
register stasis message routers to handle manager events for confbridge messages
struct stasis_message_type * confbridge_join_type(void)
get the confbridge join stasis message type
static void send_conf_end_event(struct confbridge_conference *conference)
static int join_callback(struct ast_bridge_channel *bridge_channel, void *ignore)
void ast_bridge_set_binaural_active(struct ast_bridge *bridge, unsigned int binaural_active)
Activates the use of binaural signals in a conference bridge.
int ast_autoservice_start(struct ast_channel *chan)
Automatically service a channel for us...
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
static char * handle_cli_confbridge_list(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_channel * chan
static int user_timeout(struct ast_bridge_channel *bridge_channel, void *ignore)
int ast_audiohook_volume_get(struct ast_channel *chan, enum ast_audiohook_direction direction)
Retrieve the volume adjustment value on frames read from or written to a channel. ...
int pbx_exec(struct ast_channel *c, struct ast_app *app, const char *data)
Execute an application.
void ast_bridge_set_maximum_sample_rate(struct ast_bridge *bridge, unsigned int sample_rate)
Adjust the maximum mixing sample rate of a bridge used during multimix mode.
Message representing attended transfer.
const ast_string_field otherinparty
int ast_bridge_leave_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Attach a bridge channel leave hook to a bridge features structure.
Structure that contains features information.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
static void send_join_event(struct confbridge_user *user, struct confbridge_conference *conference)
#define ast_channel_unref(c)
Decrease channel reference count.
struct confbridge_conference * conference
The arg parameter is a search key, but is not an object.
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...
#define ast_test_flag(p, flag)
static void wait_for_initiator(struct ast_channel *initiator)
Wait for the initiator of an async playback to be ready.
static int action_confbridgesetsinglevideosrc(struct mansession *s, const struct message *m)
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
static int play_sound_number(struct confbridge_conference *conference, int say_number)
Play number into the conference bridge.
char name[MAX_PROFILE_NAME]
static int action_toggle_mute_participants(struct confbridge_conference *conference, struct confbridge_user *user)
int ast_bridge_join_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Unregisters a handler for a built in interval feature.
static int playback_task(void *data)
Play an announcement into a confbridge.
unsigned int talking_threshold
#define ast_set_flag(p, flag)
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
int ast_json_object_update(struct ast_json *object, struct ast_json *other)
Update object with all of the fields of other.
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
Stasis Message Bus API. See Stasis Message Bus API for detailed documentation.
descriptor for a cli entry.
void conf_remove_user_waiting(struct confbridge_conference *conference, struct confbridge_user *user)
Remove a conference bridge user from the waiting conference users in the conference.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
int ast_bridge_unsuspend(struct ast_bridge *bridge, struct ast_channel *chan)
Unsuspend a channel from a bridge.
int ast_bridge_features_init(struct ast_bridge_features *features)
Initialize bridge features structure.
struct ast_taskprocessor * ast_taskprocessor_get(const char *name, enum ast_tps_options create)
Get a reference to a taskprocessor with the specified name and create the taskprocessor if necessary...
int ast_bridge_talk_detector_hook(struct ast_bridge_features *features, ast_bridge_talking_indicate_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Attach a bridge channel talk detection hook to a bridge features structure.
Structure that contains a snapshot of information about a bridge.
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 int conf_handle_talker_cb(struct ast_bridge_channel *bridge_channel, void *hook_pvt, int talking)
static int load_module(void)
Load the module.
static struct confbridge_conference * join_conference_bridge(const char *conference_name, struct confbridge_user *user)
Join a conference bridge.
static char * handle_cli_confbridge_start_record(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Structure representing a snapshot of channel state.
struct bridge_profile_sounds * sounds
return a reference to a taskprocessor, create one if it does not exist
static void handle_video_on_exit(struct confbridge_conference *conference, struct ast_channel *chan)
static int conf_get_pin(struct ast_channel *chan, struct confbridge_user *user)
const ast_string_field onlyone
unsigned int suspended_moh
static int conf_stop_record(struct confbridge_conference *conference)
void ast_bridge_channel_feature_digit_add(struct ast_bridge_channel *bridge_channel, int digit)
Add a DTMF digit to the collected digits.
void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry)
Destroys and frees all the actions stored in a menu_entry structure.
static int action_toggle_mute(struct confbridge_conference *conference, struct confbridge_user *user, struct ast_bridge_channel *bridge_channel)
Structure for a data store type.
ast_channel_state
ast_channel states
struct ast_channel_snapshot * target
void conf_mute_only_active(struct confbridge_conference *conference)
Attempt to mute/play MOH to the only user in the conference if they require it.
int ast_bridge_destroy(struct ast_bridge *bridge, int cause)
Destroy a bridge.
static void generic_mute_unmute_user(struct confbridge_conference *conference, struct confbridge_user *user, int mute)
#define ast_cond_wait(cond, mutex)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
#define ast_cond_init(cond, attr)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
void conf_update_user_mute(struct confbridge_user *user)
Update the actual mute status of the user and set it on the bridge.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
int ast_channel_get_up_time(struct ast_channel *chan)
Obtain how long it has been since the channel was answered.
struct confbridge_state * CONF_STATE_EMPTY
Conference state with no active or waiting users.
unsigned int silence_threshold
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
#define ast_mutex_lock(a)
static struct ast_custom_function confbridge_info_function
unsigned int binaural_suspended
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
static int kick_conference_participant(struct confbridge_conference *conference, const char *channel)
static char * complete_confbridge_name(const char *line, const char *word, int pos, int state)
#define ast_strdup(str)
A wrapper for strdup()
Structure for a data store object.
struct confbridge_conference * conference
struct confbridge_conference * conference
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.
static int hangup(void *data)
Generic File Format Support. Should be included by clients of the file handling routines. File service providers should instead include mod_format.h.
void confbridge_handle_atxfer(struct ast_attended_transfer_message *msg)
Create join/leave events for attended transfers.
conference_event_fn leave_unmarked
static int action_confbridgeunlock(struct mansession *s, const struct message *m)
void conf_add_user_marked(struct confbridge_conference *conference, struct confbridge_user *user)
Add a conference bridge user as a marked active user of the conference.
struct ast_channel * record_chan
struct stasis_message_type * confbridge_start_type(void)
get the confbridge start stasis message type
#define CONFERENCE_BRIDGE_BUCKETS