@ -31,6 +31,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
# include "command.h"
# include "command.h"
# include "control.h"
# include "control.h"
# include "app.h"
# include "asterisk/dial.h"
# include "asterisk/dial.h"
# include "asterisk/bridge.h"
# include "asterisk/bridge.h"
# include "asterisk/bridge_after.h"
# include "asterisk/bridge_after.h"
@ -72,6 +73,10 @@ struct stasis_app_control {
* Silence generator , when silence is being generated .
* Silence generator , when silence is being generated .
*/
*/
struct ast_silence_generator * silgen ;
struct ast_silence_generator * silgen ;
/*!
* The app for which this control was created
*/
struct stasis_app * app ;
/*!
/*!
* When set , / c app_stasis should exit and continue in the dialplan .
* When set , / c app_stasis should exit and continue in the dialplan .
*/
*/
@ -91,9 +96,10 @@ static void control_dtor(void *obj)
ao2_cleanup ( control - > command_queue ) ;
ao2_cleanup ( control - > command_queue ) ;
ast_cond_destroy ( & control - > wait_cond ) ;
ast_cond_destroy ( & control - > wait_cond ) ;
ao2_cleanup ( control - > app ) ;
}
}
struct stasis_app_control * control_create ( struct ast_channel * channel )
struct stasis_app_control * control_create ( struct ast_channel * channel , struct stasis_app * app )
{
{
RAII_VAR ( struct stasis_app_control * , control , NULL , ao2_cleanup ) ;
RAII_VAR ( struct stasis_app_control * , control , NULL , ao2_cleanup ) ;
int res ;
int res ;
@ -103,6 +109,8 @@ struct stasis_app_control *control_create(struct ast_channel *channel)
return NULL ;
return NULL ;
}
}
control - > app = ao2_bump ( app ) ;
res = ast_cond_init ( & control - > wait_cond , NULL ) ;
res = ast_cond_init ( & control - > wait_cond , NULL ) ;
if ( res ! = 0 ) {
if ( res ! = 0 ) {
ast_log ( LOG_ERROR , " Error initializing ast_cond_t: %s \n " ,
ast_log ( LOG_ERROR , " Error initializing ast_cond_t: %s \n " ,
@ -798,6 +806,8 @@ static void bridge_after_cb(struct ast_channel *chan, void *data)
ast_channel_pbx_set ( control - > channel , control - > pbx ) ;
ast_channel_pbx_set ( control - > channel , control - > pbx ) ;
control - > pbx = NULL ;
control - > pbx = NULL ;
app_unsubscribe_bridge ( control - > app , control - > bridge ) ;
/* No longer in the bridge */
/* No longer in the bridge */
control - > bridge = NULL ;
control - > bridge = NULL ;
@ -865,6 +875,12 @@ static int app_control_add_channel_to_bridge(
*/
*/
SCOPED_AO2LOCK ( lock , control ) ;
SCOPED_AO2LOCK ( lock , control ) ;
/* Ensure the controlling application is subscribed early enough
* to receive the ChannelEnteredBridge message . This works in concert
* with the subscription handled in the Stasis application execution
* loop */
app_subscribe_bridge ( control - > app , bridge ) ;
/* Save off the channel's PBX */
/* Save off the channel's PBX */
ast_assert ( control - > pbx = = NULL ) ;
ast_assert ( control - > pbx = = NULL ) ;
if ( ! control - > pbx ) {
if ( ! control - > pbx ) {