diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index d55bdf9f2e2716443a6c89ddceeb3b9dcf80dc1f..b70b210cec8654dccb977eda5bd7d9ede7a0e5b5 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -1601,6 +1601,10 @@ static int handle_topology_request_change(struct ast_sip_session *session, SCOPE_EXIT_RTN_VALUE(res, "RC: %d\n", res); } +/* Forward declarations */ +static int transmit_info_dtmf(void *data); +static struct info_dtmf_data *info_dtmf_data_alloc(struct ast_sip_session *session, char digit, unsigned int duration); + /*! \brief Function called by core to ask the channel to indicate some sort of condition */ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen) { @@ -1621,6 +1625,10 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi .data.ptr = (void *)data, }; char condition_name[256]; + unsigned int duration; + char digit; + struct info_dtmf_data *dtmf_data; + SCOPE_ENTER(3, "%s: Indicated %s\n", ast_channel_name(ast), ast_frame_subclass2str(&f, condition_name, sizeof(condition_name), NULL, 0)); @@ -1680,6 +1688,22 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi } ast_devstate_changed(AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, "PJSIP/%s", ast_sorcery_object_get_id(channel->session->endpoint)); break; + case AST_CONTROL_FLASH: + duration = 300; + digit = '!'; + dtmf_data = info_dtmf_data_alloc(channel->session, digit, duration); + + if (!dtmf_data) { + res = -1; + break; + } + + if (ast_sip_push_task(channel->session->serializer, transmit_info_dtmf, dtmf_data)) { + ast_log(LOG_WARNING, "Error sending FLASH via INFO on channel %s\n", ast_channel_name(ast)); + ao2_ref(dtmf_data, -1); /* dtmf_data can't be null here */ + res = -1; + } + break; case AST_CONTROL_VIDUPDATE: for (i = 0; i < AST_VECTOR_SIZE(&channel->session->active_media_state->sessions); ++i) { media = AST_VECTOR_GET(&channel->session->active_media_state->sessions, i); diff --git a/doc/CHANGES-staging/chan_pjsip_flash.txt b/doc/CHANGES-staging/chan_pjsip_flash.txt new file mode 100644 index 0000000000000000000000000000000000000000..34da79685700ecc28d673e23eedad93a1517699d --- /dev/null +++ b/doc/CHANGES-staging/chan_pjsip_flash.txt @@ -0,0 +1,4 @@ +Subject: chan_pjsip + +Hook flash events can now be sent on a PJSIP channel +if requested to do so.