res_monitor: Remove deprecated module.

ASTERISK-30303

Change-Id: I0462caefb4f9544e2e2baa23c498858310b52d50
This commit is contained in:
Mike Bradeen 2022-11-18 18:24:38 -07:00 committed by George Joseph
parent cbaba132a7
commit 6b03d60c7d
36 changed files with 50 additions and 1720 deletions

View File

@ -83,10 +83,10 @@ the FILTER() dialplan function.
The CALLERID(num) and CALLERID(name) values are other commonly used values that
are sources of data potentially supplied by outside sources. If you use these
values as parameters to the System(), MixMonitor(), or Monitor() applications
or the SHELL() dialplan function, you can allow injection of arbitrary operating
system command execution. The FILTER() dialplan function is available to remove
dangerous characters from untrusted strings to block the command injection.
values as parameters to the System() or MixMonitor() applications or the SHELL()
dialplan function, you can allow injection of arbitrary operating system command
execution. The FILTER() dialplan function is available to remove dangerous
characters from untrusted strings to block the command injection.
### Strict Pattern Matching

View File

@ -58,6 +58,6 @@ app_voicemail_imap.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DIMAP_STORAGE
app_while.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
ifneq ($(findstring $(OSARCH), mingw32 cygwin ),)
LIBS+= -lres_ael_share.so -lres_monitor.so -lres_speech.so
LIBS+= -lres_ael_share.so -lres_speech.so
LIBS+= -lres_smdi.so
endif

View File

