[Asterisk-cvs] asterisk app.c,1.31.2.1,1.31.2.2
russell at lists.digium.com
russell at lists.digium.com
Sat Jan 29 00:51:41 CST 2005
Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv22029
Modified Files:
Tag: v1-0
app.c
Log Message:
fix simultaneous voicemail messages -- Thanks Robert! (bug #3394)
Index: app.c
===================================================================
RCS file: /usr/cvsroot/asterisk/app.c,v
retrieving revision 1.31.2.1
retrieving revision 1.31.2.2
diff -u -d -r1.31.2.1 -r1.31.2.2
--- app.c 26 Oct 2004 15:22:09 -0000 1.31.2.1
+++ app.c 29 Jan 2005 06:53:33 -0000 1.31.2.2
@@ -518,7 +518,7 @@
static int global_silence_threshold = 128;
static int global_maxsilence = 0;
-int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int silencethreshold, int maxsilence)
+int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int silencethreshold, int maxsilence, const char *path)
{
char d, *fmts;
char comment[256];
@@ -528,7 +528,7 @@
char *sfmt[MAX_OTHER_FORMATS];
char *stringp=NULL;
time_t start, end;
- struct ast_dsp *sildet; /* silence detector dsp */
+ struct ast_dsp *sildet=NULL; /* silence detector dsp */
int totalsilence = 0;
int dspsilence = 0;
int gotsilence = 0; /* did we timeout for silence? */
@@ -585,18 +585,22 @@
}
}
- sildet = ast_dsp_new(); /* Create the silence detector */
- if (!sildet) {
- ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
- return -1;
- }
- ast_dsp_set_threshold(sildet, silencethreshold);
+ if (path)
+ ast_unlock_path(path);
+
if (maxsilence > 0) {
+ sildet = ast_dsp_new(); /* Create the silence detector */
+ if (!sildet) {
+ ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
+ return -1;
+ }
+ ast_dsp_set_threshold(sildet, silencethreshold);
rfmt = chan->readformat;
res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
+ ast_dsp_free(sildet);
return -1;
}
}
@@ -640,13 +644,13 @@
totalsilence = 0;
if (totalsilence > maxsilence) {
- /* Ended happily with silence */
- if (option_verbose > 2)
- ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
- ast_frfree(f);
- gotsilence = 1;
- outmsg=2;
- break;
+ /* Ended happily with silence */
+ if (option_verbose > 2)
+ ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
+ ast_frfree(f);
+ gotsilence = 1;
+ outmsg=2;
+ break;
}
}
/* Exit on any error */
@@ -725,6 +729,8 @@
if(!ast_streamfile(chan, "auth-thankyou", chan->language))
ast_waitstream(chan, "");
}
+ if (sildet)
+ ast_dsp_free(sildet);
return res;
}
@@ -960,3 +966,46 @@
return res;
}
+int ast_lock_path(const char *path)
+{
+ char *s;
+ char *fs;
+ int res;
+ int fd;
+ time_t start;
+ s = alloca(strlen(path) + 10);
+ fs = alloca(strlen(path) + 20);
+ if (!fs || !s) {
+ ast_log(LOG_WARNING, "Out of memory!\n");
+ return -1;
+ }
+ snprintf(fs, strlen(path) + 19, "%s/%s-%08x", path, ".lock", rand());
+ fd = open(fs, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ if (fd < 0) {
+ fprintf(stderr, "Unable to create lock file: %s\n", strerror(errno));
+ return -1;
+ }
+ close(fd);
+ snprintf(s, strlen(path) + 9, "%s/%s", path, ".lock");
+ time(&start);
+ while (((res = link(fs, s)) < 0) && (errno == EEXIST) && (time(NULL) - start < 5))
+ usleep(1);
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Failed to lock path '%s': %s\n", path, strerror(errno));
+ }
+ unlink(fs);
+ ast_log(LOG_DEBUG, "Locked path '%s'\n", path);
+ return res;
+}
+
+int ast_unlock_path(const char *path)
+{
+ char *s;
+ s = alloca(strlen(path) + 10);
+ if (!s)
+ return -1;
+ snprintf(s, strlen(path) + 9, "%s/%s", path, ".lock");
+ ast_log(LOG_DEBUG, "Unlocked path '%s'\n", path);
+ return unlink(s);
+}
+
More information about the svn-commits
mailing list