diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 158dc7b18185fd7a8964f1bd8f0f41f5d827f2f9..fa4b864b1367c0f30f0962785fb18074872e7593 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -14630,7 +14630,7 @@ static void state_notify_build_xml(struct state_notify_data *data, int full, con switch (data->state) { case (AST_EXTENSION_RINGING | AST_EXTENSION_INUSE): - statestring = (sip_cfg.notifyringing) ? "early" : "confirmed"; + statestring = (sip_cfg.notifyringing == NOTIFYRINGING_ENABLED) ? "early" : "confirmed"; local_state = NOTIFY_INUSE; pidfstate = "busy"; pidfnote = "Ringing"; @@ -21120,7 +21120,7 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_ ast_cli(a->fd, " Outbound reg. timeout: %d secs\n", global_reg_timeout); ast_cli(a->fd, " Outbound reg. attempts: %d\n", global_regattempts_max); ast_cli(a->fd, " Outbound reg. retry 403:%d\n", global_reg_retry_403); - ast_cli(a->fd, " Notify ringing state: %s\n", AST_CLI_YESNO(sip_cfg.notifyringing)); + ast_cli(a->fd, " Notify ringing state: %s%s\n", AST_CLI_YESNO(sip_cfg.notifyringing), sip_cfg.notifyringing == NOTIFYRINGING_NOTINUSE ? " (when not in use)" : ""); if (sip_cfg.notifyringing) { ast_cli(a->fd, " Include CID: %s%s\n", AST_CLI_YESNO(sip_cfg.notifycid), @@ -31676,7 +31676,11 @@ static int reload_config(enum channelreloadreason reason) } else if (!strcasecmp(v->name, "directrtpsetup")) { sip_cfg.directrtpsetup = ast_true(v->value); } else if (!strcasecmp(v->name, "notifyringing")) { - sip_cfg.notifyringing = ast_true(v->value); + if (!strcasecmp(v->value, "notinuse")) { + sip_cfg.notifyringing = NOTIFYRINGING_NOTINUSE; + } else { + sip_cfg.notifyringing = ast_true(v->value) ? NOTIFYRINGING_ENABLED : NOTIFYRINGING_DISABLED; + } } else if (!strcasecmp(v->name, "notifyhold")) { sip_cfg.notifyhold = ast_true(v->value); } else if (!strcasecmp(v->name, "notifycid")) { diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index 87b59f661555f74a6aafe5a209201a765c150192..d60f49ecbe9fb1c7901bdb1a7a5a04e743969281 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -211,7 +211,7 @@ #define DEFAULT_ALLOW_EXT_DOM TRUE /*!< Allow external domains */ #define DEFAULT_REALM "asterisk" /*!< Realm for HTTP digest authentication */ #define DEFAULT_DOMAINSASREALM FALSE /*!< Use the domain option to guess the realm for registration and invite requests */ -#define DEFAULT_NOTIFYRINGING TRUE /*!< Notify devicestate system on ringing state */ +#define DEFAULT_NOTIFYRINGING NOTIFYRINGING_ENABLED /*!< Notify devicestate system on ringing state */ #define DEFAULT_NOTIFYCID DISABLED /*!< Include CID with ringing notifications */ #define DEFAULT_PEDANTIC TRUE /*!< Follow SIP standards for dialog matching */ #define DEFAULT_AUTOCREATEPEER AUTOPEERS_DISABLED /*!< Don't create peers automagically */ @@ -622,6 +622,13 @@ enum sipmethod { SIP_PING, /*!< Not supported at all, no standard but still implemented out there */ }; +/*! \brief Setting for the 'notifyringing' option, see sip.conf.sample for details. */ +enum notifyringing_setting { + NOTIFYRINGING_DISABLED = 0, + NOTIFYRINGING_ENABLED = 1, + NOTIFYRINGING_NOTINUSE = 2, +}; + /*! \brief Settings for the 'notifycid' option, see sip.conf.sample for details. */ enum notifycid_setting { DISABLED = 0, diff --git a/configs/samples/sip.conf.sample b/configs/samples/sip.conf.sample index 0fc5af2ea6354e99b92f9421aabf9d0da45c12da..fe685141af634ec893d0a4eae13811adb919aaec 100644 --- a/configs/samples/sip.conf.sample +++ b/configs/samples/sip.conf.sample @@ -694,8 +694,12 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ;subscribecontext = default ; Set a specific context for SUBSCRIBE requests ; Useful to limit subscriptions to local extensions ; Settable per peer/user also -;notifyringing = no ; Control whether subscriptions already INUSE get sent - ; RINGING when another call is sent (default: yes) +;notifyringing = no ; Control when subscriptions get notified of ringing state. + ; Specify 'no' to not send any ringing notifications. + ; Specify 'yes' to always send ringing notifications (default). + ; Specify 'notinuse' to only send ringing notifications for + ; extensions that are not currently in use. This is useful as a + ; visual indication of who is available to pick up an incoming call ;notifyhold = yes ; Notify subscriptions on HOLD state (default: no) ; Turning on notifyringing and notifyhold will add a lot ; more database transactions if you are using realtime.