@ -3678,7 +3678,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc
ast_func_write(chan, "DENOISE(rx)", "on");
}
retrydahdi = (strcasecmp(ast_channel_tech(chan)->type, "DAHDI") || (ast_channel_audiohooks(chan) || ast_channel_monitor(chan)) ? 1 : 0);
retrydahdi = (strcasecmp(ast_channel_tech(chan)->type, "DAHDI") || (ast_channel_audiohooks(chan)) ? 1 : 0);
user->dahdichannel = !retrydahdi;
dahdiretry:
@ -4196,14 +4196,14 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc
if (c) {
char dtmfstr[2] = "";
if (ast_channel_fd(c, 0) != origfd || (user->dahdichannel && (ast_channel_audiohooks(c) || ast_channel_monitor(c)))) {
if (ast_channel_fd(c, 0) != origfd || (user->dahdichannel && ast_channel_audiohooks(c))) {
if (using_pseudo) {
/* Kill old pseudo */
close(fd);
using_pseudo = 0;
}
ast_debug(1, "Ooh, something swapped out under us, starting over\n");
retrydahdi = (strcasecmp(ast_channel_tech(c)->type, "DAHDI") || (ast_channel_audiohooks(c) || ast_channel_monitor(c)) ? 1 : 0);
retrydahdi = (strcasecmp(ast_channel_tech(c)->type, "DAHDI") || ast_channel_audiohooks(c) ? 1 : 0);
user->dahdichannel = !retrydahdi;
goto dahdiretry;
}

View File

@ -183,10 +183,7 @@
function <variable>FILTER()</variable>.</para></warning>
</description>
<see-also>
<ref type="application">Monitor</ref>
<ref type="application">StopMixMonitor</ref>
<ref type="application">PauseMonitor</ref>
<ref type="application">UnpauseMonitor</ref>
<ref type="function">AUDIOHOOK_INHERIT</ref>
</see-also>
</application>

View File

@ -41,7 +41,6 @@
* - Position announcement
* - Abandoned/completed call counters
* - Failout timer passed as optional app parameter
* - Optional monitoring of calls, started when call is answered
*
* Patch Version 1.07 2003-12-24 01
*
@ -63,7 +62,6 @@
*/
/*** MODULEINFO
<use type="module">res_monitor</use>
<support_level>core</support_level>
***/
@ -88,7 +86,6 @@
#include "asterisk/cli.h"
#include "asterisk/manager.h"
#include "asterisk/config.h"
#include "asterisk/monitor.h"
#include "asterisk/utils.h"
#include "asterisk/causes.h"
#include "asterisk/astdb.h"
@ -222,14 +219,6 @@
<option name="T">
<para>Allow the <emphasis>calling</emphasis> user to transfer the call.</para>
</option>
<option name="w">
<para>Allow the <emphasis>called</emphasis> user to write the conversation to
disk via Monitor.</para>
</option>
<option name="W">
<para>Allow the <emphasis>calling</emphasis> user to write the conversation to
disk via Monitor.</para>
</option>
<option name="x">
<para>Allow the <emphasis>called</emphasis> user to write the conversation
to disk via MixMonitor.</para>
@ -1862,7 +1851,6 @@ struct call_queue {
int servicelevel; /*!< seconds setting for servicelevel*/
int callscompletedinsl; /*!< Number of calls answered with servicelevel*/
char monfmt[8]; /*!< Format to use when recording calls */
int montype; /*!< Monitor type Monitor vs. MixMonitor */
int count; /*!< How many entries */
int maxlen; /*!< Max number of entries */
int wrapuptime; /*!< Wrapup Time */
@ -2966,7 +2954,6 @@ static void init_queue(struct call_queue *q)
q->setqueuevar = 0;
q->setqueueentryvar = 0;
q->autofill = autofill_default;
q->montype = montype_default;
q->monfmt[0] = '\0';
q->reportholdtime = 0;
q->wrapuptime = 0;
@ -3448,10 +3435,6 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
}
} else if (!strcasecmp(param, "autofill")) {
q->autofill = ast_true(val);
} else if (!strcasecmp(param, "monitor-type")) {
if (!strcasecmp(val, "mixmonitor")) {
q->montype = 1;
}
} else if (!strcasecmp(param, "autopause")) {
q->autopause = autopause2int(val);
} else if (!strcasecmp(param, "autopausedelay")) {
@ -6907,7 +6890,6 @@ static int try_calling(struct queue_ent *qe, struct ast_flags opts, char **opt_a
char oldcontext[AST_MAX_CONTEXT]="";
char queuename[256]="";
struct ast_channel *peer;
struct ast_channel *which;
struct callattempt *lpeer;
struct member *member;
struct ast_app *application;
@ -6922,7 +6904,6 @@ static int try_calling(struct queue_ent *qe, struct ast_flags opts, char **opt_a
char *agiexec = NULL;
char *gosubexec = NULL;
const char *monitorfilename;
char tmpid[256];
int forwardsallowed = 1;
int block_connected_line = 0;
struct ao2_iterator memi;
@ -6931,7 +6912,6 @@ static int try_calling(struct queue_ent *qe, struct ast_flags opts, char **opt_a
time_t starttime;
memset(&bridge_config, 0, sizeof(bridge_config));
tmpid[0] = 0;
time(&now);
/* If we've already exceeded our timeout, then just stop
@ -7252,32 +7232,7 @@ static int try_calling(struct queue_ent *qe, struct ast_flags opts, char **opt_a
/* Begin Monitoring */
if (*qe->parent->monfmt) {
if (!qe->parent->montype) {
const char *monexec;
ast_debug(1, "Starting Monitor as requested.\n");
ast_channel_lock(qe->chan);
if ((monexec = pbx_builtin_getvar_helper(qe->chan, "MONITOR_EXEC")) || pbx_builtin_getvar_helper(qe->chan, "MONITOR_EXEC_ARGS")) {
which = qe->chan;
monexec = monexec ? ast_strdupa(monexec) : NULL;
} else {
which = peer;
}
ast_channel_unlock(qe->chan);
if (monitorfilename) {
ast_monitor_start(which, qe->parent->monfmt, monitorfilename, 1, X_REC_IN | X_REC_OUT, NULL);
} else if (qe->chan) {
ast_monitor_start(which, qe->parent->monfmt, ast_channel_uniqueid(qe->chan), 1, X_REC_IN | X_REC_OUT, NULL);
} else {
/* Last ditch effort -- no channel, make up something */
snprintf(tmpid, sizeof(tmpid), "chan-%lx", (unsigned long)ast_random());
ast_monitor_start(which, qe->parent->monfmt, tmpid, 1, X_REC_IN | X_REC_OUT, NULL);
}
if (!ast_strlen_zero(monexec)) {
ast_monitor_setjoinfiles(which, 1);
}
} else {
setup_mixmonitor(qe, monitorfilename);
}
setup_mixmonitor(qe, monitorfilename);
}
/* Drop out of the queue at this point, to prepare for next caller */
leave_queue(qe);
@ -11802,5 +11757,4 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "True Call Queueing",
.unload = unload_module,
.reload = reload,
.load_pri = AST_MODPRI_DEVSTATE_CONSUMER,
.optional_modules = "res_monitor",
);

View File

@ -26,7 +26,6 @@
*/
/*** MODULEINFO
<use type="module">res_monitor</use>
<support_level>core</support_level>
***/
@ -49,7 +48,6 @@
#include "asterisk/pbx.h"
#include "asterisk/parking.h"
#include "asterisk/features_config.h"
#include "asterisk/monitor.h"
#include "asterisk/mixmonitor.h"
#include "asterisk/audiohook.h"
#include "asterisk/causes.h"
@ -78,7 +76,7 @@ static void set_touch_variable(enum set_touch_variables_res *res, struct ast_cha
}
}
static enum set_touch_variables_res set_touch_variables(struct ast_channel *chan, int is_mixmonitor, char **touch_format, char **touch_monitor, char **touch_monitor_prefix)
static enum set_touch_variables_res set_touch_variables(struct ast_channel *chan, char **touch_format, char **touch_monitor, char **touch_monitor_prefix)
{
enum set_touch_variables_res res = SET_TOUCH_UNSET;
const char *var_format;
@ -87,15 +85,10 @@ static enum set_touch_variables_res set_touch_variables(struct ast_channel *chan
SCOPED_CHANNELLOCK(lock, chan);
if (is_mixmonitor) {
var_format = "TOUCH_MIXMONITOR_FORMAT";
var_monitor = "TOUCH_MIXMONITOR";
var_prefix = "TOUCH_MIXMONITOR_PREFIX";
} else {
var_format = "TOUCH_MONITOR_FORMAT";
var_monitor = "TOUCH_MONITOR";
var_prefix = "TOUCH_MONITOR_PREFIX";
}
var_format = "TOUCH_MIXMONITOR_FORMAT";
var_monitor = "TOUCH_MIXMONITOR";
var_prefix = "TOUCH_MIXMONITOR_PREFIX";
set_touch_variable(&res, chan, var_format, touch_format);
set_touch_variable(&res, chan, var_monitor, touch_monitor);
set_touch_variable(&res, chan, var_prefix, touch_monitor_prefix);
@ -103,199 +96,6 @@ static enum set_touch_variables_res set_touch_variables(struct ast_channel *chan
return res;
}
static void stop_automonitor(struct ast_bridge_channel *bridge_channel, struct ast_channel *peer_chan, struct ast_features_general_config *features_cfg, const char *stop_message)
{
ast_verb(4, "AutoMonitor used to stop recording call.\n");
ast_channel_lock(peer_chan);
if (ast_channel_monitor(peer_chan)) {
if (ast_channel_monitor(peer_chan)->stop(peer_chan, 1)) {
ast_verb(4, "Cannot stop AutoMonitor for %s\n", ast_channel_name(bridge_channel->chan));
if (features_cfg && !(ast_strlen_zero(features_cfg->recordingfailsound))) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, features_cfg->recordingfailsound, NULL);
}
ast_channel_unlock(peer_chan);
return;
}
} else {
/* Something else removed the Monitor before we got to it. */
ast_channel_unlock(peer_chan);
return;
}
ast_channel_unlock(peer_chan);
if (features_cfg && !(ast_strlen_zero(features_cfg->courtesytone))) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, features_cfg->courtesytone, NULL);
ast_bridge_channel_write_playfile(bridge_channel, NULL, features_cfg->courtesytone, NULL);
}
if (!ast_strlen_zero(stop_message)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, stop_message, NULL);
ast_bridge_channel_write_playfile(bridge_channel, NULL, stop_message, NULL);
}
}
static void start_automonitor(struct ast_bridge_channel *bridge_channel, struct ast_channel *peer_chan, struct ast_features_general_config *features_cfg, const char *start_message)
{
char *touch_filename;
size_t len;
int x;
enum set_touch_variables_res set_touch_res;
RAII_VAR(char *, touch_format, NULL, ast_free);
RAII_VAR(char *, touch_monitor, NULL, ast_free);
RAII_VAR(char *, touch_monitor_prefix, NULL, ast_free);
set_touch_res = set_touch_variables(bridge_channel->chan, 0, &touch_format,
&touch_monitor, &touch_monitor_prefix);
switch (set_touch_res) {
case SET_TOUCH_SUCCESS:
break;
case SET_TOUCH_UNSET:
set_touch_res = set_touch_variables(peer_chan, 0, &touch_format, &touch_monitor,
&touch_monitor_prefix);
if (set_touch_res == SET_TOUCH_ALLOC_FAILURE) {
return;
}
break;
case SET_TOUCH_ALLOC_FAILURE:
return;
}
if (!ast_strlen_zero(touch_monitor)) {
len = strlen(touch_monitor) + 50;
touch_filename = ast_alloca(len);
snprintf(touch_filename, len, "%s-%ld-%s",
S_OR(touch_monitor_prefix, "auto"),
(long) time(NULL),
touch_monitor);
} else {
char *caller_chan_id;
char *peer_chan_id;
caller_chan_id = ast_strdupa(S_COR(ast_channel_caller(bridge_channel->chan)->id.number.valid,
ast_channel_caller(bridge_channel->chan)->id.number.str, ast_channel_name(bridge_channel->chan)));
peer_chan_id = ast_strdupa(S_COR(ast_channel_caller(peer_chan)->id.number.valid,
ast_channel_caller(peer_chan)->id.number.str, ast_channel_name(peer_chan)));
len = strlen(caller_chan_id) + strlen(peer_chan_id) + 50;
touch_filename = ast_alloca(len);
snprintf(touch_filename, len, "%s-%ld-%s-%s",
S_OR(touch_monitor_prefix, "auto"),
(long) time(NULL),
caller_chan_id,
peer_chan_id);
}
for (x = 0; x < strlen(touch_filename); x++) {
if (touch_filename[x] == '/') {
touch_filename[x] = '-';
}
}
ast_verb(4, "AutoMonitor used to record call. Filename: %s\n", touch_filename);
if (ast_monitor_start(peer_chan, touch_format, touch_filename, 1, X_REC_IN | X_REC_OUT, NULL)) {
ast_verb(4, "AutoMonitor feature was tried by '%s' but monitor failed to start.\n",
ast_channel_name(bridge_channel->chan));
return;
}
ast_monitor_setjoinfiles(peer_chan, 1);
if (features_cfg && !ast_strlen_zero(features_cfg->courtesytone)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, features_cfg->courtesytone, NULL);
ast_bridge_channel_write_playfile(bridge_channel, NULL, features_cfg->courtesytone, NULL);
}
if (!ast_strlen_zero(start_message)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, start_message, NULL);
ast_bridge_channel_write_playfile(bridge_channel, NULL, start_message, NULL);
}
pbx_builtin_setvar_helper(bridge_channel->chan, "TOUCH_MONITOR_OUTPUT", touch_filename);
pbx_builtin_setvar_helper(peer_chan, "TOUCH_MONITOR_OUTPUT", touch_filename);
}
static int feature_automonitor(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
{
const char *start_message;
const char *stop_message;
struct ast_bridge_features_automonitor *options = hook_pvt;
enum ast_bridge_features_monitor start_stop = options ? options->start_stop : AUTO_MONITOR_TOGGLE;
int is_monitoring;
RAII_VAR(struct ast_channel *, peer_chan, NULL, ast_channel_cleanup);
RAII_VAR(struct ast_features_general_config *, features_cfg, NULL, ao2_cleanup);
ast_channel_lock(bridge_channel->chan);
features_cfg = ast_get_chan_features_general_config(bridge_channel->chan);
ast_channel_unlock(bridge_channel->chan);
ast_bridge_channel_lock_bridge(bridge_channel);
peer_chan = ast_bridge_peer_nolock(bridge_channel->bridge, bridge_channel->chan);
ast_bridge_unlock(bridge_channel->bridge);
if (!peer_chan) {
ast_verb(4, "Cannot start AutoMonitor for %s - can not determine peer in bridge.\n",
ast_channel_name(bridge_channel->chan));
if (features_cfg && !ast_strlen_zero(features_cfg->recordingfailsound)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, features_cfg->recordingfailsound, NULL);
}
return 0;
}
ast_channel_lock(bridge_channel->chan);
start_message = pbx_builtin_getvar_helper(bridge_channel->chan,
"TOUCH_MONITOR_MESSAGE_START");
start_message = ast_strdupa(S_OR(start_message, ""));
stop_message = pbx_builtin_getvar_helper(bridge_channel->chan,
"TOUCH_MONITOR_MESSAGE_STOP");
stop_message = ast_strdupa(S_OR(stop_message, ""));
ast_channel_unlock(bridge_channel->chan);
is_monitoring = ast_channel_monitor(peer_chan) != NULL;
switch (start_stop) {
case AUTO_MONITOR_TOGGLE:
if (is_monitoring) {
stop_automonitor(bridge_channel, peer_chan, features_cfg, stop_message);
} else {
start_automonitor(bridge_channel, peer_chan, features_cfg, start_message);
}
return 0;
case AUTO_MONITOR_START:
if (!is_monitoring) {
start_automonitor(bridge_channel, peer_chan, features_cfg, start_message);
return 0;
}
ast_verb(4, "AutoMonitor already recording call.\n");
break;
case AUTO_MONITOR_STOP:
if (is_monitoring) {
stop_automonitor(bridge_channel, peer_chan, features_cfg, stop_message);
return 0;
}
ast_verb(4, "AutoMonitor already stopped on call.\n");
break;
}
/*
* Fake start/stop to invoker so will think it did something but
* was already in that mode.
*/
if (features_cfg && !ast_strlen_zero(features_cfg->courtesytone)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, features_cfg->courtesytone, NULL);
}
if (is_monitoring) {
if (!ast_strlen_zero(start_message)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, start_message, NULL);
}
} else {
if (!ast_strlen_zero(stop_message)) {
ast_bridge_channel_queue_playfile(bridge_channel, NULL, stop_message, NULL);
}
}
return 0;
}
static void stop_automixmonitor(struct ast_bridge_channel *bridge_channel, struct ast_channel *peer_chan, struct ast_features_general_config *features_cfg, const char *stop_message)
{
@ -331,13 +131,13 @@ static void start_automixmonitor(struct ast_bridge_channel *bridge_channel, stru
RAII_VAR(char *, touch_monitor, NULL, ast_free);
RAII_VAR(char *, touch_monitor_prefix, NULL, ast_free);
set_touch_res = set_touch_variables(bridge_channel->chan, 1, &touch_format,
set_touch_res = set_touch_variables(bridge_channel->chan, &touch_format,
&touch_monitor, &touch_monitor_prefix);
switch (set_touch_res) {
case SET_TOUCH_SUCCESS:
break;
case SET_TOUCH_UNSET:
set_touch_res = set_touch_variables(peer_chan, 1, &touch_format, &touch_monitor,
set_touch_res = set_touch_variables(peer_chan, &touch_format, &touch_monitor,
&touch_monitor_prefix);
if (set_touch_res == SET_TOUCH_ALLOC_FAILURE) {
return;
@ -503,7 +303,6 @@ static int feature_hangup(struct ast_bridge_channel *bridge_channel, void *hook_
static int unload_module(void)
{
ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_HANGUP);
ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_AUTOMON);
ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_AUTOMIXMON);
return 0;
@ -512,7 +311,6 @@ static int unload_module(void)
static int load_module(void)
{
ast_bridge_features_register(AST_BRIDGE_BUILTIN_HANGUP, feature_hangup, NULL);
ast_bridge_features_register(AST_BRIDGE_BUILTIN_AUTOMON, feature_automonitor, NULL);
ast_bridge_features_register(AST_BRIDGE_BUILTIN_AUTOMIXMON, feature_automixmonitor, NULL);
/* This module cannot be unloaded until shutdown */
@ -525,5 +323,4 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Built in bridging featur
.support_level = AST_MODULE_SUPPORT_CORE,
.load = load_module,
.unload = unload_module,
.optional_modules = "res_monitor",
);

View File

@ -19,10 +19,6 @@ all: _all
include $(ASTTOPDIR)/Makefile.moddir_rules
ifneq ($(findstring $(OSARCH), mingw32 cygwin ),)
LIBS+= -lres_monitor.so
endif
$(call MOD_ADD_C,chan_iax2,$(wildcard iax2/*.c))
iax2/parser.o: _ASTCFLAGS+=$(call get_menuselect_cflags,MALLOC_DEBUG)

View File

@ -1,5 +1,5 @@
;
; Sample Call Features (transfer, monitor/mixmonitor, etc) configuration
; Sample Call Features (transfer, mixmonitor, etc) configuration
;
; Note: From Asterisk 12 - All parking lot configuration is now done in res_parking.conf
@ -18,7 +18,7 @@
;pickupfailsound = beeperr ; to indicate that the pickup failed (default: no sound)
;featuredigittimeout = 1000 ; Max time (ms) between digits for
; feature activation (default is 1000 ms)
;recordingfailsound = beeperr ; indicates that a one-touch monitor or one-touch mixmonitor feature failed
;recordingfailsound = beeperr ; indicates that a one-touch mixmonitor feature failed
; to be applied to the call. (default: no sound)
;atxfernoanswertimeout = 15 ; Timeout for answer on attended transfer default is 15 seconds.
;atxferdropcall = no ; If someone does an attended transfer, then hangs up before the transfer
@ -45,7 +45,6 @@
[featuremap]
;blindxfer => #1 ; Blind transfer (default is #) -- Make sure to set the T and/or t option in the Dial() or Queue() app call!
;disconnect => *0 ; Disconnect (default is *) -- Make sure to set the H and/or h option in the Dial() or Queue() app call!
;automon => *1 ; One Touch Record a.k.a. Touch Monitor -- Make sure to set the W and/or w option in the Dial() or Queue() app call!
;atxfer => *2 ; Attended transfer -- Make sure to set the T and/or t option in the Dial() or Queue() app call!
;parkcall => #72 ; Park call (one step parking) -- Make sure to set the K and/or k option in the Dial() app call!
;automixmon => *3 ; One Touch Record a.k.a. Touch MixMonitor -- Make sure to set the X and/or x option in the Dial() or Queue() app call!
@ -109,11 +108,6 @@
; Set arbitrary channel variables, based upon CALLERID number (Note that the application
; argument contains commas)
;retrieveinfo => #8,peer,Set(ARRAY(CDR(mark),CDR(name))=${ODBC_FOO(${CALLERID(num)})})
;
;pauseMonitor => #1,self/callee,Pausemonitor ;Allow the callee to pause monitoring
; ;on their channel
;unpauseMonitor => #3,self/callee,UnPauseMonitor ;Allow the callee to unpause monitoring
; ;on their channel
; Dynamic Feature Groups:
; Dynamic feature groups are groupings of features defined in [applicationmap]
@ -123,5 +117,5 @@
; example:
; [myGroupName] ; defines the group named myGroupName
; testfeature => #9 ; associates testfeature with the group and the keycode '#9'.
; pauseMonitor => ; associates pauseMonitor with the group and uses the keycode specified
; retrieveinfo => ; associates retrieveinfo with the group and uses the keycode specified
; ; in the [applicationmap].

View File

@ -28,16 +28,9 @@ persistentmembers = yes
;autofill = no
;
; Monitor Type
; By setting monitor-type = MixMonitor, when specifying monitor-format
; to enable recording of queue member conversations, app_queue will
; now use the new MixMonitor application instead of Monitor so
; the concept of "joining/mixing" the in/out files now goes away
; when this is enabled. You can set the default type for all queues
; here, and then also change monitor-type for individual queues within
; queue by using the same configuration parameter within a queue
; configuration block. If you do not specify or comment out this option,
; it will default to the old 'Monitor' behavior to keep backward
; compatibility.
; monitor-type = MixMonitor is the only currently supported option.
; As MixMonitor mixes the audio by default, "joining/mixing" the in/out
; files is not necissary.
;
monitor-type = MixMonitor
;
@ -370,7 +363,7 @@ monitor-type = MixMonitor
; The announcements will be played in the order in which they are defined. After
; playing the last announcement, the announcements begin again from the beginning.
;
; Calls may be recorded using Asterisk's monitor/MixMonitor resource
; Calls may be recorded using Asterisk's MixMonitor resource.
; This can be enabled from within the Queue application, starting recording
; when the call is actually picked up; thus, only successful calls are
; recorded, and you are not recording while people are listening to MOH.
@ -387,13 +380,9 @@ monitor-type = MixMonitor
; monitor-format = gsm|wav|wav49
;
; Monitor Type
; By setting monitor-type = MixMonitor, when specifying monitor-format
; to enable recording of queue member conversations, app_queue will
; now use the new MixMonitor application instead of Monitor so
; the concept of "joining/mixing" the in/out files now goes away
; when this is enabled. If you do not specify or comment out this option,
; it will default to the old 'Monitor' behavior to keep backward
; compatibility.
; monitor-type = MixMonitor is the only currently supported option.
; As MixMonitor mixes the audio by default, "joining/mixing" the in/out
; files is not necissary.
;
; monitor-type = MixMonitor
;
@ -408,21 +397,15 @@ monitor-type = MixMonitor
; You can specify a post recording command to be executed after the end of
; recording by calling (from the dialplan)
;
; Set(MONITOR_EXEC=mv /var/spool/asterisk/monitor/^{MONITOR_FILENAME} /tmp/^{MONITOR_FILENAME})
;
; or
;
; Set(MONITOR_EXEC=mv /var/spool/asterisk/monitor/^{MIXMONITOR_FILENAME} /tmp/^{MIXMONITOR_FILENAME})
;
; If you choose to use the latter, you will not be able to switch the monitor-type back to Monitor
; without changing this in the dialplan.
;
;
; The command specified within the contents of MONITOR_EXEC will be executed when
; the recording is over. Any strings matching ^{X} will be unescaped to ${X} and
; all variables will be evaluated just prior to recording being started.
;
; The contents of MONITOR_FILENAME will also be unescaped from ^{X} to ${X} and
; The contents of MIXMONITOR_FILENAME will also be unescaped from ^{X} to ${X} and
; all variables will be evaluated just prior to recording being started.
;
; ---------------------- Queue Empty Options ----------------------------------

View File

@ -63,8 +63,6 @@
; decline=ast_channel_hangup_handler_type
; decline=ast_channel_moh_start_type
; decline=ast_channel_moh_stop_type
; decline=ast_channel_monitor_start_type
; decline=ast_channel_monitor_stop_type
; decline=ast_channel_mixmonitor_start_type
; decline=ast_channel_mixmonitor_stop_type
; decline=ast_channel_agent_login_type

View File

@ -0,0 +1,13 @@
Subject: res_monitor
Master-Only: True
This module was deprecated in Asterisk 16
and is now being removed in accordance with
the Asterisk Module Deprecation policy.
This also removes the 'w' and 'W' options
for app_queue.
MixMonitor should be default and only option
for all settings that previously used either
Monitor or MixMonitor.

View File

@ -90,12 +90,6 @@ enum ast_bridge_builtin_feature {
* parking slot to which it was parked.
*/
AST_BRIDGE_BUILTIN_PARKCALL,
/*!
* DTMF one-touch-record toggle using Monitor app.
*
* \note Only valid on two party bridges.
*/
AST_BRIDGE_BUILTIN_AUTOMON,
/*!
* DTMF one-touch-record toggle using MixMonitor app.
*
@ -305,19 +299,14 @@ struct ast_bridge_features_attended_transfer {
};
enum ast_bridge_features_monitor {
/*! Toggle start/stop of Monitor/MixMonitor. */
/*! Toggle start/stop of MixMonitor. */
AUTO_MONITOR_TOGGLE,
/*! Start Monitor/MixMonitor if not already started. */
/*! Start MixMonitor if not already started. */
AUTO_MONITOR_START,
/*! Stop Monitor/MixMonitor if not already stopped. */
/*! Stop MixMonitor if not already stopped. */
AUTO_MONITOR_STOP,
};
struct ast_bridge_features_automonitor {
/*! Start/Stop behavior. */
enum ast_bridge_features_monitor start_stop;
};
struct ast_bridge_features_automixmonitor {
/*! Start/Stop behavior. */
enum ast_bridge_features_monitor start_stop;

View File

@ -4033,21 +4033,6 @@ enum AST_MONITORING_STATE {
AST_MONITOR_PAUSED
};
/*! Responsible for channel monitoring data */
struct ast_channel_monitor {
struct ast_filestream *read_stream;
struct ast_filestream *write_stream;
char read_filename[FILENAME_MAX];
char write_filename[FILENAME_MAX];
char filename_base[FILENAME_MAX];
char beep_id[64];
int filename_changed;
char *format;
int joinfiles;
enum AST_MONITORING_STATE state;
int (*stop)(struct ast_channel *chan, int need_lock);
};
/* ACCESSOR FUNCTIONS */
#define DECLARE_STRINGFIELD_SETTERS_FOR(field) \
@ -4168,8 +4153,6 @@ struct ast_channel *ast_channel_masq(const struct ast_channel *chan);
void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value);
struct ast_channel *ast_channel_masqr(const struct ast_channel *chan);
void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value);
struct ast_channel_monitor *ast_channel_monitor(const struct ast_channel *chan);
void ast_channel_monitor_set(struct ast_channel *chan, struct ast_channel_monitor *value);
struct ast_filestream *ast_channel_stream(const struct ast_channel *chan);
void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value);
struct ast_filestream *ast_channel_vstream(const struct ast_channel *chan);

View File

@ -185,7 +185,6 @@ Some examples of modules that provide C APIs (potentially among other things) ar
- res_crypto.c
- res_curl.c
- res_xmpp.c
- res_monitor.c
- res_smdi.c
- res_speech.c
- provides a speech recognition engine interface.

View File

@ -28,9 +28,9 @@ struct ast_channel;
*/
struct ast_features_general_config {
AST_DECLARE_STRING_FIELDS(
/*! Sound played when automon or automixmon features are used */
/*! Sound played when automixmon features are used */
AST_STRING_FIELD(courtesytone);
/*! Sound played when automon or automixmon features fail when used */
/*! Sound played when automixmon features fail when used */
AST_STRING_FIELD(recordingfailsound);
);
/*! Milliseconds allowed between digit presses when entering feature code */
@ -170,8 +170,6 @@ struct ast_featuremap_config {
AST_STRING_FIELD(blindxfer);
/*! Disconnect DTMF code */
AST_STRING_FIELD(disconnect);
/*! Automon DTMF code */
AST_STRING_FIELD(automon);
/*! Attended Transfer DTMF code */
AST_STRING_FIELD(atxfer);
/*! One-touch parking DTMF code */

View File

@ -1,66 +0,0 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2005, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
* \brief Channel monitoring
*/
#ifndef _ASTERISK_MONITOR_H
#define _ASTERISK_MONITOR_H
#include "asterisk/channel.h"
#include "asterisk/optional_api.h"
/* Streams recording control */
#define X_REC_IN 1
#define X_REC_OUT 2
#define X_JOIN 4
/* Start monitoring a channel */
AST_OPTIONAL_API(int, ast_monitor_start,
(struct ast_channel *chan, const char *format_spec,
const char *fname_base, int need_lock, int stream_action,
const char *beep_id),
{ return -1; });
/* Stop monitoring a channel */
AST_OPTIONAL_API(int, ast_monitor_stop,
(struct ast_channel *chan, int need_lock),
{ return -1; });
/* Change monitoring filename of a channel */
AST_OPTIONAL_API(int, ast_monitor_change_fname,
(struct ast_channel *chan, const char *fname_base,
int need_lock),
{ return -1; });
AST_OPTIONAL_API(void, ast_monitor_setjoinfiles,
(struct ast_channel *chan, int turnon),
{ return; });
/* Pause monitoring of a channel */
AST_OPTIONAL_API(int, ast_monitor_pause,
(struct ast_channel *chan),
{ return -1; });
/* Unpause monitoring of a channel */
AST_OPTIONAL_API(int, ast_monitor_unpause,
(struct ast_channel *chan),
{ return -1; });
#endif /* _ASTERISK_MONITOR_H */

View File

@ -584,22 +584,6 @@ struct stasis_message_type *ast_channel_fax_type(void);
*/
struct stasis_message_type *ast_channel_hangup_handler_type(void);
/*!
* \since 12
* \brief Message type for starting monitor on a channel
*
* \return A stasis message type
*/
struct stasis_message_type *ast_channel_monitor_start_type(void);
/*!
* \since 12
* \brief Message type for stopping monitor on a channel
*
* \return A stasis message type
*/
struct stasis_message_type *ast_channel_monitor_stop_type(void);
/*!
* \since 18
* \brief Message type for starting mixmonitor on a channel

View File

@ -3,7 +3,6 @@
*ast_agi_*;
*ast_beep_*;
*ast_smdi_*;
*ast_monitor_*;
*ast_key_get;
*ast_check_signature;
*ast_check_signature_bin;

View File

@ -414,7 +414,6 @@ static int setup_bridge_features_builtin(struct ast_bridge_features *features, s
res |= builtin_features_helper(features, chan, flags, AST_FEATURE_REDIRECT, "atxfer", AST_BRIDGE_BUILTIN_ATTENDEDTRANSFER);
res |= builtin_features_helper(features, chan, flags, AST_FEATURE_DISCONNECT, "disconnect", AST_BRIDGE_BUILTIN_HANGUP);
res |= builtin_features_helper(features, chan, flags, AST_FEATURE_PARKCALL, "parkcall", AST_BRIDGE_BUILTIN_PARKCALL);
res |= builtin_features_helper(features, chan, flags, AST_FEATURE_AUTOMON, "automon", AST_BRIDGE_BUILTIN_AUTOMON);
res |= builtin_features_helper(features, chan, flags, AST_FEATURE_AUTOMIXMON, "automixmon", AST_BRIDGE_BUILTIN_AUTOMIXMON);
return res ? -1 : 0;

View File

@ -1626,8 +1626,6 @@ static void testsuite_notify_feature_success(struct ast_channel *chan, const cha
feature = "atxfer";
} else if (!strcmp(dtmf, featuremap->disconnect)) {
feature = "disconnect";
} else if (!strcmp(dtmf, featuremap->automon)) {
feature = "automon";
} else if (!strcmp(dtmf, featuremap->automixmon)) {
feature = "automixmon";
} else if (!strcmp(dtmf, featuremap->parkcall)) {

View File

@ -2195,11 +2195,6 @@ static void ast_channel_destructor(void *obj)
ast_debug(1, "Channel %p '%s' destroying\n", chan, ast_channel_name(chan));
/* Stop monitoring */
if (ast_channel_monitor(chan)) {
ast_channel_monitor(chan)->stop(chan, 0);
}
/* If there is native format music-on-hold state, free it */
if (ast_channel_music_state(chan)) {
ast_moh_cleanup(chan);
@ -2516,15 +2511,13 @@ void ast_set_hangupsource(struct ast_channel *chan, const char *source, int forc
int ast_channel_has_audio_frame_or_monitor(struct ast_channel *chan)
{
return ast_channel_monitor(chan)
|| !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))
return !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))
|| !ast_framehook_list_contains_no_active(ast_channel_framehooks(chan));
}
int ast_channel_has_hook_requiring_audio(struct ast_channel *chan)
{
return ast_channel_monitor(chan)
|| !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))
return !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))
|| !ast_framehook_list_contains_no_active_of_type(ast_channel_framehooks(chan), AST_FRAME_VOICE);
}
@ -4164,40 +4157,6 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio, int
}
}
if (ast_channel_monitor(chan) && ast_channel_monitor(chan)->read_stream) {
/* XXX what does this do ? */
#ifndef MONITOR_CONSTANT_DELAY
int jump = ast_channel_outsmpl(chan) - ast_channel_insmpl(chan) - 4 * f->samples;
if (jump >= 0) {
jump = calc_monitor_jump((ast_channel_outsmpl(chan) - ast_channel_insmpl(chan)),
ast_format_get_sample_rate(f->subclass.format),
ast_format_get_sample_rate(ast_channel_monitor(chan)->read_stream->fmt->format));
if (ast_seekstream(ast_channel_monitor(chan)->read_stream, jump, SEEK_FORCECUR) == -1) {
ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
}
ast_channel_insmpl_set(chan, ast_channel_insmpl(chan) + (ast_channel_outsmpl(chan) - ast_channel_insmpl(chan)) + f->samples);
} else {
ast_channel_insmpl_set(chan, ast_channel_insmpl(chan) + f->samples);
}
#else
int jump = calc_monitor_jump((ast_channel_outsmpl(chan) - ast_channel_insmpl(chan)),
ast_format_get_sample_rate(f->subclass.format),
ast_format_get_sample_rate(ast_channel_monitor(chan)->read_stream->fmt->format));
if (jump - MONITOR_DELAY >= 0) {
if (ast_seekstream(ast_channel_monitor(chan)->read_stream, jump - f->samples, SEEK_FORCECUR) == -1) {
ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
}
ast_channel_insmpl(chan) += ast_channel_outsmpl(chan) - ast_channel_insmpl(chan);
} else {
ast_channel_insmpl(chan) += f->samples;
}
#endif
if (ast_channel_monitor(chan)->state == AST_MONITOR_RUNNING) {
if (ast_writestream(ast_channel_monitor(chan)->read_stream, f) < 0)
ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
}
}
if (ast_channel_readtrans(chan)
&& ast_format_cmp(f->subclass.format, ast_channel_rawreadformat(chan)) == AST_FORMAT_CMP_EQUAL) {
f = ast_translate(ast_channel_readtrans(chan), f, 1);
@ -5440,48 +5399,6 @@ int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame
}
}
/* If Monitor is running on this channel, then we have to write frames out there too */
/* the translator on chan->writetrans may have returned multiple frames
from the single frame we passed in; if so, feed each one of them to the
monitor */
if ((stream == default_stream) && ast_channel_monitor(chan) && ast_channel_monitor(chan)->write_stream) {
struct ast_frame *cur;
for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
/* XXX must explain this code */
#ifndef MONITOR_CONSTANT_DELAY
int jump = ast_channel_insmpl(chan) - ast_channel_outsmpl(chan) - 4 * cur->samples;
if (jump >= 0) {
jump = calc_monitor_jump((ast_channel_insmpl(chan) - ast_channel_outsmpl(chan)),
ast_format_get_sample_rate(f->subclass.format),
ast_format_get_sample_rate(ast_channel_monitor(chan)->write_stream->fmt->format));
if (ast_seekstream(ast_channel_monitor(chan)->write_stream, jump, SEEK_FORCECUR) == -1) {
ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
}
ast_channel_outsmpl_set(chan, ast_channel_outsmpl(chan) + (ast_channel_insmpl(chan) - ast_channel_outsmpl(chan)) + cur->samples);
} else {
ast_channel_outsmpl_set(chan, ast_channel_outsmpl(chan) + cur->samples);
}
#else
int jump = calc_monitor_jump((ast_channel_insmpl(chan) - ast_channel_outsmpl(chan)),
ast_format_get_sample_rate(f->subclass.format),
ast_format_get_sample_rate(ast_channel_monitor(chan)->write_stream->fmt->format));
if (jump - MONITOR_DELAY >= 0) {
if (ast_seekstream(ast_channel_monitor(chan)->write_stream, jump - cur->samples, SEEK_FORCECUR) == -1) {
ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
}
ast_channel_outsmpl_set(chan, ast_channel_outsmpl(chan) + ast_channel_insmpl(chan) - ast_channel_outsmpl(chan));
} else {
ast_channel_outsmpl_set(chan, ast_channel_outsmpl(chan) + cur->samples);
}
#endif
if (ast_channel_monitor(chan)->state == AST_MONITOR_RUNNING) {
if (ast_writestream(ast_channel_monitor(chan)->write_stream, cur) < 0)
ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
}
}
}
/* the translator on chan->writetrans may have returned multiple frames
from the single frame we passed in; if so, feed each one of them to the
channel, freeing each one after it has been written */
@ -7130,11 +7047,6 @@ static void channel_do_masquerade(struct ast_channel *original, struct ast_chann
}
}
/* Update the type. */
t_pvt = ast_channel_monitor(original);
ast_channel_monitor_set(original, ast_channel_monitor(clonechan));
ast_channel_monitor_set(clonechan, t_pvt);
/* Keep the same language. */
ast_channel_language_set(original, ast_channel_language(clonechan));

