diff --git a/apps/.app_mixmonitor.c.swp b/apps/.app_mixmonitor.c.swp
deleted file mode 100644
index 92cbf3a..0000000
Binary files a/apps/.app_mixmonitor.c.swp and /dev/null differ
diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c
index 6746c47..661ec14 100644
--- a/apps/app_mixmonitor.c
+++ b/apps/app_mixmonitor.c
@@ -167,12 +167,39 @@
[Monitor]
+ [MuteMixMonitor]
[StopMixMonitor]
[PauseMonitor]
[UnpauseMonitor]
[AUDIOHOOK_INHERIT]
+
+
+ Mute recording a call through MixMonitor.
+
+
+
+ If a valid Channel ID is provided, then this command will stop only that specific
+ MixMonitor.
+
+
+ The state is set to 1 or 0 to enable or disable the mute state.
+
+
+ Direction is set to either read, write, or both, from the perspective of
+ the recording file itself.
+
+
+
+ Mutes the audio recording that was started with a call to MixMonitor()
+ on the current channel.
+
+
+ [MixMonitor]
+ [StopMixMonitor]
+
+
Stop recording a call through MixMonitor, and free the recording's file handle.
@@ -299,6 +326,8 @@ static const char * const app = "MixMonitor";
static const char * const stop_app = "StopMixMonitor";
+static const char * const mute_app = "MuteMixMonitor";
+
static const char * const mixmonitor_spy_type = "MixMonitor";
/*!
@@ -1147,6 +1176,65 @@ static int mixmonitor_exec(struct ast_channel *chan, const char *data)
return 0;
}
+static int mute_mixmonitor_full(struct ast_channel *chan, const char *data)
+{
+ struct ast_channel *c;
+ char *parse = "";
+ int clearmute = 1;
+ enum ast_audiohook_flags flag;
+
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(channel);
+ AST_APP_ARG(state);
+ AST_APP_ARG(direction);
+ );
+
+ if (!ast_strlen_zero(data)) {
+ parse = ast_strdupa(data);
+ }
+
+ AST_STANDARD_APP_ARGS(args, parse);
+
+ if (!strcasecmp(args.direction, "read")) {
+ flag = AST_AUDIOHOOK_MUTE_READ;
+ } else if (!strcasecmp(args.direction, "write")) {
+ flag = AST_AUDIOHOOK_MUTE_WRITE;
+ } else if (!strcasecmp(args.direction, "both")) {
+ flag = AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE;
+ } else {
+ ast_log(LOG_WARNING, "MuteMixMonitor: Invalid direction '%s' specified. Must be read, write or both.\n", args.direction);
+ return -1;
+ }
+
+ if (ast_strlen_zero(args.channel)) {
+ ast_log(LOG_WARNING, "MuteMixMonitor: No channel specified.\n");
+ return -1;
+ }
+
+ if (ast_strlen_zero(args.state)) {
+ ast_log(LOG_WARNING, "MuteMixMonitor: No state specified.\n");
+ return -1;
+ }
+
+ clearmute = ast_false(args.state);
+
+ c = ast_channel_get_by_name(args.channel);
+ if (!c) {
+ ast_log(LOG_WARNING, "MuteMixMonitor: No such channel '%s'.\n", args.channel);
+ return -1;
+ }
+
+ if (ast_audiohook_set_mute(c, mixmonitor_spy_type, flag, clearmute)) {
+ ast_channel_unref(c);
+ ast_log(LOG_WARNING, "MuteMixMonitor: Cannot set mute flag.\n");
+ return -1;
+ }
+
+ ast_channel_unref(c);
+
+ return 0;
+}
+
static int stop_mixmonitor_full(struct ast_channel *chan, const char *data)
{
struct ast_datastore *datastore = NULL;
@@ -1213,6 +1301,12 @@ static int stop_mixmonitor_full(struct ast_channel *chan, const char *data)
return 0;
}
+static int mute_mixmonitor_exec(struct ast_channel *chan, const char *data)
+{
+ mute_mixmonitor_full(chan, data);
+ return 0;
+}
+
static int stop_mixmonitor_exec(struct ast_channel *chan, const char *data)
{
stop_mixmonitor_full(chan, data);
@@ -1541,6 +1635,7 @@ static int unload_module(void)
ast_cli_unregister_multiple(cli_mixmonitor, ARRAY_LEN(cli_mixmonitor));
res = ast_unregister_application(stop_app);
+ res |= ast_unregister_application(mute_app);
res |= ast_unregister_application(app);
res |= ast_manager_unregister("MixMonitorMute");
res |= ast_manager_unregister("MixMonitor");
@@ -1558,6 +1653,7 @@ static int load_module(void)
ast_cli_register_multiple(cli_mixmonitor, ARRAY_LEN(cli_mixmonitor));
res = ast_register_application_xml(app, mixmonitor_exec);
res |= ast_register_application_xml(stop_app, stop_mixmonitor_exec);
+ res |= ast_register_application_xml(mute_app, mute_mixmonitor_exec);
res |= ast_manager_register_xml("MixMonitorMute", EVENT_FLAG_SYSTEM | EVENT_FLAG_CALL, manager_mute_mixmonitor);
res |= ast_manager_register_xml("MixMonitor", EVENT_FLAG_SYSTEM, manager_mixmonitor);
res |= ast_manager_register_xml("StopMixMonitor", EVENT_FLAG_SYSTEM | EVENT_FLAG_CALL, manager_stop_mixmonitor);