Revert "ConfBridge: Rework announcer channel methodology"

This reverts commit 0cdeb2bfb0.

Change-Id: I18ba73b6d4dc0b994f4ffb01ae0b6cfad36ac636
This commit is contained in:
Joshua Colp
2016-08-23 05:54:18 -05:00
parent 0cdeb2bfb0
commit d5d7cbfcfb
3 changed files with 86 additions and 232 deletions

View File

@@ -143,6 +143,31 @@ struct ast_channel_tech *conf_announce_get_tech(void)
return &announce_tech;
}
void conf_announce_channel_depart(struct ast_channel *chan)
{
struct announce_pvt *p = ast_channel_tech_pvt(chan);
if (!p) {
return;
}
ao2_ref(p, +1);
ao2_lock(p);
if (!ast_test_flag(&p->base, AST_UNREAL_CARETAKER_THREAD)) {
ao2_unlock(p);
ao2_ref(p, -1);
return;
}
ast_clear_flag(&p->base, AST_UNREAL_CARETAKER_THREAD);
chan = p->base.chan;
ao2_unlock(p);
ao2_ref(p, -1);
if (chan) {
ast_bridge_depart(chan);
ast_channel_unref(chan);
}
}
int conf_announce_channel_push(struct ast_channel *ast)
{
struct ast_bridge_features *features;
@@ -161,17 +186,20 @@ int conf_announce_channel_push(struct ast_channel *ast)
if (!chan) {
return -1;
}
ast_channel_ref(chan);
}
features = ast_bridge_features_new();
if (!features) {
ast_channel_unref(chan);
return -1;
}
ast_set_flag(&features->feature_flags, AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE);
/* Impart the output channel into the bridge */
if (ast_bridge_impart(p->bridge, chan, NULL, features,
AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
AST_BRIDGE_IMPART_CHAN_DEPARTABLE)) {
ast_channel_unref(chan);
return -1;
}
ao2_lock(p);

View File

@@ -225,9 +225,9 @@ struct confbridge_conference {
struct ast_channel *record_chan; /*!< Channel used for recording the conference */
struct ast_str *record_filename; /*!< Recording filename. */
struct ast_str *orig_rec_file; /*!< Previous b_profile.rec_file. */
ast_mutex_t playback_lock; /*!< Lock used for playback channel */
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 ast_taskprocessor *playback_queue; /*!< Queue for playing back bridge announcements and managing the announcer channel */
};
extern struct ao2_container *conference_bridges;
@@ -606,6 +606,16 @@ struct ast_channel_tech *conf_record_get_tech(void);
*/
struct ast_channel_tech *conf_announce_get_tech(void);
/*!
* \brief Remove the announcer channel from the conference.
* \since 12.0.0
*
* \param chan Either channel in the announcer channel pair.
*
* \return Nothing
*/
void conf_announce_channel_depart(struct ast_channel *chan);
/*!
* \brief Push the announcer channel into the conference.
* \since 12.0.0