#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) |
Definition in file monitor.h.
enum AST_MONITORING_STATE |
Definition at line 28 of file monitor.h.
00028 { 00029 AST_MONITOR_RUNNING, 00030 AST_MONITOR_PAUSED 00031 };
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().
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 }