[svn-commits] trunk r33842 - in /trunk: ./ apps/app_mixmonitor.c
svn-commits at lists.digium.com
svn-commits at lists.digium.com
Tue Jun 13 06:40:59 MST 2006
Author: kpfleming
Date: Tue Jun 13 08:40:58 2006
New Revision: 33842
URL: http://svn.digium.com/view/asterisk?rev=33842&view=rev
Log:
Merged revisions 33841 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2
........
r33841 | kpfleming | 2006-06-13 08:30:06 -0500 (Tue, 13 Jun 2006) | 2 lines
memory allocation optimizations
........
Modified:
trunk/ (props changed)
trunk/apps/app_mixmonitor.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.
Modified: trunk/apps/app_mixmonitor.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_mixmonitor.c?rev=33842&r1=33841&r2=33842&view=diff
==============================================================================
--- trunk/apps/app_mixmonitor.c (original)
+++ trunk/apps/app_mixmonitor.c Tue Jun 13 08:40:58 2006
@@ -92,7 +92,7 @@
static const char *mixmonitor_spy_type = "MixMonitor";
struct mixmonitor {
- struct ast_channel_spy *spy;
+ struct ast_channel_spy spy;
struct ast_filestream *fs;
char *post_process;
char *name;
@@ -135,7 +135,7 @@
return;
ast_channel_lock(chan);
- ast_channel_spy_remove(spy->chan, spy);
+ ast_channel_spy_remove(chan, spy);
ast_channel_unlock(chan);
}
@@ -169,24 +169,24 @@
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "Begin MixMonitor Recording %s\n", mixmonitor->name);
- ast_mutex_lock(&mixmonitor->spy->lock);
-
- while (mixmonitor->spy->chan) {
- struct ast_frame *next = NULL;
+ ast_mutex_lock(&mixmonitor->spy.lock);
+
+ while (mixmonitor->spy.chan) {
+ struct ast_frame *next;
int write;
- ast_channel_spy_trigger_wait(mixmonitor->spy);
+ ast_channel_spy_trigger_wait(&mixmonitor->spy);
- if (!mixmonitor->spy->chan || mixmonitor->spy->status != CHANSPY_RUNNING) {
+ if (!mixmonitor->spy.chan || mixmonitor->spy.status != CHANSPY_RUNNING) {
break;
}
while (1) {
- if (!(f = ast_channel_spy_read_frame(mixmonitor->spy, SAMPLES_PER_FRAME)))
+ if (!(f = ast_channel_spy_read_frame(&mixmonitor->spy, SAMPLES_PER_FRAME)))
break;
write = (!ast_test_flag(mixmonitor, MUXFLAG_BRIDGED) ||
- ast_bridged_channel(mixmonitor->spy->chan));
+ ast_bridged_channel(mixmonitor->spy.chan));
/* it is possible for ast_channel_spy_read_frame() to return a chain
of frames if a queue flush was necessary, so process them
@@ -200,27 +200,23 @@
}
}
- ast_mutex_unlock(&mixmonitor->spy->lock);
-
- stopmon(mixmonitor->spy);
+ ast_mutex_unlock(&mixmonitor->spy.lock);
+
+ stopmon(&mixmonitor->spy);
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "End MixMonitor Recording %s\n", mixmonitor->name);
- if (!ast_strlen_zero(mixmonitor->post_process)) {
+ if (mixmonitor->post_process) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_2 "Executing [%s]\n", mixmonitor->post_process);
ast_safe_system(mixmonitor->post_process);
}
- ast_mutex_destroy(&mixmonitor->spy->lock);
+ ast_mutex_destroy(&mixmonitor->spy.lock);
ast_closestream(mixmonitor->fs);
- /* Deallocate everything */
- free(mixmonitor->spy);
- free(mixmonitor->post_process);
- free(mixmonitor->name);
free(mixmonitor);
ast_atomic_fetchadd_int(&__mod_desc->usecnt, -1);
@@ -234,23 +230,42 @@
pthread_attr_t attr;
pthread_t thread;
struct mixmonitor *mixmonitor;
- char *file_name, *postprocess, *ext, postprocess2[1024] = "";
+ char *file_name, *ext;
+ char postprocess2[1024] = "";
unsigned int oflags;
-
- if (!(mixmonitor = ast_calloc(1, sizeof(*mixmonitor)))) {
- ast_log(LOG_ERROR, "Memory Error!\n");
+ size_t len;
+
+ len = sizeof(*mixmonitor) + strlen(chan->name) + 1;
+
+ /* If a post process system command is given attach it to the structure */
+ if (!ast_strlen_zero(post_process)) {
+ char *p1, *p2;
+
+ p1 = ast_strdupa(post_process);
+ for (p2 = p1; *p2 ; p2++) {
+ if (*p2 == '^' && *(p2+1) == '{') {
+ *p2 = '$';
+ }
+ }
+
+ pbx_substitute_variables_helper(chan, p1, postprocess2, sizeof(postprocess2) - 1);
+ if (!ast_strlen_zero(postprocess2))
+ len += strlen(postprocess2) + 1;
+ }
+
+ /* Pre-allocate mixmonitor structure and spy */
+ if (!(mixmonitor = calloc(1, len))) {
return;
}
-
- if (!(mixmonitor->spy = ast_calloc(1, sizeof(*mixmonitor->spy)))) {
- ast_log(LOG_ERROR, "Memory Error!\n");
- free(mixmonitor);
- return;
- }
/* Copy over flags and channel name */
mixmonitor->flags = flags;
- mixmonitor->name = ast_strdup(chan->name);
+ mixmonitor->name = (char *) mixmonitor + sizeof(*mixmonitor);
+ strcpy(mixmonitor->name, chan->name);
+ if (!ast_strlen_zero(postprocess2)) {
+ mixmonitor->post_process = mixmonitor->name + strlen(mixmonitor->name) + 1;
+ strcpy(mixmonitor->post_process, postprocess2);
+ }
/* Determine creation flags and filename plus extension for filestream */
oflags = O_CREAT | O_WRONLY;
@@ -266,51 +281,33 @@
mixmonitor->fs = ast_writefile(file_name, ext, NULL, oflags, 0, 0644);
if (!mixmonitor->fs) {
ast_log(LOG_ERROR, "Cannot open %s.%s\n", file_name, ext);
- free(mixmonitor->name);
- free(mixmonitor->spy);
free(mixmonitor);
return;
}
- /* If a post process system command is given attach it to the structure */
- if (!ast_strlen_zero(post_process)) {
- char *p = NULL;
- postprocess = ast_strdupa(post_process);
- for (p = postprocess; *p ; p++) {
- if (*p == '^' && *(p+1) == '{') {
- *p = '$';
- }
- }
- pbx_substitute_variables_helper(chan, postprocess, postprocess2, sizeof(postprocess2) - 1);
- mixmonitor->post_process = strdup(postprocess2);
- }
-
/* Setup the actual spy before creating our thread */
- ast_set_flag(mixmonitor->spy, CHANSPY_FORMAT_AUDIO);
- ast_set_flag(mixmonitor->spy, CHANSPY_MIXAUDIO);
- mixmonitor->spy->type = mixmonitor_spy_type;
- mixmonitor->spy->status = CHANSPY_RUNNING;
- mixmonitor->spy->read_queue.format = AST_FORMAT_SLINEAR;
- mixmonitor->spy->write_queue.format = AST_FORMAT_SLINEAR;
+ ast_set_flag(&mixmonitor->spy, CHANSPY_FORMAT_AUDIO);
+ ast_set_flag(&mixmonitor->spy, CHANSPY_MIXAUDIO);
+ mixmonitor->spy.type = mixmonitor_spy_type;
+ mixmonitor->spy.status = CHANSPY_RUNNING;
+ mixmonitor->spy.read_queue.format = AST_FORMAT_SLINEAR;
+ mixmonitor->spy.write_queue.format = AST_FORMAT_SLINEAR;
if (readvol) {
- ast_set_flag(mixmonitor->spy, CHANSPY_READ_VOLADJUST);
- mixmonitor->spy->read_vol_adjustment = readvol;
+ ast_set_flag(&mixmonitor->spy, CHANSPY_READ_VOLADJUST);
+ mixmonitor->spy.read_vol_adjustment = readvol;
}
if (writevol) {
- ast_set_flag(mixmonitor->spy, CHANSPY_WRITE_VOLADJUST);
- mixmonitor->spy->write_vol_adjustment = writevol;
- }
- ast_mutex_init(&mixmonitor->spy->lock);
-
- if (startmon(chan, mixmonitor->spy)) {
+ ast_set_flag(&mixmonitor->spy, CHANSPY_WRITE_VOLADJUST);
+ mixmonitor->spy.write_vol_adjustment = writevol;
+ }
+ ast_mutex_init(&mixmonitor->spy.lock);
+
+ if (startmon(chan, &mixmonitor->spy)) {
ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n",
- mixmonitor->spy->type, chan->name);
+ mixmonitor->spy.type, chan->name);
/* Since we couldn't add ourselves - bail out! */
- ast_mutex_destroy(&mixmonitor->spy->lock);
- free(mixmonitor->post_process);
+ ast_mutex_destroy(&mixmonitor->spy.lock);
ast_closestream(mixmonitor->fs);
- free(mixmonitor->name);
- free(mixmonitor->spy);
free(mixmonitor);
return;
}
More information about the svn-commits
mailing list