View File

@ -94,7 +94,6 @@ struct ast_channel {
struct ast_cdr *cdr; /*!< Call Detail Record */
struct ast_tone_zone *zone; /*!< Tone zone as set in indications.conf or
* in the CHANNEL dialplan function */
struct ast_channel_monitor *monitor; /*!< Channel monitoring */
ast_callid callid; /*!< Bound call identifier pointer */
struct ao2_container *dialed_causes; /*!< Contains tech-specific and Asterisk cause data from dialed channels */
@ -604,14 +603,6 @@ void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value)
{
chan->masqr = value;
}
struct ast_channel_monitor *ast_channel_monitor(const struct ast_channel *chan)
{
return chan->monitor;
}
void ast_channel_monitor_set(struct ast_channel *chan, struct ast_channel_monitor *value)
{
chan->monitor = value;
}
struct ast_filestream *ast_channel_stream(const struct ast_channel *chan)
{
return chan->stream;

View File

@ -478,41 +478,6 @@ static void bridge_config_set_limits(struct ast_bridge_config *config, struct as
callee_limits->duration = config->timelimit;
}
/*!
* \internal
* \brief Check if Monitor needs to be started on a channel.
* \since 12.0.0
*
* \param chan The bridge considers this channel the caller.
* \param peer The bridge considers this channel the callee.
*/
static void bridge_check_monitor(struct ast_channel *chan, struct ast_channel *peer)
{
const char *value;
const char *monitor_args = NULL;
struct ast_channel *monitor_chan = NULL;
ast_channel_lock(chan);
value = pbx_builtin_getvar_helper(chan, "AUTO_MONITOR");
if (!ast_strlen_zero(value)) {
monitor_args = ast_strdupa(value);
monitor_chan = chan;
}
ast_channel_unlock(chan);
if (!monitor_chan) {
ast_channel_lock(peer);
value = pbx_builtin_getvar_helper(peer, "AUTO_MONITOR");
if (!ast_strlen_zero(value)) {
monitor_args = ast_strdupa(value);
monitor_chan = peer;
}
ast_channel_unlock(peer);
}
if (monitor_chan) {
ast_pbx_exec_application(monitor_chan, "Monitor", monitor_args);
}
}
/*!
* \internal
* \brief Send the peer channel on its way on bridge start failure.
@ -550,8 +515,6 @@ static int pre_bridge_setup(struct ast_channel *chan, struct ast_channel *peer,
ast_indicate(peer, AST_CONTROL_RINGING);
}
bridge_check_monitor(chan, peer);
set_config_flags(chan, config);
/* Answer if need be */

View File

@ -39,10 +39,10 @@
<synopsis>Milliseconds allowed between digit presses when entering a feature code.</synopsis>
</configOption>
<configOption name="courtesytone">
<synopsis>Sound to play when automon or automixmon is activated</synopsis>
<synopsis>Sound to play when automixmon is activated</synopsis>
</configOption>
<configOption name="recordingfailsound">
<synopsis>Sound to play when automon or automixmon is attempted but fails to start</synopsis>
<synopsis>Sound to play when automixmon is attempted but fails to start</synopsis>
</configOption>
<configOption name="transferdigittimeout" default="3">
<synopsis>Seconds allowed between digit presses when dialing a transfer destination</synopsis>
@ -186,22 +186,6 @@
is used. The call is parked in the next available space in the parking lot.</para>
</description>
</configOption>
<configOption name="automon">
<synopsis>DTMF sequence to start or stop Monitor on a call</synopsis>
<description>
<para>This will cause the channel that pressed the DTMF sequence
to be monitored by the <literal>Monitor</literal> application. The
format for the recording is determined by the <replaceable>TOUCH_MONITOR_FORMAT</replaceable>
channel variable. If this variable is not specified, then <literal>wav</literal> is the
default. The filename is constructed in the following manner:</para>
<para> prefix-timestamp-suffix.fmt</para>
<para>where prefix is either the value of the <replaceable>TOUCH_MONITOR_PREFIX</replaceable>
channel variable or <literal>auto</literal> if the variable is not set. The timestamp
is a UNIX timestamp. The suffix is either the value of the <replaceable>TOUCH_MONITOR</replaceable>
channel variable or the callerID of the channels if the variable is not set.</para>
</description>
<see-also><ref type="configOption">automixmon</ref></see-also>
</configOption>
<configOption name="automixmon">
<synopsis>DTMF sequence to start or stop MixMonitor on a call</synopsis>
<description>
@ -216,7 +200,6 @@
is a UNIX timestamp. The suffix is either the value of the <replaceable>TOUCH_MIXMONITOR</replaceable>
channel variable or the callerID of the channels if the variable is not set.</para>
</description>
<see-also><ref type="configOption">automon</ref></see-also>
</configOption>
</configObject>
<configObject name="applicationmap">
@ -352,7 +335,6 @@
<enumlist>
<enum name="atxfer"><para>Attended Transfer</para></enum>
<enum name="blindxfer"><para>Blind Transfer</para></enum>
<enum name="automon"><para>Auto Monitor</para></enum>
<enum name="disconnect"><para>Call Disconnect</para></enum>
<enum name="parkcall"><para>Park Call</para></enum>
<enum name="automixmon"><para>Auto MixMonitor</para></enum>
@ -1013,8 +995,6 @@ static int featuremap_set(struct ast_featuremap_config *featuremap, const char *
ast_string_field_set(featuremap, blindxfer, value);
} else if (!strcasecmp(name, "disconnect")) {
ast_string_field_set(featuremap, disconnect, value);
} else if (!strcasecmp(name, "automon")) {
ast_string_field_set(featuremap, automon, value);
} else if (!strcasecmp(name, "atxfer")) {
ast_string_field_set(featuremap, atxfer, value);
} else if (!strcasecmp(name, "automixmon")) {
@ -1038,8 +1018,6 @@ static int featuremap_get(struct ast_featuremap_config *featuremap, const char *
ast_copy_string(buf, featuremap->blindxfer, len);
} else if (!strcasecmp(field, "disconnect")) {
ast_copy_string(buf, featuremap->disconnect, len);
} else if (!strcasecmp(field, "automon")) {
ast_copy_string(buf, featuremap->automon, len);
} else if (!strcasecmp(field, "atxfer")) {
ast_copy_string(buf, featuremap->atxfer, len);
} else if (!strcasecmp(field, "automixmon")) {
@ -1857,8 +1835,6 @@ static int load_config(void)
DEFAULT_FEATUREMAP_BLINDXFER, featuremap_handler, 0);
aco_option_register_custom(&cfg_info, "disconnect", ACO_EXACT, featuremap_options,
DEFAULT_FEATUREMAP_DISCONNECT, featuremap_handler, 0);
aco_option_register_custom(&cfg_info, "automon", ACO_EXACT, featuremap_options,
DEFAULT_FEATUREMAP_AUTOMON, featuremap_handler, 0);
aco_option_register_custom(&cfg_info, "atxfer", ACO_EXACT, featuremap_options,
DEFAULT_FEATUREMAP_ATXFER, featuremap_handler, 0);
aco_option_register_custom(&cfg_info, "parkcall", ACO_EXACT, featuremap_options,
@ -1957,7 +1933,6 @@ static char *handle_feature_show(struct ast_cli_entry *e, int cmd, struct ast_cl
ast_cli(a->fd, HFS_FORMAT, "Pickup", DEFAULT_PICKUPEXTEN, cfg->global->pickup->pickupexten);
ast_cli(a->fd, HFS_FORMAT, "Blind Transfer", DEFAULT_FEATUREMAP_BLINDXFER, cfg->featuremap->blindxfer);
ast_cli(a->fd, HFS_FORMAT, "Attended Transfer", DEFAULT_FEATUREMAP_ATXFER, cfg->featuremap->atxfer);
ast_cli(a->fd, HFS_FORMAT, "One Touch Monitor", DEFAULT_FEATUREMAP_AUTOMON, cfg->featuremap->automon);
ast_cli(a->fd, HFS_FORMAT, "Disconnect Call", DEFAULT_FEATUREMAP_DISCONNECT, cfg->featuremap->disconnect);
ast_cli(a->fd, HFS_FORMAT, "Park Call", DEFAULT_FEATUREMAP_PARKCALL, cfg->featuremap->parkcall);
ast_cli(a->fd, HFS_FORMAT, "One Touch MixMonitor", DEFAULT_FEATUREMAP_AUTOMIXMON, cfg->featuremap->automixmon);

View File

@ -451,32 +451,6 @@
</see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="MonitorStart">
<managerEventInstance class="EVENT_FLAG_CALL">
<synopsis>Raised when monitoring has started on a channel.</synopsis>
<syntax>
<channel_snapshot/>
</syntax>
<see-also>
<ref type="managerEvent">MonitorStop</ref>
<ref type="application">Monitor</ref>
<ref type="manager">Monitor</ref>
</see-also>
</managerEventInstance>
</managerEvent>
<managerEvent language="en_US" name="MonitorStop">
<managerEventInstance class="EVENT_FLAG_CALL">
<synopsis>Raised when monitoring has stopped on a channel.</synopsis>
<syntax>
<channel_snapshot/>
</syntax>
<see-also>
<ref type="managerEvent">MonitorStart</ref>
<ref type="application">StopMonitor</ref>
<ref type="manager">StopMonitor</ref>
</see-also>
</managerEventInstance>
</managerEvent>
***/
/*! \brief The \ref stasis subscription returned by the forwarding of the channel topic
@ -1160,22 +1134,6 @@ static void channel_moh_stop_cb(void *data, struct stasis_subscription *sub,
publish_basic_channel_event("MusicOnHoldStop", EVENT_FLAG_CALL, payload->snapshot);
}
static void channel_monitor_start_cb(void *data, struct stasis_subscription *sub,
struct stasis_message *message)
{
struct ast_channel_blob *payload = stasis_message_data(message);
publish_basic_channel_event("MonitorStart", EVENT_FLAG_CALL, payload->snapshot);
}
static void channel_monitor_stop_cb(void *data, struct stasis_subscription *sub,
struct stasis_message *message)
{
struct ast_channel_blob *payload = stasis_message_data(message);
publish_basic_channel_event("MonitorStop", EVENT_FLAG_CALL, payload->snapshot);
}
static void channel_mixmonitor_start_cb(void *data, struct stasis_subscription *sub,
struct stasis_message *message)
{
@ -1426,13 +1384,6 @@ int manager_channels_init(void)
ret |= stasis_message_router_add(message_router,
ast_channel_moh_stop_type(), channel_moh_stop_cb, NULL);
ret |= stasis_message_router_add(message_router,
ast_channel_monitor_start_type(), channel_monitor_start_cb,
NULL);
ret |= stasis_message_router_add(message_router,
ast_channel_monitor_stop_type(), channel_monitor_stop_cb, NULL);
ret |= stasis_message_router_add(message_router,
ast_channel_mixmonitor_start_type(), channel_mixmonitor_start_cb, NULL);

View File

@ -130,8 +130,6 @@
<enum name="ast_channel_hangup_handler_type" />
<enum name="ast_channel_moh_start_type" />
<enum name="ast_channel_moh_stop_type" />
<enum name="ast_channel_monitor_start_type" />
<enum name="ast_channel_monitor_stop_type" />
<enum name="ast_channel_mixmonitor_start_type" />
<enum name="ast_channel_mixmonitor_stop_type" />
<enum name="ast_channel_mixmonitor_mute_type" />

View File

@ -1611,8 +1611,6 @@ STASIS_MESSAGE_TYPE_DEFN(ast_channel_fax_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_hangup_handler_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_moh_start_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_moh_stop_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_monitor_start_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_monitor_stop_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_mixmonitor_start_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_mixmonitor_stop_type);
STASIS_MESSAGE_TYPE_DEFN(ast_channel_mixmonitor_mute_type);
@ -1659,8 +1657,6 @@ static void stasis_channels_cleanup(void)
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_hangup_handler_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_moh_start_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_moh_stop_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_monitor_start_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_monitor_stop_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_mixmonitor_start_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_mixmonitor_stop_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_mixmonitor_mute_type);
@ -1714,8 +1710,6 @@ int ast_stasis_channels_init(void)
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_hangup_handler_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_moh_start_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_moh_stop_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_monitor_start_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_monitor_stop_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_mixmonitor_start_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_mixmonitor_stop_type);
res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_mixmonitor_mute_type);

View File

@ -350,8 +350,6 @@
</member>
<member name="res_jabber" displayname="AJI - Asterisk JABBER Interface" remove_on_change="res/res_jabber.o res/res_jabber.so">
<depend>iksemel</depend>
</member>
<member name="res_monitor" displayname="Call Monitoring Resource" remove_on_change="res/res_monitor.o res/res_monitor.so">
</member>
<member name="res_musiconhold" displayname="Music On Hold Resource" remove_on_change="res/res_musiconhold.o res/res_musiconhold.so">
<conflict>win32</conflict>

View File

@ -97,7 +97,6 @@
<member name="app_privacy" displayname="Require phone number to be entered, if no CallerID sent" remove_on_change="apps/app_privacy.o apps/app_privacy.so">
</member>
<member name="app_queue" displayname="True Call Queueing" remove_on_change="apps/app_queue.o apps/app_queue.so">
<depend>res_monitor</depend>
</member>
<member name="app_read" displayname="Read Variable Application" remove_on_change="apps/app_read.o apps/app_read.so">
</member>
@ -449,8 +448,6 @@
</member>
<member name="res_limit" displayname="Resource limits" remove_on_change="res/res_limit.o res/res_limit.so">
</member>
<member name="res_monitor" displayname="Call Monitoring Resource" remove_on_change="res/res_monitor.o res/res_monitor.so">
</member>
<member name="res_musiconhold" displayname="Music On Hold Resource" remove_on_change="res/res_musiconhold.o res/res_musiconhold.so">
<conflict>win32</conflict>
<use>dahdi</use>

View File

@ -20,7 +20,7 @@ all: _all
include $(ASTTOPDIR)/Makefile.moddir_rules
ifneq ($(findstring $(OSARCH), mingw32 cygwin ),)
LIBS+= -lres_ael_share.so -lres_monitor.so
LIBS+= -lres_ael_share.so
endif
$(call MOD_ADD_C,pbx_dundi,dundi-parser.c)

View File

@ -65,7 +65,6 @@
MeetMeCount(5555,var);
Milliwatt();
MixMonitor(filename,abv()V()W(),command);
Monitor(file.fmt,base,mb);
MP3Player(location);
MusicOnHold(class);
NBScat();

View File

@ -65,7 +65,6 @@
MeetMeCount(5555,var);
Milliwatt();
MixMonitor(filename,abv()V()W(),command);
Monitor(file.fmt,base,mb);
MP3Player(location);
MusicOnHold(class);
NBScat();

View File

@ -425,7 +425,6 @@ context apps-include {
app-idblock;
app-helpdesk;
app-dictate;
app-set-monitor;
};
};
@ -485,21 +484,6 @@ context app-calltrace-perform {
};
};
context app-set-monitor {
*50 => {
Realtime(call_info,exten,${CALLERIDNUM:5},mon_set_);
if ("${mon_set_monitor}" = "YES") {
RealtimeUpdate(call_info,exten,${CALLERIDNUM:5},monitor|);
System(/usr/local/bin/db_update.sh call_info monitor '' exten ${CALLERIDNUM:5} &);
} else {
RealtimeUpdate(call_info,exten,${CALLERIDNUM:5},monitor,YES);
System(/usr/local/bin/db_update.sh call_info monitor YES exten ${CALLERIDNUM:5} &);
};
NoOp(${mon_set_monitor});
Hangup;
};
};
context app-dnd {
*78 => {
Answer;

View File

@ -421,7 +421,6 @@ context apps-include {
app-idblock;
app-helpdesk;
app-dictate;
app-set-monitor;
};
};
@ -481,21 +480,6 @@ context app-calltrace-perform {
};
};
context app-set-monitor {
*50 => {
Realtime(call_info|exten|${CALLERIDNUM:5}|mon_set_);
if ("${mon_set_monitor}" = "YES") {
RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|monitor|);
System(/usr/local/bin/db_update.sh call_info monitor '' exten ${CALLERIDNUM:5} &);
} else {
RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|monitor|YES);
System(/usr/local/bin/db_update.sh call_info monitor YES exten ${CALLERIDNUM:5} &);
};
NoOp(${mon_set_monitor});
Hangup;
};
};
context app-dnd {
*78 => {
Answer;

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +0,0 @@
{
global:
LINKER_SYMBOL_PREFIX*ast_monitor_change_fname;
LINKER_SYMBOL_PREFIX*ast_monitor_pause;
LINKER_SYMBOL_PREFIX*ast_monitor_setjoinfiles;
LINKER_SYMBOL_PREFIX*ast_monitor_start;
LINKER_SYMBOL_PREFIX*ast_monitor_stop;
LINKER_SYMBOL_PREFIX*ast_monitor_unpause;
local:
*;
};