mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 11:58:52 +00:00
Merge "channel/chan_pjsip: add dialplan function for music on hold" into 13
This commit is contained in:
@@ -1536,7 +1536,7 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
|
||||
device_buf = alloca(device_buf_size);
|
||||
ast_channel_get_device_name(ast, device_buf, device_buf_size);
|
||||
ast_devstate_changed_literal(AST_DEVICE_ONHOLD, 1, device_buf);
|
||||
if (!channel->session->endpoint->moh_passthrough) {
|
||||
if (!channel->session->moh_passthrough) {
|
||||
ast_moh_start(ast, data, NULL);
|
||||
} else {
|
||||
if (ast_sip_push_task(channel->session->serializer, remote_send_hold, ao2_bump(channel->session))) {
|
||||
@@ -1552,7 +1552,7 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
|
||||
device_buf = alloca(device_buf_size);
|
||||
ast_channel_get_device_name(ast, device_buf, device_buf_size);
|
||||
ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, 1, device_buf);
|
||||
if (!channel->session->endpoint->moh_passthrough) {
|
||||
if (!channel->session->moh_passthrough) {
|
||||
ast_moh_stop(ast);
|
||||
} else {
|
||||
if (ast_sip_push_task(channel->session->serializer, remote_send_unhold, ao2_bump(channel->session))) {
|
||||
@@ -2869,6 +2869,12 @@ static struct ast_custom_function dtmf_mode_function = {
|
||||
.write = pjsip_acf_dtmf_mode_write
|
||||
};
|
||||
|
||||
static struct ast_custom_function moh_passthrough_function = {
|
||||
.name = "PJSIP_MOH_PASSTHROUGH",
|
||||
.read = pjsip_acf_moh_passthrough_read,
|
||||
.write = pjsip_acf_moh_passthrough_write
|
||||
};
|
||||
|
||||
static struct ast_custom_function session_refresh_function = {
|
||||
.name = "PJSIP_SEND_SESSION_REFRESH",
|
||||
.write = pjsip_acf_session_refresh_write,
|
||||
@@ -2923,6 +2929,11 @@ static int load_module(void)
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (ast_custom_function_register(&moh_passthrough_function)) {
|
||||
ast_log(LOG_WARNING, "Unable to register PJSIP_MOH_PASSTHROUGH dialplan function\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (ast_custom_function_register(&session_refresh_function)) {
|
||||
ast_log(LOG_WARNING, "Unable to register PJSIP_SEND_SESSION_REFRESH dialplan function\n");
|
||||
goto end;
|
||||
@@ -2983,6 +2994,7 @@ end:
|
||||
ast_sip_session_unregister_supplement(&chan_pjsip_supplement);
|
||||
ast_sip_session_unregister_supplement(&call_pickup_supplement);
|
||||
ast_custom_function_unregister(&dtmf_mode_function);
|
||||
ast_custom_function_unregister(&moh_passthrough_function);
|
||||
ast_custom_function_unregister(&media_offer_function);
|
||||
ast_custom_function_unregister(&chan_pjsip_dial_contacts_function);
|
||||
ast_custom_function_unregister(&chan_pjsip_parse_uri_function);
|
||||
@@ -3008,6 +3020,7 @@ static int unload_module(void)
|
||||
ast_sip_session_unregister_supplement(&call_pickup_supplement);
|
||||
|
||||
ast_custom_function_unregister(&dtmf_mode_function);
|
||||
ast_custom_function_unregister(&moh_passthrough_function);
|
||||
ast_custom_function_unregister(&media_offer_function);
|
||||
ast_custom_function_unregister(&chan_pjsip_dial_contacts_function);
|
||||
ast_custom_function_unregister(&chan_pjsip_parse_uri_function);
|
||||
|
@@ -80,6 +80,19 @@
|
||||
<para>This function uses the same DTMF mode naming as the dtmf_mode configuration option</para>
|
||||
</description>
|
||||
</function>
|
||||
<function name="PJSIP_MOH_PASSTHROUGH" language="en_US">
|
||||
<synopsis>
|
||||
Get or change the on-hold behavior for a SIP call.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
</syntax>
|
||||
<description>
|
||||
<para>When read, returns the current moh passthrough mode</para>
|
||||
<para>When written, sets the current moh passthrough mode</para>
|
||||
<para>If <replaceable>yes</replaceable>, on-hold re-INVITEs are sent. If <replaceable>no</replaceable>, music on hold is generated.</para>
|
||||
<para>This function can be used to override the moh_passthrough configuration option</para>
|
||||
</description>
|
||||
</function>
|
||||
<function name="PJSIP_SEND_SESSION_REFRESH" language="en_US">
|
||||
<synopsis>
|
||||
W/O: Initiate a session refresh via an UPDATE or re-INVITE on an established media session
|
||||
@@ -1303,6 +1316,34 @@ int pjsip_acf_dtmf_mode_read(struct ast_channel *chan, const char *cmd, char *da
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pjsip_acf_moh_passthrough_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
struct ast_sip_channel_pvt *channel;
|
||||
|
||||
if (!chan) {
|
||||
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (len < 3) {
|
||||
ast_log(LOG_WARNING, "%s: buffer too small\n", cmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ast_channel_lock(chan);
|
||||
if (strcmp(ast_channel_tech(chan)->type, "PJSIP")) {
|
||||
ast_log(LOG_WARNING, "Cannot call %s on a non-PJSIP channel\n", cmd);
|
||||
ast_channel_unlock(chan);
|
||||
return -1;
|
||||
}
|
||||
|
||||
channel = ast_channel_tech_pvt(chan);
|
||||
strncpy(buf, AST_YESNO(channel->session->moh_passthrough), len);
|
||||
|
||||
ast_channel_unlock(chan);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct refresh_data {
|
||||
struct ast_sip_session *session;
|
||||
enum ast_sip_session_refresh_method method;
|
||||
@@ -1445,6 +1486,30 @@ int pjsip_acf_dtmf_mode_write(struct ast_channel *chan, const char *cmd, char *d
|
||||
return ast_sip_push_task_wait_serializer(channel->session->serializer, dtmf_mode_refresh_cb, &rdata);
|
||||
}
|
||||
|
||||
int pjsip_acf_moh_passthrough_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
|
||||
{
|
||||
struct ast_sip_channel_pvt *channel;
|
||||
|
||||
if (!chan) {
|
||||
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ast_channel_lock(chan);
|
||||
if (strcmp(ast_channel_tech(chan)->type, "PJSIP")) {
|
||||
ast_log(LOG_WARNING, "Cannot call %s on a non-PJSIP channel\n", cmd);
|
||||
ast_channel_unlock(chan);
|
||||
return -1;
|
||||
}
|
||||
|
||||
channel = ast_channel_tech_pvt(chan);
|
||||
channel->session->moh_passthrough = ast_true(value);
|
||||
|
||||
ast_channel_unlock(chan);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int refresh_write_cb(void *obj)
|
||||
{
|
||||
struct refresh_data *data = obj;
|
||||
|
@@ -72,6 +72,31 @@ int pjsip_acf_dtmf_mode_read(struct ast_channel *chan, const char *cmd, char *da
|
||||
*/
|
||||
int pjsip_acf_dtmf_mode_write(struct ast_channel *chan, const char *cmd, char *data, const char *value);
|
||||
|
||||
/*!
|
||||
* \brief PJSIP_MOH_PASSTHROUGH function read callback
|
||||
* \param chan The channel the function is called on
|
||||
* \param cmd The name of the function
|
||||
* \param data Arguments passed to the function
|
||||
* \param buf Out buffer that should be populated with the data
|
||||
* \param len Size of the buffer
|
||||
*
|
||||
* \retval 0 on success
|
||||
* \retval -1 on failure
|
||||
*/
|
||||
int pjsip_acf_moh_passthrough_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len);
|
||||
|
||||
/*!
|
||||
* \brief PJSIP_MOH_PASSTHROUGH function write callback
|
||||
* \param chan The channel the function is called on
|
||||
* \param cmd The name of the function
|
||||
* \param data Arguments passed to the function
|
||||
* \param value Value to be set by the function
|
||||
*
|
||||
* \retval 0 on success
|
||||
* \retval -1 on failure
|
||||
*/
|
||||
int pjsip_acf_moh_passthrough_write(struct ast_channel *chan, const char *cmd, char *data, const char *value);
|
||||
|
||||
/*!
|
||||
* \brief PJSIP_MEDIA_OFFER function read callback
|
||||
* \param chan The channel the function is called on
|
||||
|
Reference in New Issue
Block a user