diff options
author | Jenkins2 <jenkins2@gerrit.asterisk.org> | 2017-08-30 08:58:35 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-08-30 08:58:35 -0500 |
commit | 36c1513148d85af188e7e740fb1d6524c17fc3bf (patch) | |
tree | 2106bdb13f652106f575cb6a84a81e4aa1a2d02e | |
parent | 06cc5ae9ff26b87d2d18abaa4c0871874f410a2e (diff) | |
parent | 4650fc477a88e84e9b3845dd60eeb43d64b30a3a (diff) |
Merge "bridge_native_rtp.c: Fixup native_rtp_framehook()"
-rw-r--r-- | bridges/bridge_native_rtp.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c index 02b27e123..a46b42027 100644 --- a/bridges/bridge_native_rtp.c +++ b/bridges/bridge_native_rtp.c @@ -539,10 +539,12 @@ static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel static struct ast_frame *native_rtp_framehook(struct ast_channel *chan, struct ast_frame *f, enum ast_framehook_event event, void *data) { - RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup); + struct ast_bridge *bridge; struct native_rtp_framehook_data *native_data = data; - if (!f || (event != AST_FRAMEHOOK_EVENT_WRITE)) { + if (!f + || f->frametype != AST_FRAME_CONTROL + || event != AST_FRAMEHOOK_EVENT_WRITE) { return f; } @@ -561,14 +563,20 @@ static struct ast_frame *native_rtp_framehook(struct ast_channel *chan, ast_channel_unlock(chan); ast_bridge_lock(bridge); if (!native_data->detached) { - if (f->subclass.integer == AST_CONTROL_HOLD) { + switch (f->subclass.integer) { + case AST_CONTROL_HOLD: native_rtp_bridge_stop(bridge, chan); - } else if ((f->subclass.integer == AST_CONTROL_UNHOLD) || - (f->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) { + break; + case AST_CONTROL_UNHOLD: + case AST_CONTROL_UPDATE_RTP_PEER: native_rtp_bridge_start(bridge, chan); + break; + default: + break; } } ast_bridge_unlock(bridge); + ao2_ref(bridge, -1); ast_channel_lock(chan); } |