bridge_native_rtp: Take the bridge type choice of both channels into account.
[asterisk/asterisk.git] / bridges / bridge_native_rtp.c
index aa5299c..2be2dbf 100644 (file)
@@ -103,13 +103,17 @@ static enum ast_rtp_glue_result native_rtp_bridge_get(struct ast_channel *c0, st
                audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
        }
 
-       /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
-       if (audio_glue0_res == AST_RTP_GLUE_RESULT_FORBID
-               || audio_glue1_res == AST_RTP_GLUE_RESULT_FORBID) {
+       /* The order of preference is: forbid, local, and remote. */
+       if (audio_glue0_res == AST_RTP_GLUE_RESULT_FORBID ||
+               audio_glue1_res == AST_RTP_GLUE_RESULT_FORBID) {
+               /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
                return AST_RTP_GLUE_RESULT_FORBID;
+       } else if (audio_glue0_res == AST_RTP_GLUE_RESULT_LOCAL ||
+               audio_glue1_res == AST_RTP_GLUE_RESULT_LOCAL) {
+               return AST_RTP_GLUE_RESULT_LOCAL;
+       } else {
+               return AST_RTP_GLUE_RESULT_REMOTE;
        }
-
-       return audio_glue0_res;
 }
 
 /*!
@@ -230,10 +234,8 @@ static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel
                break;
        case AST_RTP_GLUE_RESULT_REMOTE:
                if (!target) {
-                       if (ast_channel_is_leaving_bridge(c0->chan)) {
-                               glue0->update_peer(c0->chan, NULL, NULL, NULL, NULL, 0);
-                       }
-                       if (glue1 && ast_channel_is_leaving_bridge(c1->chan)) {
+                       glue0->update_peer(c0->chan, NULL, NULL, NULL, NULL, 0);
+                       if (glue1) {
                                glue1->update_peer(c1->chan, NULL, NULL, NULL, NULL, 0);
                        }
                } else {
@@ -487,9 +489,8 @@ static void native_rtp_bridge_leave(struct ast_bridge *bridge, struct ast_bridge
        }
 
        /* Direct RTP may have occurred, tear it down */
-       if (ast_channel_is_leaving_bridge(bridge_channel->chan)) {
-               glue->update_peer(bridge_channel->chan, NULL, NULL, NULL, NULL, 0);
-       }
+       glue->update_peer(bridge_channel->chan, NULL, NULL, NULL, NULL, 0);
+
        native_rtp_bridge_stop(bridge, NULL);
 }