diff options
-rw-r--r-- | apps/app_disa.c | 6 | ||||
-rw-r--r-- | apps/app_playback.c | 6 | ||||
-rw-r--r-- | channels/chan_sip.c | 14 | ||||
-rw-r--r-- | configs/sip.conf.sample | 7 | ||||
-rw-r--r-- | main/pbx.c | 2 |
5 files changed, 30 insertions, 5 deletions
diff --git a/apps/app_disa.c b/apps/app_disa.c index bc2970f43..db09c9edb 100644 --- a/apps/app_disa.c +++ b/apps/app_disa.c @@ -187,8 +187,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 c32fccc1e..5e65f3a32 100644 --- a/apps/app_playback.c +++ b/apps/app_playback.c @@ -449,9 +449,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 f65d8b76f..b598e2c5f 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1080,6 +1080,8 @@ static struct sip_settings sip_cfg; 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 */ @@ -5999,9 +6001,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); @@ -15579,6 +15583,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"); @@ -23723,6 +23728,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(sip_cfg.realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(sip_cfg.realm)); ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid)); @@ -23908,6 +23914,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 0dbc53612..a77745f0c 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -209,6 +209,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 824788f88..55dc233e3 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -8810,6 +8810,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) { |