]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix mistake from earlier commit and improve flow of dtmf through a bridge when timer...
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 10 Mar 2011 02:06:27 +0000 (20:06 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 10 Mar 2011 02:06:32 +0000 (20:06 -0600)
src/mod/endpoints/mod_sofia/mod_sofia.c
src/switch_ivr_bridge.c
src/switch_rtp.c

index ebf51b9c39cf45f686f2e4888a1e7463152b52fd..3bc5cc223107e7a5d9630b01388346ff7630a99f 100644 (file)
@@ -1480,7 +1480,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
 
                                if (ok) {
                                        switch_rtp_clear_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
-                                       switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
+                                       switch_rtp_clear_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
                                        sofia_set_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
                                }
 
@@ -1528,7 +1528,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                        
                        if (sofia_test_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE)) {
                                switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
-                               switch_rtp_clear_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
+                               switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
                                sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
                        }
 
index 88c72bf1b89e88603d90698a51245cafe5230f8e..dbe3b811fec7f06d28e9bfe73be3af9ba147219a 100644 (file)
@@ -386,6 +386,7 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
 
                                if (send_dtmf) {
                                        switch_core_session_send_dtmf(session_b, &dtmf);
+                                       switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
                                }
                        }
                }
index 6b8c6b0dc6f2bc74e34f1db87e1a191922e76222..e81812a463f8dcb7d53ec5286ed5f5f0813e22b2 100644 (file)
@@ -267,6 +267,8 @@ typedef enum {
        RESULT_GOTO_TIMERCHECK
 } handle_rfc2833_result_t;
 
+static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session);
+
 static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_size_t bytes, int *do_cng)
 {
 #ifdef DEBUG_2833
@@ -2209,6 +2211,7 @@ static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session)
 
        if (rtp_session->dtmf_data.out_digit_dur > 0) {
                int x, loops = 1;
+
                rtp_session->dtmf_data.out_digit_sofar += samples;
                rtp_session->dtmf_data.out_digit_sub_sofar += samples;
 
@@ -2737,7 +2740,10 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER) && rtp_session->read_pollfd) {
                        int pt = poll_sec * 1000000;
 
-                       if (rtp_session->dtmf_data.out_digit_dur > 0 || rtp_session->dtmf_data.in_digit_sanity) {
+                       do_2833(rtp_session, session);
+
+                       if (rtp_session->dtmf_data.out_digit_dur > 0 || rtp_session->dtmf_data.in_digit_sanity || rtp_session->sending_dtmf || 
+                               switch_queue_size(rtp_session->dtmf_data.dtmf_queue) || switch_queue_size(rtp_session->dtmf_data.dtmf_inqueue)) {
                                pt = 20000;
                        }
                        
@@ -2746,7 +2752,6 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                        }
 
                        poll_status = switch_poll(rtp_session->read_pollfd, 1, &fdr, pt);
-                       do_2833(rtp_session, session);
 
                        if (rtp_session->dtmf_data.out_digit_dur > 0) {
                                return_cng_frame();