[asterisk-commits] mmichelson: branch mmichelson/atxfer_features r394757 - /team/mmichelson/atxf...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Jul 18 13:53:33 CDT 2013
Author: mmichelson
Date: Thu Jul 18 13:53:31 2013
New Revision: 394757
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=394757
Log:
Ensure hooks are added back to bridge channels when bridge changes personality.
This adds an on_personality_change callback to personality details so that when the
bridge changes personality back to normal, the appropriate hooks may be added back
to the involved bridge channels.
Modified:
team/mmichelson/atxfer_features/main/bridging_basic.c
Modified: team/mmichelson/atxfer_features/main/bridging_basic.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/atxfer_features/main/bridging_basic.c?view=diff&rev=394757&r1=394756&r2=394757
==============================================================================
--- team/mmichelson/atxfer_features/main/bridging_basic.c (original)
+++ team/mmichelson/atxfer_features/main/bridging_basic.c Thu Jul 18 13:53:31 2013
@@ -163,6 +163,8 @@
unsigned int bridge_flags;
/*! User data for this personality. If used, must be an ao2 object */
void *pvt;
+ /*! Callback to be called when changing to the personality */
+ void (*on_personality_change)(struct ast_bridge *bridge);
};
/*!
@@ -2665,7 +2667,9 @@
SCOPED_LOCK(lock, bridge, ast_bridge_lock, ast_bridge_unlock);
ao2_cleanup(personality->details[personality->current].pvt);
+ personality->details[personality->current].pvt = NULL;
ast_clear_flag(&bridge->feature_flags, AST_FLAGS_ALL);
+ remove_hooks_on_personality_change(bridge);
personality->current = type;
if (user_data) {
@@ -2673,7 +2677,9 @@
}
personality->details[personality->current].pvt = user_data;
ast_set_flag(&bridge->feature_flags, personality->details[personality->current].bridge_flags);
- remove_hooks_on_personality_change(bridge);
+ if (personality->details[personality->current].on_personality_change) {
+ personality->details[personality->current].on_personality_change(bridge);
+ }
}
static void personality_destructor(void *obj)
@@ -2683,6 +2689,20 @@
for (i = 0; i < BRIDGE_BASIC_PERSONALITY_END; ++i) {
ao2_cleanup(personality->details[i].pvt);
+ }
+}
+
+static void on_personality_change_normal(struct ast_bridge *bridge)
+{
+ struct ast_bridge_channel *iter;
+
+ AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
+ if (ast_bridge_hangup_hook(iter->features, basic_hangup_hook, NULL,
+ NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL) ||
+ ast_bridge_channel_setup_features(iter)) {
+ ast_log(LOG_WARNING, "Unable to set up bridge hooks for channel %s. Features may not work properly\n",
+ ast_channel_name(iter->chan));
+ }
}
}
@@ -2693,6 +2713,7 @@
case BRIDGE_BASIC_PERSONALITY_NORMAL:
details->v_table = &personality_normal_v_table;
details->bridge_flags = NORMAL_FLAGS;
+ details->on_personality_change = on_personality_change_normal;
break;
case BRIDGE_BASIC_PERSONALITY_ATXFER:
details->v_table = &personality_atxfer_v_table;
More information about the asterisk-commits
mailing list