Fri Aug 24 02:27:39 2007

Asterisk developer's documentation


monitor.h File Reference

Channel monitoring. More...

#include "asterisk/channel.h"

Include dependency graph for monitor.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_channel_monitor

Enumerations

enum  AST_MONITORING_STATE { AST_MONITOR_RUNNING, AST_MONITOR_PAUSED }

Functions

int ast_monitor_change_fname (struct ast_channel *chan, const char *fname_base, int need_lock)
int ast_monitor_pause (struct ast_channel *chan)
void ast_monitor_setjoinfiles (struct ast_channel *chan, int turnon)
int ast_monitor_start (struct ast_channel *chan, const char *format_spec, const char *fname_base, int need_lock)
int ast_monitor_stop (struct ast_channel *chan, int need_lock)
int ast_monitor_unpause (struct ast_channel *chan)


Detailed Description

Channel monitoring.

Definition in file monitor.h.


Enumeration Type Documentation

enum AST_MONITORING_STATE

Enumerator:
AST_MONITOR_RUNNING 
AST_MONITOR_PAUSED 

Definition at line 28 of file monitor.h.

00028                           {
00029    AST_MONITOR_RUNNING,
00030    AST_MONITOR_PAUSED
00031 };


Function Documentation

int ast_monitor_change_fname ( struct ast_channel chan,
const char *  fname_base,
int  need_lock 
)

Definition at line 355 of file res_monitor.c.

References ast_config_AST_MONITOR_DIR, ast_log(), ast_safe_system(), ast_strlen_zero(), ast_channel_monitor::filename_base, ast_channel_monitor::filename_changed, FILENAME_MAX, free, LOCK_IF_NEEDED, LOG_WARNING, ast_channel::monitor, name, strdup, and UNLOCK_IF_NEEDED.

Referenced by change_monitor_action(), change_monitor_exec(), start_monitor_action(), and start_monitor_exec().

00356 {
00357    char tmp[256];
00358    if (ast_strlen_zero(fname_base)) {
00359       ast_log(LOG_WARNING, "Cannot change monitor filename of channel %s to null\n", chan->name);
00360       return -1;
00361    }
00362 
00363    LOCK_IF_NEEDED(chan, need_lock);
00364 
00365    if (chan->monitor) {
00366       int directory = strchr(fname_base, '/') ? 1 : 0;
00367       /* try creating the directory just in case it doesn't exist */
00368       if (directory) {
00369          char *name = strdup(fname_base);
00370          snprintf(tmp, sizeof(tmp), "mkdir -p %s",dirname(name));
00371          free(name);
00372          ast_safe_system(tmp);
00373       }
00374 
00375       snprintf(chan->monitor->filename_base, FILENAME_MAX, "%s/%s", directory ? "" : ast_config_AST_MONITOR_DIR, fname_base);
00376       chan->monitor->filename_changed = 1;
00377    } else {
00378       ast_log(LOG_WARNING, "Cannot change monitor filename of channel %s to %s, monitoring not started\n", chan->name, fname_base);
00379    }
00380 
00381    UNLOCK_IF_NEEDED(chan, need_lock);
00382 
00383    return 0;
00384 }

int ast_monitor_pause ( struct ast_channel chan  ) 

Definition at line 333 of file res_monitor.c.

References AST_MONITOR_PAUSED, and ast_monitor_set_state().

Referenced by do_pause_or_unpause(), and pause_monitor_exec().

00334 {
00335    return ast_monitor_set_state(chan, AST_MONITOR_PAUSED);
00336 }

void ast_monitor_setjoinfiles ( struct ast_channel chan,
int  turnon 
)

Definition at line 591 of file res_monitor.c.

References ast_channel_monitor::joinfiles, and ast_channel::monitor.

Referenced by __agent_start_monitoring(), start_monitor_action(), start_monitor_exec(), and try_calling().

00592 {
00593    if (chan->monitor)
00594       chan->monitor->joinfiles = turnon;
00595 }

int ast_monitor_start ( struct ast_channel chan,
const char *  format_spec,
const char *  fname_base,
int  need_lock 
)

Definition at line 126 of file res_monitor.c.

References ast_calloc, ast_closestream(), ast_config_AST_MONITOR_DIR, ast_filedelete(), ast_fileexists(), ast_log(), AST_MONITOR_RUNNING, ast_monitor_set_state(), ast_monitor_stop(), ast_mutex_lock(), ast_mutex_unlock(), ast_safe_system(), ast_strdupa, ast_strlen_zero(), ast_writefile(), FILENAME_MAX, free, LOCK_IF_NEEDED, LOG_DEBUG, LOG_WARNING, ast_channel::monitor, monitor, name, pbx_builtin_setvar_helper(), strdup, and UNLOCK_IF_NEEDED.

Referenced by __agent_start_monitoring(), start_monitor_action(), start_monitor_exec(), and try_calling().

