add ring ready flag to core

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4221 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2007-02-13 02:32:10 +00:00
parent db5557983a
commit 07efd559d2
5 changed files with 36 additions and 6 deletions

View File

@ -330,6 +330,13 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_
*/
#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

View File

@ -487,6 +487,7 @@ CF_SUSPEND = (1 << 14) - Suspend i/o
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 @@ typedef enum {
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;

View File

@ -2811,6 +2811,7 @@ static void sip_i_state(int status,
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;

View File

@ -978,13 +978,32 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan
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;

View File

@ -2789,7 +2789,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
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;