diff options
author | (no author) <(no author)@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-03-18 17:30:05 +0000 |
---|---|---|
committer | (no author) <(no author)@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-03-18 17:30:05 +0000 |
commit | 19dac2da2f45cd22eec8d3b7c9553606af08df84 (patch) | |
tree | 09bef9b300adb5728db05366cfe9570832e2947e /app.c | |
parent | 27a9c96742202c8188b53a0173649de479256b69 (diff) |
This commit was manufactured by cvs2svn to create tag 'v1-0-7'.
git-svn-id: http://svn.digium.com/svn/asterisk/tags/v1-0-7@5203 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'app.c')
-rwxr-xr-x | app.c | 96 |
1 files changed, 72 insertions, 24 deletions
@@ -518,7 +518,7 @@ int ast_play_and_wait(struct ast_channel *chan, char *fn) 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 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi 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 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi } } - 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 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi 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 */ @@ -706,10 +710,12 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi for (x=0;x<fmtcnt;x++) { if (!others[x]) break; - if (totalsilence) - ast_stream_rewind(others[x], totalsilence-200); - else - ast_stream_rewind(others[x], 200); + if (res > 0) { + if (totalsilence) + ast_stream_rewind(others[x], totalsilence-200); + else + ast_stream_rewind(others[x], 200); + } ast_truncstream(others[x]); ast_closestream(others[x]); } @@ -718,14 +724,13 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name); } } - if (outmsg) { - if (outmsg > 1) { + if (outmsg > 1) { /* Let them know recording is stopped */ - ast_streamfile(chan, "auth-thankyou", chan->language); + if(!ast_streamfile(chan, "auth-thankyou", chan->language)) ast_waitstream(chan, ""); - } } - + if (sildet) + ast_dsp_free(sildet); return res; } @@ -961,3 +966,46 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf 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); +} + |