00128 {
00129    int res = 0;
00130    char tmp[256];
00131 
00132    LOCK_IF_NEEDED(chan, need_lock);
00133 
00134    if (!(chan->monitor)) {
00135       struct ast_channel_monitor *monitor;
00136       char *channel_name, *p;
00137 
00138       /* Create monitoring directory if needed */
00139       if (mkdir(ast_config_AST_MONITOR_DIR, 0770) < 0) {
00140          if (errno != EEXIST) {
00141             ast_log(LOG_WARNING, "Unable to create audio monitor directory: %s\n",
00142                strerror(errno));
00143          }
00144       }
00145 
00146       if (!(monitor = ast_calloc(1, sizeof(*monitor)))) {
00147          UNLOCK_IF_NEEDED(chan, need_lock);
00148          return -1;
00149       }
00150 
00151       /* Determine file names */
00152       if (!ast_strlen_zero(fname_base)) {
00153          int directory = strchr(fname_base, '/') ? 1 : 0;
00154          /* try creating the directory just in case it doesn't exist */
00155          if (directory) {
00156             char *name = strdup(fname_base);
00157             snprintf(tmp, sizeof(tmp), "mkdir -p \"%s\"",dirname(name));
00158             free(name);
00159             ast_safe_system(tmp);
00160          }
00161          snprintf(monitor->read_filename, FILENAME_MAX, "%s/%s-in",
00162                   directory ? "" : ast_config_AST_MONITOR_DIR, fname_base);
00163          snprintf(monitor->write_filename, FILENAME_MAX, "%s/%s-out",
00164                   directory ? "" : ast_config_AST_MONITOR_DIR, fname_base);
00165          ast_copy_string(monitor->filename_base, fname_base, sizeof(monitor->filename_base));
00166       } else {
00167          ast_mutex_lock(&monitorlock);
00168          snprintf(monitor->read_filename, FILENAME_MAX, "%s/audio-in-%ld",
00169                   ast_config_AST_MONITOR_DIR, seq);
00170          snprintf(monitor->write_filename, FILENAME_MAX, "%s/audio-out-%ld",
00171                   ast_config_AST_MONITOR_DIR, seq);
00172          seq++;
00173          ast_mutex_unlock(&monitorlock);
00174 
00175          channel_name = ast_strdupa(chan->name);
00176          while ((p = strchr(channel_name, '/'))) {
00177             *p = '-';
00178          }
00179          snprintf(monitor->filename_base, FILENAME_MAX, "%s/%d-%s",
00180                 ast_config_AST_MONITOR_DIR, (int)time(NULL), channel_name);
00181          monitor->filename_changed = 1;
00182       }
00183 
00184       monitor->stop = ast_monitor_stop;
00185 
00186       /* Determine file format */
00187       if (!ast_strlen_zero(format_spec)) {
00188          monitor->format = strdup(format_spec);
00189       } else {
00190          monitor->format = strdup("wav");
00191       }
00192       
00193       /* open files */
00194       if (ast_fileexists(monitor->read_filename, NULL, NULL) > 0) {
00195          ast_filedelete(monitor->read_filename, NULL);
00196       }
00197       if (!(monitor->read_stream = ast_writefile(monitor->read_filename,
00198                   monitor->format, NULL,
00199                   O_CREAT|O_TRUNC|O_WRONLY, 0, 0644))) {
00200          ast_log(LOG_WARNING, "Could not create file %s\n",
00201                   monitor->read_filename);
00202          free(monitor);
00203          UNLOCK_IF_NEEDED(chan, need_lock);
00204          return -1;
00205       }
00206       if (ast_fileexists(monitor->write_filename, NULL, NULL) > 0) {
00207          ast_filedelete(monitor->write_filename, NULL);
00208       }
00209       if (!(monitor->write_stream = ast_writefile(monitor->write_filename,
00210                   monitor->format, NULL,
00211                   O_CREAT|O_TRUNC|O_WRONLY, 0, 0644))) {
00212          ast_log(LOG_WARNING, "Could not create file %s\n",
00213                   monitor->write_filename);
00214          ast_closestream(monitor->read_stream);
00215          free(monitor);
00216          UNLOCK_IF_NEEDED(chan, need_lock);
00217          return -1;
00218       }
00219       chan->monitor = monitor;
00220       ast_monitor_set_state(chan, AST_MONITOR_RUNNING);
00221       /* so we know this call has been monitored in case we need to bill for it or something */
00222       pbx_builtin_setvar_helper(chan, "__MONITORED","true");
00223    } else {
00224       ast_log(LOG_DEBUG,"Cannot start monitoring %s, already monitored\n",
00225                chan->name);
00226       res = -1;
00227    }
00228 
00229    UNLOCK_IF_NEEDED(chan, need_lock);
00230 
00231    return res;
00232 }

int ast_monitor_stop ( struct ast_channel chan,
int  need_lock 
)

Definition at line 252 of file res_monitor.c.

