diff --git a/apps/app_disa.c b/apps/app_disa.c index 576398b4fb..d93bb1485b 100644 --- a/apps/app_disa.c +++ b/apps/app_disa.c @@ -160,8 +160,12 @@ static int disa_exec(struct ast_channel *chan, void *data) /* answer */ ast_answer(chan); } - } else + } else { special_noanswer = 1; + if (chan->_state != AST_STATE_UP) { + ast_indicate(chan, AST_CONTROL_PROGRESS); + } + } ast_debug(1, "Context: %s\n",args.context); diff --git a/apps/app_playback.c b/apps/app_playback.c index ed40194c97..0be2c2e48f 100644 --- a/apps/app_playback.c +++ b/apps/app_playback.c @@ -426,9 +426,13 @@ static int playback_exec(struct ast_channel *chan, void *data) if (option_skip) { /* At the user's option, skip if the line is not up */ goto done; - } else if (!option_noanswer) + } else if (!option_noanswer) { /* Otherwise answer unless we're supposed to send this while on-hook */ res = ast_answer(chan); + } else { + ast_indicate(chan, AST_CONTROL_PROGRESS); + } + } if (!res) { char *back = args.filenames; diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 9d81ead2f1..e2848bbd17 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -762,6 +762,8 @@ static int pedanticsipchecking; /*!< Extra checking ? Default off */ static int autocreatepeer; /*!< Auto creation of peers at registration? Default off. */ static int global_match_auth_username; /*!< Match auth username if available instead of From: Default off. */ static int global_relaxdtmf; /*!< Relax DTMF */ +static int global_prematuremediafilter; /*!< Enable/disable premature frames in a call (causing 183 early media) */ +static int global_relaxdtmf; /*!< Relax DTMF */ static int global_rtptimeout; /*!< Time out call if no RTP */ static int global_rtpholdtimeout; /*!< Time out call if no RTP during hold */ static int global_rtpkeepalive; /*!< Send RTP keepalives */ @@ -5569,9 +5571,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame) !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) && !ast_test_flag(&p->flags[0], SIP_OUTGOING)) { ast_rtp_new_source(p->rtp); - p->invitestate = INV_EARLY_MEDIA; - transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE); - ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT); + if (!global_prematuremediafilter) { + p->invitestate = INV_EARLY_MEDIA; + transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE); + ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT); + } } else if (p->t38.state == T38_ENABLED) { change_t38_state(p, T38_DISABLED); transmit_reinvite_with_sdp(p, FALSE, FALSE); @@ -14751,6 +14755,7 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_ ast_cli(a->fd, " Timer T1: %d\n", global_t1); ast_cli(a->fd, " Timer T1 minimum: %d\n", global_t1min); ast_cli(a->fd, " Timer B: %d\n", global_timer_b); + ast_cli(a->fd, " No premature media: %s\n", global_prematuremediafilter ? "Yes" : "No"); ast_cli(a->fd, "\nDefault Settings:\n"); ast_cli(a->fd, "-----------------\n"); @@ -22716,6 +22721,7 @@ static int reload_config(enum channelreloadreason reason) snprintf(global_useragent, sizeof(global_useragent), "%s %s", DEFAULT_USERAGENT, ast_get_version()); snprintf(global_sdpsession, sizeof(global_sdpsession), "%s %s", DEFAULT_SDPSESSION, ast_get_version()); snprintf(global_sdpowner, sizeof(global_sdpowner), "%s", DEFAULT_SDPOWNER); + global_prematuremediafilter = TRUE; ast_copy_string(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime)); ast_copy_string(global_realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(global_realm)); ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid)); @@ -22877,6 +22883,8 @@ static int reload_config(enum channelreloadreason reason) ast_set2_flag(&global_flags[1], i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR); } else if (!strcasecmp(v->name, "usereqphone")) { ast_set2_flag(&global_flags[0], ast_true(v->value), SIP_USEREQPHONE); + } else if (!strcasecmp(v->name, "prematuremedia")) { + global_prematuremediafilter = ast_true(v->value); } else if (!strcasecmp(v->name, "relaxdtmf")) { global_relaxdtmf = ast_true(v->value); } else if (!strcasecmp(v->name, "vmexten")) { diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index 7bfcda9875..2b260eb257 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -208,6 +208,13 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ;relaxdtmf=yes ; Relax dtmf handling ;trustrpid = no ; If Remote-Party-ID should be trusted ;sendrpid = yes ; If Remote-Party-ID should be sent +;prematuremedia=no ; Some ISDN links send empty media frames before + ; the call is in ringing or progress state. The SIP + ; channel will then send 183 indicating early media + ; which will be empty - thus users get no ring signal. + ; Setting this to "no" will stop any media before we have + ; call progress. Default is "yes". + ;progressinband=never ; If we should generate in-band ringing always ; use 'never' to never use in-band signalling, even in cases ; where some buggy devices might not render it diff --git a/main/pbx.c b/main/pbx.c index a072c9a415..5fa6cf6ba4 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -8238,6 +8238,8 @@ static int pbx_builtin_background(struct ast_channel *chan, void *data) } else if (!ast_test_flag(&flags, BACKGROUND_NOANSWER)) { res = ast_answer(chan); } + /* Send progress control frame to start early media */ + ast_indicate(chan, AST_CONTROL_PROGRESS); } if (!res) {