switch_frame_t read_frame;
int16_t *null_buf;
int rate;
- int pre_answer; // pre answer the channel
- int auto_answer; // answer after in ms
+ /* pre answer the channel */
+ int pre_answer;
+ /* enable_auto_answer (enabled by default) */
+ int enable_auto_answer;
+ /* auto_answer_delay (0 ms by default) */
+ int auto_answer_delay;
};
typedef struct null_private_object null_private_t;
switch_channel_mark_pre_answered(channel);
}
- if (tech_pvt->auto_answer > 0) {
- int sanity = tech_pvt->auto_answer;
+ if (tech_pvt->enable_auto_answer) {
+ switch_time_t start_time = switch_time_now();
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "CHANNEL CONSUME_MEDIA - answering in %d ms\n", tech_pvt->auto_answer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "CHANNEL CONSUME_MEDIA - answering in %d ms\n", tech_pvt->auto_answer_delay);
- while(switch_channel_ready(channel) && sanity > 0) {
- switch_yield(1000 * 1000);
- sanity -= 1000;
+ if (tech_pvt->auto_answer_delay > 0) {
+ while (switch_channel_ready(channel) && ((int)((switch_time_now() - start_time) / 1000)) < tech_pvt->auto_answer_delay) {
+ switch_yield(1000 * 20);
+ }
}
switch_channel_mark_answered(channel);
{
char name[128];
switch_channel_t *ochannel = NULL;
- const char *auto_answer = switch_event_get_header(var_event, "null_auto_answer");
+ const char *enable_auto_answer = switch_event_get_header(var_event, "null_enable_auto_answer");
+ const char *auto_answer_delay = switch_event_get_header(var_event, "null_auto_answer_delay");
const char *pre_answer = switch_event_get_header(var_event, "null_pre_answer");
const char *hangup_cause = switch_event_get_header(var_event, "null_hangup_cause");
tech_pvt->pre_answer = switch_true(pre_answer);
- if (auto_answer) {
- tech_pvt->auto_answer = atoi(auto_answer);
+ if (!enable_auto_answer) {
+ /* if not set - enabled by default */
+ tech_pvt->enable_auto_answer = SWITCH_TRUE;
+ } else {
+ tech_pvt->enable_auto_answer = switch_true(enable_auto_answer);
+ }
- if (tech_pvt->auto_answer < 0) tech_pvt->auto_answer = 0;
- if (tech_pvt->auto_answer > 60000) tech_pvt->auto_answer = 60000;
+ if (!auto_answer_delay) {
+ /* if not set - 0 ms by default */
+ tech_pvt->auto_answer_delay = 0;
} else {
- tech_pvt->auto_answer = 1;
+ tech_pvt->auto_answer_delay = atoi(auto_answer_delay);
+
+ if (tech_pvt->auto_answer_delay < 0) tech_pvt->auto_answer_delay = 0;
+ if (tech_pvt->auto_answer_delay > 60000) tech_pvt->auto_answer_delay = 60000;
}
channel = switch_core_session_get_channel(*new_session);
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://1000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
- switch_dial_handle_add_global_var(dh, "null_auto_answer", "2000");
+ switch_dial_handle_add_global_var(dh, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_global_var(dh, "null_auto_answer_delay", "2000");
status = switch_ivr_originate(NULL, &session, &cause, NULL, 0, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, dh);
fst_requires(status == SWITCH_STATUS_SUCCESS);
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://1000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
- switch_dial_handle_add_global_var(dh, "null_auto_answer", "2000");
+ switch_dial_handle_add_global_var(dh, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_global_var(dh, "null_auto_answer_delay", "2000");
switch_dial_handle_add_global_var(dh, "null_pre_answer", "true");
status = switch_ivr_originate(NULL, &session, &cause, NULL, 0, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, dh);
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://1000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
- switch_dial_handle_add_global_var(dh, "null_auto_answer", "2000");
+ switch_dial_handle_add_global_var(dh, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_global_var(dh, "null_auto_answer_delay", "2000");
switch_dial_handle_add_global_var(dh, "null_pre_answer", "true");
switch_dial_handle_add_global_var(dh, "group_confirm_early_ok", "false");
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://1000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
- switch_dial_handle_add_global_var(dh, "null_auto_answer", "2000");
+ switch_dial_handle_add_global_var(dh, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_global_var(dh, "null_auto_answer_delay", "2000");
switch_dial_handle_add_global_var(dh, "null_pre_answer", "true");
switch_dial_handle_add_global_var(dh, "ignore_early_media", "true");
switch_dial_handle_add_leg_list(dh, &ll);
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
- switch_dial_handle_add_leg_var(leg, "null_auto_answer", "2000");
+ switch_dial_handle_add_leg_var(leg, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_leg_var(leg, "null_auto_answer_delay", "2000");
switch_dial_handle_add_leg_var(leg, "leg_timeout", "4");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://6000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
switch_dial_handle_add_leg_list(dh, &ll);
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
- switch_dial_handle_add_leg_var(leg, "null_auto_answer", "2000");
+ switch_dial_handle_add_leg_var(leg, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_leg_var(leg, "null_auto_answer_delay", "2000");
switch_dial_handle_add_leg_var(leg, "leg_timeout", "6");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://2000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "leg_timeout", "15");
- switch_dial_handle_add_leg_var(leg, "null_auto_answer", "2000");
+ switch_dial_handle_add_leg_var(leg, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_leg_var(leg, "null_auto_answer_delay", "2000");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://10000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
switch_dial_handle_add_leg_var(leg, "group_confirm_timeout", "3");
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "leg_timeout", "15");
- switch_dial_handle_add_leg_var(leg, "null_auto_answer", "2000");
+ switch_dial_handle_add_leg_var(leg, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_leg_var(leg, "null_auto_answer_delay", "2000");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://10000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
switch_dial_handle_add_global_var(dh, "group_confirm_timeout", "3");
switch_dial_leg_list_add_leg(ll, &leg, "null/test");
switch_dial_handle_add_leg_var(leg, "leg_timeout", "3");
- switch_dial_handle_add_leg_var(leg, "null_auto_answer", "2000");
+ switch_dial_handle_add_leg_var(leg, "null_enable_auto_answer", "1");
+ switch_dial_handle_add_leg_var(leg, "null_auto_answer_delay", "2000");
switch_dial_handle_add_leg_var(leg, "group_confirm_file", "playback silence_stream://2000");
switch_dial_handle_add_leg_var(leg, "group_confirm_key", "exec");
switch_dial_handle_add_global_var(dh, "group_confirm_cancel_timeout", "true");