mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-08 14:17:02 +00:00
Add an option to the dial API for playing music instead of ringing to the caller.
I started this for use with SLA but ended up deciding not to use it. However, there is no reason not to put this part in, anyway. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@61259 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -39,6 +39,7 @@ typedef void (*ast_dial_state_callback)(struct ast_dial *);
|
|||||||
enum ast_dial_option {
|
enum ast_dial_option {
|
||||||
AST_DIAL_OPTION_RINGING, /*!< Always indicate ringing to caller */
|
AST_DIAL_OPTION_RINGING, /*!< Always indicate ringing to caller */
|
||||||
AST_DIAL_OPTION_ANSWER_EXEC, /*!< Execute application upon answer in async mode */
|
AST_DIAL_OPTION_ANSWER_EXEC, /*!< Execute application upon answer in async mode */
|
||||||
|
AST_DIAL_OPTION_MUSIC, /*!< Play music on hold instead of ringing to the calling channel */
|
||||||
AST_DIAL_OPTION_MAX, /*!< End terminator -- must always remain last */
|
AST_DIAL_OPTION_MAX, /*!< End terminator -- must always remain last */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
36
main/dial.c
36
main/dial.c
@@ -43,6 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||||||
#include "asterisk/linkedlists.h"
|
#include "asterisk/linkedlists.h"
|
||||||
#include "asterisk/dial.h"
|
#include "asterisk/dial.h"
|
||||||
#include "asterisk/pbx.h"
|
#include "asterisk/pbx.h"
|
||||||
|
#include "asterisk/musiconhold.h"
|
||||||
|
|
||||||
/*! \brief Main dialing structure. Contains global options, channels being dialed, and more! */
|
/*! \brief Main dialing structure. Contains global options, channels being dialed, and more! */
|
||||||
struct ast_dial {
|
struct ast_dial {
|
||||||
@@ -122,6 +123,21 @@ static int answer_exec_disable(void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *music_enable(void *data)
|
||||||
|
{
|
||||||
|
return ast_strdup(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int music_disable(void *data)
|
||||||
|
{
|
||||||
|
if (!data)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Application execution function for 'ANSWER_EXEC' option */
|
/* Application execution function for 'ANSWER_EXEC' option */
|
||||||
static void answer_exec_run(struct ast_channel *chan, char *app, char *args)
|
static void answer_exec_run(struct ast_channel *chan, char *app, char *args)
|
||||||
{
|
{
|
||||||
@@ -143,9 +159,10 @@ static const struct ast_option_types {
|
|||||||
ast_dial_option_cb_enable enable;
|
ast_dial_option_cb_enable enable;
|
||||||
ast_dial_option_cb_disable disable;
|
ast_dial_option_cb_disable disable;
|
||||||
} option_types[] = {
|
} option_types[] = {
|
||||||
{ AST_DIAL_OPTION_RINGING, NULL, NULL }, /*! Always indicate ringing to caller */
|
{ AST_DIAL_OPTION_RINGING, NULL, NULL }, /*!< Always indicate ringing to caller */
|
||||||
{ AST_DIAL_OPTION_ANSWER_EXEC, answer_exec_enable, answer_exec_disable }, /*! Execute application upon answer in async mode */
|
{ AST_DIAL_OPTION_ANSWER_EXEC, answer_exec_enable, answer_exec_disable }, /*!< Execute application upon answer in async mode */
|
||||||
{ AST_DIAL_OPTION_MAX, NULL, NULL }, /*! Terminator of list */
|
{ AST_DIAL_OPTION_MUSIC, music_enable, music_disable }, /*!< Play music to the caller instead of ringing */
|
||||||
|
{ AST_DIAL_OPTION_MAX, NULL, NULL }, /*!< Terminator of list */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* free the buffer if allocated, and set the pointer to the second arg */
|
/* free the buffer if allocated, and set the pointer to the second arg */
|
||||||
@@ -324,6 +341,7 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel
|
|||||||
case AST_CONTROL_RINGING:
|
case AST_CONTROL_RINGING:
|
||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "%s is ringing\n", channel->owner->name);
|
ast_verbose(VERBOSE_PREFIX_3 "%s is ringing\n", channel->owner->name);
|
||||||
|
if (!dial->options[AST_DIAL_OPTION_MUSIC])
|
||||||
ast_indicate(chan, AST_CONTROL_RINGING);
|
ast_indicate(chan, AST_CONTROL_RINGING);
|
||||||
break;
|
break;
|
||||||
case AST_CONTROL_PROGRESS:
|
case AST_CONTROL_PROGRESS:
|
||||||
@@ -430,6 +448,13 @@ static enum ast_dial_result monitor_dial(struct ast_dial *dial, struct ast_chann
|
|||||||
set_state(dial, AST_DIAL_RESULT_RINGING);
|
set_state(dial, AST_DIAL_RESULT_RINGING);
|
||||||
if (chan)
|
if (chan)
|
||||||
ast_indicate(chan, AST_CONTROL_RINGING);
|
ast_indicate(chan, AST_CONTROL_RINGING);
|
||||||
|
} else if (chan && dial->options[AST_DIAL_OPTION_MUSIC] &&
|
||||||
|
!ast_strlen_zero(dial->options[AST_DIAL_OPTION_MUSIC])) {
|
||||||
|
char *original_moh = ast_strdupa(chan->musicclass);
|
||||||
|
ast_indicate(chan, -1);
|
||||||
|
ast_string_field_set(chan, musicclass, dial->options[AST_DIAL_OPTION_MUSIC]);
|
||||||
|
ast_moh_start(chan, dial->options[AST_DIAL_OPTION_MUSIC], NULL);
|
||||||
|
ast_string_field_set(chan, musicclass, original_moh);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Go into an infinite loop while we are trying */
|
/* Go into an infinite loop while we are trying */
|
||||||
@@ -509,6 +534,11 @@ static enum ast_dial_result monitor_dial(struct ast_dial *dial, struct ast_chann
|
|||||||
/* If ANSWER_EXEC is enabled as an option, execute application on answered channel */
|
/* If ANSWER_EXEC is enabled as an option, execute application on answered channel */
|
||||||
if ((channel = find_relative_dial_channel(dial, who)) && (answer_exec = FIND_RELATIVE_OPTION(dial, channel, AST_DIAL_OPTION_ANSWER_EXEC)))
|
if ((channel = find_relative_dial_channel(dial, who)) && (answer_exec = FIND_RELATIVE_OPTION(dial, channel, AST_DIAL_OPTION_ANSWER_EXEC)))
|
||||||
answer_exec_run(who, answer_exec->app, answer_exec->args);
|
answer_exec_run(who, answer_exec->app, answer_exec->args);
|
||||||
|
|
||||||
|
if (chan && dial->options[AST_DIAL_OPTION_MUSIC] &&
|
||||||
|
!ast_strlen_zero(dial->options[AST_DIAL_OPTION_MUSIC])) {
|
||||||
|
ast_moh_stop(chan);
|
||||||
|
}
|
||||||
} else if (dial->state == AST_DIAL_RESULT_HANGUP) {
|
} else if (dial->state == AST_DIAL_RESULT_HANGUP) {
|
||||||
/* Hangup everything */
|
/* Hangup everything */
|
||||||
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
|
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
|
||||||
|
Reference in New Issue
Block a user