action on the current channel.</para>
</description>
</manager>
+ <function name="MIXMONITOR" language="en_US">
+ <synopsis>
+ Retrieve data pertaining to specific instances of MixMonitor on a channel.
+ </synopsis>
+ <syntax>
+ <parameter name="id" required="true">
+ <para>The unique ID of the MixMonitor instance. The unique ID can be retrieved through the channel
+ variable used as an argument to the <replaceable>i</replaceable> option to MixMonitor.</para>
+ </parameter>
+ <parameter name="key" required="true">
+ <para>The piece of data to retrieve from the MixMonitor.</para>
+ <enumlist>
+ <enum name="filename" />
+ </enumlist>
+ </parameter>
+ </syntax>
+ </function>
***/
struct ast_audiohook *audiohook;
unsigned int samp_rate;
+ char *filename;
};
/*!
ast_mutex_lock(&mixmonitor_ds->lock);
mixmonitor_ds->audiohook = NULL;
mixmonitor_ds->destruction_ok = 1;
+ ast_free(mixmonitor_ds->filename);
ast_cond_signal(&mixmonitor_ds->destruction_condition);
ast_mutex_unlock(&mixmonitor_ds->lock);
}
mixmonitor_ds->samp_rate = 8000;
mixmonitor_ds->audiohook = &mixmonitor->audiohook;
+ mixmonitor_ds->filename = ast_strdup(mixmonitor->filename);
datastore->data = mixmonitor_ds;
ast_channel_lock(chan);
return -1;
}
+ if (!ast_strlen_zero(filename)) {
+ mixmonitor->filename = ast_strdup(filename);
+ }
+
+ if (!ast_strlen_zero(filename_write)) {
+ mixmonitor->filename_write = ast_strdup(filename_write);
+ }
+
+ if (!ast_strlen_zero(filename_read)) {
+ mixmonitor->filename_read = ast_strdup(filename_read);
+ }
+
if (setup_mixmonitor_ds(mixmonitor, chan, &datastore_id)) {
ast_autochan_destroy(mixmonitor->autochan);
mixmonitor_free(mixmonitor);
mixmonitor->post_process = ast_strdup(postprocess2);
}
- if (!ast_strlen_zero(filename)) {
- mixmonitor->filename = ast_strdup(filename);
- }
-
- if (!ast_strlen_zero(filename_write)) {
- mixmonitor->filename_write = ast_strdup(filename_write);
- }
-
- if (!ast_strlen_zero(filename_read)) {
- mixmonitor->filename_read = ast_strdup(filename_read);
- }
-
if (!ast_strlen_zero(recipients)) {
char callerid[256];
struct ast_party_connected_line *connected;
return AMI_SUCCESS;
}
+static int func_mixmonitor_read(struct ast_channel *chan, const char *cmd, char *data,
+ char *buf, size_t len)
+{
+ struct ast_datastore *datastore;
+ struct mixmonitor_ds *ds_data;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(id);
+ AST_APP_ARG(key);
+ );
+
+ AST_STANDARD_APP_ARGS(args, data);
+
+ if (ast_strlen_zero(args.id) || ast_strlen_zero(args.key)) {
+ ast_log(LOG_WARNING, "Not enough arguments provided to %s. "
+ "An ID and key must be provided\n", cmd);
+ return -1;
+ }
+
+ ast_channel_lock(chan);
+ datastore = ast_channel_datastore_find(chan, &mixmonitor_ds_info, args.id);
+ ast_channel_unlock(chan);
+
+ if (!datastore) {
+ ast_log(LOG_WARNING, "Could not find MixMonitor with ID %s\n", args.id);
+ return -1;
+ }
+
+ ds_data = datastore->data;
+
+ if (!strcasecmp(args.key, "filename")) {
+ ast_copy_string(buf, ds_data->filename, len);
+ } else {
+ ast_log(LOG_WARNING, "Unrecognized %s option %s\n", cmd, args.key);
+ return -1;
+ }
+ return 0;
+}
+
+static struct ast_custom_function mixmonitor_function = {
+ .name = "MIXMONITOR",
+ .read = func_mixmonitor_read,
+};
+
static struct ast_cli_entry cli_mixmonitor[] = {
AST_CLI_DEFINE(handle_cli_mixmonitor, "Execute a MixMonitor command")
};
res |= ast_manager_unregister("MixMonitorMute");
res |= ast_manager_unregister("MixMonitor");
res |= ast_manager_unregister("StopMixMonitor");
+ res |= ast_custom_function_unregister(&mixmonitor_function);
res |= clear_mixmonitor_methods();
return res;
res |= ast_manager_register_xml("MixMonitorMute", 0, manager_mute_mixmonitor);
res |= ast_manager_register_xml("MixMonitor", 0, manager_mixmonitor);
res |= ast_manager_register_xml("StopMixMonitor", 0, manager_stop_mixmonitor);
+ res |= ast_custom_function_register(&mixmonitor_function);
res |= set_mixmonitor_methods();
return res;