Author: anthm Date: Thu Sep 4 14:29:43 2008 New Revision: 9449 Modified: freeswitch/trunk/src/switch_ivr_bridge.c freeswitch/trunk/src/switch_ivr_originate.c Log: fix bridge app to make sure both channels are ready for media when one is only in ringing state Modified: freeswitch/trunk/src/switch_ivr_bridge.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_bridge.c (original) +++ freeswitch/trunk/src/switch_ivr_bridge.c Thu Sep 4 14:29:43 2008 @@ -723,7 +723,8 @@ switch_channel_set_variable(caller_channel, SWITCH_BRIDGE_VARIABLE, switch_core_session_get_uuid(peer_session)); switch_channel_set_variable(peer_channel, SWITCH_BRIDGE_VARIABLE, switch_core_session_get_uuid(session)); - if (!(switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA))) { + if (!switch_channel_media_ready(caller_channel) || + !(switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA))) { if ((status = switch_ivr_wait_for_answer(session, peer_session)) != SWITCH_STATUS_SUCCESS) { switch_channel_state_t w_state = switch_channel_get_state(caller_channel); switch_channel_hangup(peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT); Modified: freeswitch/trunk/src/switch_ivr_originate.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_originate.c (original) +++ freeswitch/trunk/src/switch_ivr_originate.c Thu Sep 4 14:29:43 2008 @@ -395,6 +395,7 @@ goto done; } + if (switch_core_session_dequeue_message(peer_session, &message) == SWITCH_STATUS_SUCCESS) { if (switch_test_flag(message, SCSMF_DYNAMIC)) { switch_safe_free(message); @@ -402,17 +403,21 @@ message = NULL; } } - status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - if (!SWITCH_READ_ACCEPTABLE(status)) { - break; - } + if (switch_channel_media_ready(caller_channel)) { + status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); + if (!SWITCH_READ_ACCEPTABLE(status)) { + break; + } + } else { + read_frame = NULL; + } if (read_frame && !pass) { if (ringback.fh) { switch_size_t mlen, olen; unsigned int pos = 0; - + if (ringback.asis) { mlen = write_frame.codec->implementation->encoded_bytes_per_frame; } else { @@ -443,8 +448,10 @@ } } - if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - break; + if ((ringback.fh || ringback.audio_buffer) && write_frame.codec && write_frame.datalen) { + if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { + break; + } } } else { switch_yield(1000); @@ -1202,10 +1209,16 @@ (ringback_data || (switch_channel_test_flag(caller_channel, CF_ANSWERED) || switch_channel_test_flag(caller_channel, CF_EARLY_MEDIA)))) { - switch_status_t tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); + switch_status_t tstatus = SWITCH_STATUS_SUCCESS; - if (!SWITCH_READ_ACCEPTABLE(tstatus)) { - break; + if (switch_channel_media_ready(caller_channel)) { + tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); + + if (!SWITCH_READ_ACCEPTABLE(tstatus)) { + break; + } + } else { + read_frame = NULL; } if (ring_ready && read_frame && !pass) {