Author: anthm Date: Mon Feb 12 21:32:10 2007 New Revision: 4221 Modified: freeswitch/trunk/src/include/switch_channel.h freeswitch/trunk/src/include/switch_types.h freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/trunk/src/switch_channel.c freeswitch/trunk/src/switch_ivr.c Log: add ring ready flag to core Modified: freeswitch/trunk/src/include/switch_channel.h ============================================================================== --- freeswitch/trunk/src/include/switch_channel.h (original) +++ freeswitch/trunk/src/include/switch_channel.h Mon Feb 12 21:32:10 2007 @@ -331,6 +331,13 @@ #define switch_channel_pre_answer(channel) switch_channel_perform_pre_answer(channel, __FILE__, __SWITCH_FUNC__, __LINE__) /*! + \brief Indicate a channel is ready to provide ringback + \param channel channel + \return SWITCH_STATUS_SUCCESS +*/ +#define switch_channel_mark_ring_ready(channel) switch_channel_perform_mark_ring_ready(channel, __FILE__, __SWITCH_FUNC__, __LINE__) + +/*! \brief add a state handler table to a given channel \param channel channel on which to add the state handler table \param state_handler table of state handler functions Modified: freeswitch/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/trunk/src/include/switch_types.h (original) +++ freeswitch/trunk/src/include/switch_types.h Mon Feb 12 21:32:10 2007 @@ -487,6 +487,7 @@ CF_EVENT_PARSE = (1 << 15) - Suspend control events CF_NO_INDICATE = (1 << 16) - Disable Indications CF_REPEAT_STATE = (1 << 17) - Tell the state machine to repeat a state +CF_RING_READY = (1 << 18) - Channel is ready to send ringback </pre> */ @@ -508,7 +509,8 @@ CF_SUSPEND = (1 << 14), CF_EVENT_PARSE = (1 << 15), CF_NO_INDICATE = (1 << 16), - CF_REPEAT_STATE = (1 << 17) + CF_REPEAT_STATE = (1 << 17), + CF_RING_READY = (1 << 18) } switch_channel_flag_t; Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Mon Feb 12 21:32:10 2007 @@ -2811,6 +2811,7 @@ case nua_callstate_proceeding: if (channel) { if (status == 180 && !(switch_channel_test_flag(channel, CF_NO_INDICATE))) { + switch_channel_mark_ring_ready(channel); if (switch_test_flag(tech_pvt, TFLAG_NOMEDIA)) { if ((uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) { switch_core_session_message_t msg; Modified: freeswitch/trunk/src/switch_channel.c ============================================================================== --- freeswitch/trunk/src/switch_channel.c (original) +++ freeswitch/trunk/src/switch_channel.c Mon Feb 12 21:32:10 2007 @@ -978,13 +978,32 @@ return channel->state; } + +SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready(switch_channel_t *channel, + const char *file, + const char *func, + int line) +{ + if (!switch_channel_test_flag(channel, CF_RING_READY)) { + switch_log_printf(SWITCH_CHANNEL_ID_LOG, (char *) file, func, line, SWITCH_LOG_NOTICE, "Ring-Ready %s!\n", channel->name); + switch_channel_set_flag(channel, CF_RING_READY); + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; +} + + + SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_channel_t *channel, - const char *file, - const char *func, - int line) + const char *file, + const char *func, + int line) { switch_event_t *event; + switch_channel_mark_ring_ready(channel); + if (!switch_channel_test_flag(channel, CF_EARLY_MEDIA)) { char *uuid; switch_core_session_t *other_session; Modified: freeswitch/trunk/src/switch_ivr.c ============================================================================== --- freeswitch/trunk/src/switch_ivr.c (original) +++ freeswitch/trunk/src/switch_ivr.c Mon Feb 12 21:32:10 2007 @@ -2789,7 +2789,7 @@ write_frame.datalen = read_codec->implementation->bytes_per_frame; write_frame.samples = write_frame.datalen / 2; memset(write_frame.data, 255, write_frame.datalen); - + if (ringback_data) { char *tmp_data = NULL; @@ -2882,7 +2882,8 @@ break; } - if (read_frame && !pass && !switch_test_flag(read_frame, SFF_CNG) && read_frame->datalen > 1) { + if (switch_channel_test_flag(caller_channel, CF_RING_READY) && + read_frame && !pass && !switch_test_flag(read_frame, SFF_CNG) && read_frame->datalen > 1) { if (ringback.fh) { uint8_t abuf[1024]; switch_size_t mlen, olen;