|
|
|
@ -201,16 +201,16 @@ struct bridge_profile {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*! \brief The structure that represents a conference bridge */
|
|
|
|
|
struct conference_bridge {
|
|
|
|
|
struct confbridge_conference {
|
|
|
|
|
char name[MAX_CONF_NAME]; /*!< Name of the conference bridge */
|
|
|
|
|
struct conference_state *state; /*!< Conference state information */
|
|
|
|
|
struct confbridge_state *state; /*!< Conference state information */
|
|
|
|
|
struct ast_bridge *bridge; /*!< Bridge structure doing the mixing */
|
|
|
|
|
struct bridge_profile b_profile; /*!< The Bridge Configuration Profile */
|
|
|
|
|
unsigned int activeusers; /*!< Number of active users present */
|
|
|
|
|
unsigned int markedusers; /*!< Number of marked users present */
|
|
|
|
|
unsigned int waitingusers; /*!< Number of waiting users present */
|
|
|
|
|
unsigned int locked:1; /*!< Is this conference bridge locked? */
|
|
|
|
|
unsigned int muted:1; /*!< Is this conference bridge muted? */
|
|
|
|
|
unsigned int muted:1; /*!< Is this conference bridge muted? */
|
|
|
|
|
unsigned int record_state:2; /*!< Whether recording is started, stopped, or should exit */
|
|
|
|
|
struct ast_channel *playback_chan; /*!< Channel used for playback into the conference bridge */
|
|
|
|
|
struct ast_channel *record_chan; /*!< Channel used for recording the conference */
|
|
|
|
@ -218,18 +218,18 @@ struct conference_bridge {
|
|
|
|
|
ast_mutex_t playback_lock; /*!< Lock used for playback channel */
|
|
|
|
|
ast_mutex_t record_lock; /*!< Lock used for the record thread */
|
|
|
|
|
ast_cond_t record_cond; /*!< Recording condition variable */
|
|
|
|
|
AST_LIST_HEAD_NOLOCK(, conference_bridge_user) active_list; /*!< List of users participating in the conference bridge */
|
|
|
|
|
AST_LIST_HEAD_NOLOCK(, conference_bridge_user) waiting_list; /*!< List of users waiting to join the conference bridge */
|
|
|
|
|
AST_LIST_HEAD_NOLOCK(, confbridge_user) active_list; /*!< List of users participating in the conference bridge */
|
|
|
|
|
AST_LIST_HEAD_NOLOCK(, confbridge_user) waiting_list; /*!< List of users waiting to join the conference bridge */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct post_join_action {
|
|
|
|
|
int (*func)(struct conference_bridge_user *);
|
|
|
|
|
int (*func)(struct confbridge_user *user);
|
|
|
|
|
AST_LIST_ENTRY(post_join_action) list;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*! \brief The structure that represents a conference bridge user */
|
|
|
|
|
struct conference_bridge_user {
|
|
|
|
|
struct conference_bridge *conference_bridge; /*!< Conference bridge they are participating in */
|
|
|
|
|
struct confbridge_user {
|
|
|
|
|
struct confbridge_conference *conference; /*!< Conference bridge they are participating in */
|
|
|
|
|
struct bridge_profile b_profile; /*!< The Bridge Configuration Profile */
|
|
|
|
|
struct user_profile u_profile; /*!< The User Configuration Profile */
|
|
|
|
|
char menu_name[64]; /*!< The name of the DTMF menu assigned to this user */
|
|
|
|
@ -241,7 +241,7 @@ struct conference_bridge_user {
|
|
|
|
|
unsigned int kicked:1; /*!< User has been kicked from the conference */
|
|
|
|
|
unsigned int playing_moh:1; /*!< MOH is currently being played to the user */
|
|
|
|
|
AST_LIST_HEAD_NOLOCK(, post_join_action) post_join_list; /*!< List of sounds to play after joining */;
|
|
|
|
|
AST_LIST_ENTRY(conference_bridge_user) list; /*!< Linked list information */
|
|
|
|
|
AST_LIST_ENTRY(confbridge_user) list; /*!< Linked list information */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*! \brief load confbridge.conf file */
|
|
|
|
@ -296,7 +296,7 @@ void conf_bridge_profile_copy(struct bridge_profile *dst, struct bridge_profile
|
|
|
|
|
* \retval 0 on success, menu was found and set
|
|
|
|
|
* \retval -1 on error, menu was not found
|
|
|
|
|
*/
|
|
|
|
|
int conf_set_menu_to_user(const char *menu_name, struct conference_bridge_user *conference_bridge_user);
|
|
|
|
|
int conf_set_menu_to_user(const char *menu_name, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief Finds a menu_entry in a menu structure matched by DTMF sequence.
|
|
|
|
@ -318,7 +318,7 @@ void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry);
|
|
|
|
|
* called to perform the menu action.
|
|
|
|
|
*
|
|
|
|
|
* \param bridge_channel Bridged channel this is involving
|
|
|
|
|
* \param conference_bridge_user the conference user to perform the action on.
|
|
|
|
|
* \param user the conference user to perform the action on.
|
|
|
|
|
* \param menu_entry the menu entry that invoked this callback to occur.
|
|
|
|
|
* \param menu an AO2 referenced pointer to the entire menu structure the menu_entry
|
|
|
|
|
* derived from.
|
|
|
|
@ -333,7 +333,7 @@ void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry);
|
|
|
|
|
*/
|
|
|
|
|
int conf_handle_dtmf(
|
|
|
|
|
struct ast_bridge_channel *bridge_channel,
|
|
|
|
|
struct conference_bridge_user *conference_bridge_user,
|
|
|
|
|
struct confbridge_user *user,
|
|
|
|
|
struct conf_menu_entry *menu_entry,
|
|
|
|
|
struct conf_menu *menu);
|
|
|
|
|
|
|
|
|
@ -347,18 +347,18 @@ int func_confbridge_helper(struct ast_channel *chan, const char *cmd, char *data
|
|
|
|
|
/*!
|
|
|
|
|
* \brief Play sound file into conference bridge
|
|
|
|
|
*
|
|
|
|
|
* \param conference_bridge The conference bridge to play sound file into
|
|
|
|
|
* \param conference The conference bridge to play sound file into
|
|
|
|
|
* \param filename Sound file to play
|
|
|
|
|
*
|
|
|
|
|
* \retval 0 success
|
|
|
|
|
* \retval -1 failure
|
|
|
|
|
*/
|
|
|
|
|
int play_sound_file(struct conference_bridge *conference_bridge, const char *filename);
|
|
|
|
|
int play_sound_file(struct confbridge_conference *conference, const char *filename);
|
|
|
|
|
|
|
|
|
|
/*! \brief Callback to be called when the conference has become empty
|
|
|
|
|
* \param conference_bridge The conference bridge
|
|
|
|
|
* \param conference The conference bridge
|
|
|
|
|
*/
|
|
|
|
|
void conf_ended(struct conference_bridge *conference_bridge);
|
|
|
|
|
void conf_ended(struct confbridge_conference *conference);
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief Stop MOH for the conference user.
|
|
|
|
@ -367,7 +367,7 @@ void conf_ended(struct conference_bridge *conference_bridge);
|
|
|
|
|
*
|
|
|
|
|
* \return Nothing
|
|
|
|
|
*/
|
|
|
|
|
void conf_moh_stop(struct conference_bridge_user *user);
|
|
|
|
|
void conf_moh_stop(struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief Start MOH for the conference user.
|
|
|
|
@ -376,88 +376,88 @@ void conf_moh_stop(struct conference_bridge_user *user);
|
|
|
|
|
*
|
|
|
|
|
* \return Nothing
|
|
|
|
|
*/
|
|
|
|
|
void conf_moh_start(struct conference_bridge_user *user);
|
|
|
|
|
void conf_moh_start(struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Attempt to mute/play MOH to the only user in the conference if they require it
|
|
|
|
|
* \param conference_bridge A conference bridge containing a single user
|
|
|
|
|
* \param conference A conference bridge containing a single user
|
|
|
|
|
*/
|
|
|
|
|
void conf_mute_only_active(struct conference_bridge *conference_bridge);
|
|
|
|
|
void conf_mute_only_active(struct confbridge_conference *conference);
|
|
|
|
|
|
|
|
|
|
/*! \brief Callback to execute any time we transition from zero to one marked users
|
|
|
|
|
* \param cbu The first marked user joining the conference
|
|
|
|
|
* \param user The first marked user joining the conference
|
|
|
|
|
* \retval 0 success
|
|
|
|
|
* \retval -1 failure
|
|
|
|
|
*/
|
|
|
|
|
int conf_handle_first_marked_common(struct conference_bridge_user *cbu);
|
|
|
|
|
int conf_handle_first_marked_common(struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Callback to execute any time we transition from zero to one active users
|
|
|
|
|
* \param conference_bridge The conference bridge with a single active user joined
|
|
|
|
|
* \param conference The conference bridge with a single active user joined
|
|
|
|
|
* \retval 0 success
|
|
|
|
|
* \retval -1 failure
|
|
|
|
|
*/
|
|
|
|
|
void conf_handle_first_join(struct conference_bridge *conference_bridge);
|
|
|
|
|
void conf_handle_first_join(struct confbridge_conference *conference);
|
|
|
|
|
|
|
|
|
|
/*! \brief Handle actions every time a waitmarked user joins w/o a marked user present
|
|
|
|
|
* \param cbu The waitmarked user
|
|
|
|
|
* \param user The waitmarked user
|
|
|
|
|
* \retval 0 success
|
|
|
|
|
* \retval -1 failure
|
|
|
|
|
*/
|
|
|
|
|
int conf_handle_inactive_waitmarked(struct conference_bridge_user *cbu);
|
|
|
|
|
int conf_handle_inactive_waitmarked(struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Handle actions whenever an unmarked user joins an inactive conference
|
|
|
|
|
* \note These actions seem like they could apply just as well to a marked user
|
|
|
|
|
* and possibly be made to happen any time transitioning to a single state.
|
|
|
|
|
*
|
|
|
|
|
* \param cbu The unmarked user
|
|
|
|
|
* \param user The unmarked user
|
|
|
|
|
*/
|
|
|
|
|
int conf_handle_only_unmarked(struct conference_bridge_user *cbu);
|
|
|
|
|
int conf_handle_only_unmarked(struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Handle when a conference moves to having more than one active participant
|
|
|
|
|
* \param conference_bridge The conference bridge with more than one active participant
|
|
|
|
|
* \param conference The conference bridge with more than one active participant
|
|
|
|
|
*/
|
|
|
|
|
void conf_handle_second_active(struct conference_bridge *conference_bridge);
|
|
|
|
|
void conf_handle_second_active(struct confbridge_conference *conference);
|
|
|
|
|
|
|
|
|
|
/*! \brief Add a conference bridge user as an unmarked active user of the conference
|
|
|
|
|
* \param conference_bridge The conference bridge to add the user to
|
|
|
|
|
* \param cbu The conference bridge user to add to the conference
|
|
|
|
|
* \param conference The conference bridge to add the user to
|
|
|
|
|
* \param user The conference bridge user to add to the conference
|
|
|
|
|
*/
|
|
|
|
|
void conf_add_user_active(struct conference_bridge *conference_bridge, struct conference_bridge_user *cbu);
|
|
|
|
|
void conf_add_user_active(struct confbridge_conference *conference, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Add a conference bridge user as a marked active user of the conference
|
|
|
|
|
* \param conference_bridge The conference bridge to add the user to
|
|
|
|
|
* \param cbu The conference bridge user to add to the conference
|
|
|
|
|
* \param conference The conference bridge to add the user to
|
|
|
|
|
* \param user The conference bridge user to add to the conference
|
|
|
|
|
*/
|
|
|
|
|
void conf_add_user_marked(struct conference_bridge *conference_bridge, struct conference_bridge_user *cbu);
|
|
|
|
|
void conf_add_user_marked(struct confbridge_conference *conference, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Add a conference bridge user as an waiting user of the conference
|
|
|
|
|
* \param conference_bridge The conference bridge to add the user to
|
|
|
|
|
* \param cbu The conference bridge user to add to the conference
|
|
|
|
|
* \param conference The conference bridge to add the user to
|
|
|
|
|
* \param user The conference bridge user to add to the conference
|
|
|
|
|
*/
|
|
|
|
|
void conf_add_user_waiting(struct conference_bridge *conference_bridge, struct conference_bridge_user *cbu);
|
|
|
|
|
void conf_add_user_waiting(struct confbridge_conference *conference, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Remove a conference bridge user from the unmarked active conference users in the conference
|
|
|
|
|
* \param conference_bridge The conference bridge to remove the user from
|
|
|
|
|
* \param cbu The conference bridge user to remove from the conference
|
|
|
|
|
* \param conference The conference bridge to remove the user from
|
|
|
|
|
* \param user The conference bridge user to remove from the conference
|
|
|
|
|
*/
|
|
|
|
|
void conf_remove_user_active(struct conference_bridge *conference_bridge, struct conference_bridge_user *cbu);
|
|
|
|
|
void conf_remove_user_active(struct confbridge_conference *conference, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Remove a conference bridge user from the marked active conference users in the conference
|
|
|
|
|
* \param conference_bridge The conference bridge to remove the user from
|
|
|
|
|
* \param cbu The conference bridge user to remove from the conference
|
|
|
|
|
* \param conference The conference bridge to remove the user from
|
|
|
|
|
* \param user The conference bridge user to remove from the conference
|
|
|
|
|
*/
|
|
|
|
|
void conf_remove_user_marked(struct conference_bridge *conference_bridge, struct conference_bridge_user *cbu);
|
|
|
|
|
void conf_remove_user_marked(struct confbridge_conference *conference, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Remove a conference bridge user from the waiting conference users in the conference
|
|
|
|
|
* \param conference_bridge The conference bridge to remove the user from
|
|
|
|
|
* \param cbu The conference bridge user to remove from the conference
|
|
|
|
|
* \param conference The conference bridge to remove the user from
|
|
|
|
|
* \param user The conference bridge user to remove from the conference
|
|
|
|
|
*/
|
|
|
|
|
void conf_remove_user_waiting(struct conference_bridge *conference_bridge, struct conference_bridge_user *cbu);
|
|
|
|
|
void conf_remove_user_waiting(struct confbridge_conference *conference, struct confbridge_user *user);
|
|
|
|
|
|
|
|
|
|
/*! \brief Queue a function to run with the given conference bridge user as an argument once the state transition is complete
|
|
|
|
|
* \param cbu The conference bridge user to pass to the function
|
|
|
|
|
* \param user The conference bridge user to pass to the function
|
|
|
|
|
* \param func The function to queue
|
|
|
|
|
* \retval 0 success
|
|
|
|
|
* \retval non-zero failure
|
|
|
|
|
*/
|
|
|
|
|
int conf_add_post_join_action(struct conference_bridge_user *cbu, int (*func)(struct conference_bridge_user *cbu));
|
|
|
|
|
int conf_add_post_join_action(struct confbridge_user *user, int (*func)(struct confbridge_user *user));
|
|
|
|
|
#endif
|
|
|
|
|