bridge_native_rtp: Take the bridge type choice of both channels into account.
[asterisk/asterisk.git] / bridges / bridge_native_rtp.c
index 02b094b..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;
 }
 
 /*!
@@ -288,10 +292,16 @@ static struct ast_frame *native_rtp_framehook(struct ast_channel *chan, struct a
        return f;
 }
 
+/*! \brief Callback function which informs upstream if we are consuming a frame of a specific type */
+static int native_rtp_framehook_consume(void *data, enum ast_frame_type type)
+{
+       return (type == AST_FRAME_CONTROL ? 1 : 0);
+}
+
 /*! \brief Internal helper function which checks whether the channels are compatible with our native bridging */
 static int native_rtp_bridge_capable(struct ast_channel *chan)
 {
-       return !ast_channel_has_audio_frame_or_monitor(chan);
+       return !ast_channel_has_hook_requiring_audio(chan);
 }
 
 static int native_rtp_bridge_compatible(struct ast_bridge *bridge)
@@ -392,6 +402,7 @@ static int native_rtp_bridge_framehook_attach(struct ast_bridge_channel *bridge_
        static struct ast_framehook_interface hook = {
                .version = AST_FRAMEHOOK_INTERFACE_VERSION,
                .event_cb = native_rtp_framehook,
+               .consume_cb = native_rtp_framehook_consume,
        };
 
        if (!data) {