fix slow start handling

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15935 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Georgiewskiy Yuriy 2009-12-12 14:39:44 +00:00
parent 7cc4b54e58
commit 33dce1a621
3 changed files with 46 additions and 11 deletions

View File

@ -1,3 +1,4 @@
fix slow start handling
move faststart to callproceeding due to some broken hardware not anderstand move faststart to callproceeding due to some broken hardware not anderstand
correclty faststart in progress. correclty faststart in progress.
fix rtp timer initialisation. fix rtp timer initialisation.

View File

@ -1,5 +1,5 @@
/* /*
Version 0.0.17 Version 0.0.18
*/ */
#include "mod_h323.h" #include "mod_h323.h"
@ -786,8 +786,23 @@ bool FSH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU){
H323SignalPDU callProceedingPDU; H323SignalPDU callProceedingPDU;
H225_CallProceeding_UUIE & callProceeding = callProceedingPDU.BuildCallProceeding(*this); H225_CallProceeding_UUIE & callProceeding = callProceedingPDU.BuildCallProceeding(*this);
if (SendFastStartAcknowledge(callProceeding.m_fastStart)) if (SendFastStartAcknowledge(callProceeding.m_fastStart)){
callProceeding.IncludeOptionalField(H225_CallProceeding_UUIE::e_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)) if (!WriteSignalPDU(callProceedingPDU))
return false; return false;
@ -984,6 +999,8 @@ switch_status_t FSH323Connection::kill_channel(int sig){
break; break;
case SWITCH_SIG_KILL: case SWITCH_SIG_KILL:
default: default:
m_rxAudioOpened.Signal();
m_txAudioOpened.Signal();
if (switch_rtp_ready(tech_pvt->rtp_session)) { if (switch_rtp_ready(tech_pvt->rtp_session)) {
switch_rtp_kill_socket(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) { switch (msg->message_id) {
case SWITCH_MESSAGE_INDICATE_RINGING:{ case SWITCH_MESSAGE_INDICATE_RINGING: {
AnsweringCall(AnswerCallPending); AnsweringCall(AnswerCallPending);
break; break;
} }
case SWITCH_MESSAGE_INDICATE_DEFLECT:{ case SWITCH_MESSAGE_INDICATE_DEFLECT: {
break; break;
} }
case SWITCH_MESSAGE_INDICATE_PROGRESS:{ case SWITCH_MESSAGE_INDICATE_PROGRESS: {
AnsweringCall(AnswerCallPending); AnsweringCall(AnswerCallPending);
AnsweringCall(AnswerCallDeferredWithMedia); AnsweringCall(AnswerCallDeferredWithMedia);
if (m_txChennel && m_rxChennel) if (m_txChennel && m_rxChennel){
if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) {
switch_channel_mark_pre_answered(m_fsChannel); switch_channel_mark_pre_answered(m_fsChannel);
} }
else m_callOnPreAnswer = true; } else {
m_callOnPreAnswer = true;
if (fastStartState == FastStartDisabled){
m_txAudioOpened.Wait();
}
}
break; break;
} }
case SWITCH_MESSAGE_INDICATE_ANSWER:{ case SWITCH_MESSAGE_INDICATE_ANSWER: {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) { if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
} }
AnsweringCall(H323Connection::AnswerCallNow); AnsweringCall(H323Connection::AnswerCallNow);
PTRACE(4, "mod_h323\tMedia started on connection " << *this); 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)) { if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) {
PTRACE(4, "mod_h323\t-------------------->switch_channel_mark_answered(m_fsChannel) " << *this); PTRACE(4, "mod_h323\t-------------------->switch_channel_mark_answered(m_fsChannel) " << *this);
switch_channel_mark_answered(m_fsChannel); switch_channel_mark_answered(m_fsChannel);
} }
else m_ChennelAnswer = true; } else{
m_ChennelAnswer = true;
if (fastStartState == FastStartDisabled){
m_txAudioOpened.Wait();
m_rxAudioOpened.Wait();
}
}
break; break;
} }
default:{ default:{
@ -1393,7 +1421,7 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
PTRACE(4, "mod_h323\t------------------->samples_per_packet = "<<m_switchCodec->implementation->samples_per_packet); PTRACE(4, "mod_h323\t------------------->samples_per_packet = "<<m_switchCodec->implementation->samples_per_packet);
PTRACE(4, "mod_h323\t------------------->actual_samples_per_second = "<<m_switchCodec->implementation->actual_samples_per_second); PTRACE(4, "mod_h323\t------------------->actual_samples_per_second = "<<m_switchCodec->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); 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 = "<<switch_channel_get_variable(m_fsChannel, "timer_name")); PTRACE(4, "mod_h323\t------------------->timer_name = "<<switch_channel_get_variable(m_fsChannel, "timer_name"));
if ((var = switch_channel_get_variable(m_fsChannel, "timer_name"))) { if ((var = switch_channel_get_variable(m_fsChannel, "timer_name"))) {
@ -1425,6 +1453,10 @@ PBoolean FSH323_ExternalRTPChannel::Start(){
PTRACE(4, "mod_h323\t------------->External RTP address "<<m_RTPremoteIP<<":"<<m_RTPremotePort); PTRACE(4, "mod_h323\t------------->External RTP address "<<m_RTPremoteIP<<":"<<m_RTPremotePort);
switch_mutex_unlock(tech_pvt->h323_mutex); switch_mutex_unlock(tech_pvt->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) if ( m_conn->m_ChennelAnswer && m_conn->m_rxChennel && m_conn->m_txChennel)
switch_channel_mark_answered(m_fsChannel); switch_channel_mark_answered(m_fsChannel);

View File

@ -261,6 +261,8 @@ class FSH323Connection:public H323Connection {
bool m_txChennel; bool m_txChennel;
bool m_ChennelAnswer; bool m_ChennelAnswer;
bool m_ChennelProgress; bool m_ChennelProgress;
PSyncPoint m_rxAudioOpened;
PSyncPoint m_txAudioOpened;
protected: protected:
FSH323EndPoint * m_endpoint; FSH323EndPoint * m_endpoint;
PString m_remoteAddr; PString m_remoteAddr;