From 33dce1a621e3fbd0dbe25ecad30b3ee90fd821e2 Mon Sep 17 00:00:00 2001 From: Georgiewskiy Yuriy Date: Sat, 12 Dec 2009 14:39:44 +0000 Subject: [PATCH] fix slow start handling git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15935 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_h323/changes.txt | 1 + src/mod/endpoints/mod_h323/mod_h323.cpp | 54 ++++++++++++++++++++----- src/mod/endpoints/mod_h323/mod_h323.h | 2 + 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/mod/endpoints/mod_h323/changes.txt b/src/mod/endpoints/mod_h323/changes.txt index 1fcb58f055..4a016a696d 100644 --- a/src/mod/endpoints/mod_h323/changes.txt +++ b/src/mod/endpoints/mod_h323/changes.txt @@ -1,3 +1,4 @@ +fix slow start handling move faststart to callproceeding due to some broken hardware not anderstand correclty faststart in progress. fix rtp timer initialisation. diff --git a/src/mod/endpoints/mod_h323/mod_h323.cpp b/src/mod/endpoints/mod_h323/mod_h323.cpp index f18b8be141..e1069a1334 100644 --- a/src/mod/endpoints/mod_h323/mod_h323.cpp +++ b/src/mod/endpoints/mod_h323/mod_h323.cpp @@ -1,5 +1,5 @@ /* - Version 0.0.17 + Version 0.0.18 */ #include "mod_h323.h" @@ -786,8 +786,23 @@ bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU){ H323SignalPDU callProceedingPDU; H225_CallProceeding_UUIE & callProceeding = callProceedingPDU.BuildCallProceeding(*this); - if (SendFastStartAcknowledge(callProceeding.m_fastStart)) + if (SendFastStartAcknowledge(callProceeding.m_fastStart)){ callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_fastStart); + } else { + PTRACE(2, "H323\tSendFastStartAcknowledge = FALSE "); + if (connectionState == ShuttingDownConnection){ + return true; + } + earlyStart = TRUE; + if (!h245Tunneling && (controlChannel == NULL)) { + if (!StartControlChannel()){ + return true; + } + callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_h245Address); + controlChannel->SetUpTransportPDU(callProceeding.m_h245Address, TRUE); + } + } + if (!WriteSignalPDU(callProceedingPDU)) return false; @@ -984,6 +999,8 @@ switch_status_t FSH323Connection::kill_channel(int sig){ break; case SWITCH_SIG_KILL: default: + m_rxAudioOpened.Signal(); + m_txAudioOpened.Signal(); if (switch_rtp_ready(tech_pvt->rtp_session)) { switch_rtp_kill_socket(tech_pvt->rtp_session); } @@ -1038,37 +1055,48 @@ switch_status_t FSH323Connection::receive_message(switch_core_session_message_t } switch (msg->message_id) { - case SWITCH_MESSAGE_INDICATE_RINGING:{ + case SWITCH_MESSAGE_INDICATE_RINGING: { AnsweringCall(AnswerCallPending); break; } - case SWITCH_MESSAGE_INDICATE_DEFLECT:{ + case SWITCH_MESSAGE_INDICATE_DEFLECT: { break; } - case SWITCH_MESSAGE_INDICATE_PROGRESS:{ + case SWITCH_MESSAGE_INDICATE_PROGRESS: { AnsweringCall(AnswerCallPending); AnsweringCall(AnswerCallDeferredWithMedia); - if (m_txChennel && m_rxChennel) + if (m_txChennel && m_rxChennel){ if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { switch_channel_mark_pre_answered(m_fsChannel); } - else m_callOnPreAnswer = true; + } else { + m_callOnPreAnswer = true; + if (fastStartState == FastStartDisabled){ + m_txAudioOpened.Wait(); + } + } break; } - case SWITCH_MESSAGE_INDICATE_ANSWER:{ + case SWITCH_MESSAGE_INDICATE_ANSWER: { if (switch_channel_test_flag(channel, CF_OUTBOUND)) { return SWITCH_STATUS_FALSE; } AnsweringCall(H323Connection::AnswerCallNow); PTRACE(4, "mod_h323\tMedia started on connection " << *this); - if (m_txChennel && m_rxChennel) + if (m_txChennel && m_rxChennel){ if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { PTRACE(4, "mod_h323\t-------------------->switch_channel_mark_answered(m_fsChannel) " << *this); switch_channel_mark_answered(m_fsChannel); } - else m_ChennelAnswer = true; + } else{ + m_ChennelAnswer = true; + if (fastStartState == FastStartDisabled){ + m_txAudioOpened.Wait(); + m_rxAudioOpened.Wait(); + } + } break; } default:{ @@ -1393,7 +1421,7 @@ PBoolean FSH323_ExternalRTPChannel::Start(){ PTRACE(4, "mod_h323\t------------------->samples_per_packet = "<implementation->samples_per_packet); PTRACE(4, "mod_h323\t------------------->actual_samples_per_second = "<implementation->actual_samples_per_second); - if ((!m_conn->m_startRTP)&&(GetDirection() == IsReceiver)) { + if ((!m_conn->m_startRTP)) { flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_DATAWAIT|SWITCH_RTP_FLAG_AUTO_CNG|SWITCH_RTP_FLAG_RAW_WRITE); PTRACE(4, "mod_h323\t------------------->timer_name = "<External RTP address "<h323_mutex); + + if (GetDirection() == IsReceiver) m_conn->m_rxAudioOpened.Signal(); + else m_conn->m_txAudioOpened.Signal(); + if ( m_conn->m_ChennelAnswer && m_conn->m_rxChennel && m_conn->m_txChennel) switch_channel_mark_answered(m_fsChannel); diff --git a/src/mod/endpoints/mod_h323/mod_h323.h b/src/mod/endpoints/mod_h323/mod_h323.h index 2e0cbe8035..3941fcc8b0 100644 --- a/src/mod/endpoints/mod_h323/mod_h323.h +++ b/src/mod/endpoints/mod_h323/mod_h323.h @@ -261,6 +261,8 @@ class FSH323Connection:public H323Connection { bool m_txChennel; bool m_ChennelAnswer; bool m_ChennelProgress; + PSyncPoint m_rxAudioOpened; + PSyncPoint m_txAudioOpened; protected: FSH323EndPoint * m_endpoint; PString m_remoteAddr;