References ast_closestream(), ast_config_AST_MONITOR_DIR, ast_filedelete(), ast_fileexists(), ast_filerename(), ast_log(), ast_safe_system(), ast_strlen_zero(), ast_channel_monitor::filename_base, ast_channel_monitor::filename_changed, FILENAME_MAX, ast_channel_monitor::format, format, free, get_soxmix_format(), ast_channel_monitor::joinfiles, LOCK_IF_NEEDED, LOG_DEBUG, LOG_WARNING, ast_channel::monitor, name, pbx_builtin_getvar_helper(), ast_channel_monitor::read_filename, ast_channel_monitor::read_stream, UNLOCK_IF_NEEDED, ast_channel_monitor::write_filename, and ast_channel_monitor::write_stream.

Referenced by ast_monitor_start(), builtin_automonitor(), stop_monitor_action(), and stop_monitor_exec().

00253 {
00254    int delfiles = 0;
00255 
00256    LOCK_IF_NEEDED(chan, need_lock);
00257 
00258    if (chan->monitor) {
00259       char filename[ FILENAME_MAX ];
00260 
00261       if (chan->monitor->read_stream) {
00262          ast_closestream(chan->monitor->read_stream);
00263       }
00264       if (chan->monitor->write_stream) {
00265          ast_closestream(chan->monitor->write_stream);
00266       }
00267 
00268       if (chan->monitor->filename_changed && !ast_strlen_zero(chan->monitor->filename_base)) {
00269          if (ast_fileexists(chan->monitor->read_filename,NULL,NULL) > 0) {
00270             snprintf(filename, FILENAME_MAX, "%s-in", chan->monitor->filename_base);
00271             if (ast_fileexists(filename, NULL, NULL) > 0) {
00272                ast_filedelete(filename, NULL);
00273             }
00274             ast_filerename(chan->monitor->read_filename, filename, chan->monitor->format);
00275          } else {
00276             ast_log(LOG_WARNING, "File %s not found\n", chan->monitor->read_filename);
00277          }
00278 
00279          if (ast_fileexists(chan->monitor->write_filename,NULL,NULL) > 0) {
00280             snprintf(filename, FILENAME_MAX, "%s-out", chan->monitor->filename_base);
00281             if (ast_fileexists(filename, NULL, NULL) > 0) {
00282                ast_filedelete(filename, NULL);
00283             }
00284             ast_filerename(chan->monitor->write_filename, filename, chan->monitor->format);
00285          } else {
00286             ast_log(LOG_WARNING, "File %s not found\n", chan->monitor->write_filename);
00287          }
00288       }
00289 
00290       if (chan->monitor->joinfiles && !ast_strlen_zero(chan->monitor->filename_base)) {
00291          char tmp[1024];
00292          char tmp2[1024];
00293          const char *format = !strcasecmp(chan->monitor->format,"wav49") ? "WAV" : chan->monitor->format;
00294          char *name = chan->monitor->filename_base;
00295          int directory = strchr(name, '/') ? 1 : 0;
00296          char *dir = directory ? "" : ast_config_AST_MONITOR_DIR;
00297          const char *execute, *execute_args;
00298 
00299          /* Set the execute application */
00300          execute = pbx_builtin_getvar_helper(chan, "MONITOR_EXEC");
00301          if (ast_strlen_zero(execute)) { 
00302             execute = "nice -n 19 soxmix";
00303             format = get_soxmix_format(format);
00304             delfiles = 1;
00305          } 
00306          execute_args = pbx_builtin_getvar_helper(chan, "MONITOR_EXEC_ARGS");
00307          if (ast_strlen_zero(execute_args)) {
00308             execute_args = "";
00309          }
00310          
00311          snprintf(tmp, sizeof(tmp), "%s \"%s/%s-in.%s\" \"%s/%s-out.%s\" \"%s/%s.%s\" %s &", execute, dir, name, format, dir, name, format, dir, name, format,execute_args);
00312          if (delfiles) {
00313             snprintf(tmp2,sizeof(tmp2), "( %s& rm -f \"%s/%s-\"* ) &",tmp, dir ,name); /* remove legs when done mixing */
00314             ast_copy_string(tmp, tmp2, sizeof(tmp));
00315          }
00316          ast_log(LOG_DEBUG,"monitor executing %s\n",tmp);
00317          if (ast_safe_system(tmp) == -1)
00318             ast_log(LOG_WARNING, "Execute of %s failed.\n",tmp);
00319       }
00320       
00321       free(chan->monitor->format);
00322       free(chan->monitor);
00323       chan->monitor = NULL;
00324    }
00325 
00326    UNLOCK_IF_NEEDED(chan, need_lock);
00327 
00328    return 0;
00329 }

int ast_monitor_unpause ( struct ast_channel chan  ) 

Definition at line 339 of file res_monitor.c.

References AST_MONITOR_RUNNING, and ast_monitor_set_state().

Referenced by do_pause_or_unpause(), and unpause_monitor_exec().

00340 {
00341    return ast_monitor_set_state(chan, AST_MONITOR_RUNNING);
00342 }


Generated on Fri Aug 24 02:27:39 2007 for Asterisk - the Open Source PBX by  doxygen 1.5.1