diff options
-rw-r--r-- | apps/app_voicemail.c | 5 | ||||
-rw-r--r-- | main/app.c | 14 |
2 files changed, 15 insertions, 4 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 1ae60edda..3b1b25b60 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -4851,7 +4851,10 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc if (!res) { make_file(vms->fn, sizeof(vms->fn), vms->curdir, vms->curmsg); vms->heard[vms->curmsg] = 1; - res = wait_file(chan, vms, vms->fn); + if ((res = wait_file(chan, vms, vms->fn)) < 0) { + ast_log(LOG_WARNING, "Playback of message %s failed\n", vms->fn); + res = 0; + } } DISPOSE(vms->curdir, vms->curmsg); return res; diff --git a/main/app.c b/main/app.c index 68310d359..20064af14 100644 --- a/main/app.c +++ b/main/app.c @@ -743,8 +743,6 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, } else { ast_frfree(f); } - if (end == start) - end = time(NULL); } else { ast_log(LOG_WARNING, "Error creating writestream '%s', format '%s'\n", recordfile, sfmt[x]); } @@ -753,7 +751,17 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, if (silgen) ast_channel_stop_silence_generator(chan, silgen); } - *duration = end - start; + + /*!\note + * Instead of asking how much time passed (end - start), calculate the number + * of seconds of audio which actually went into the file. This fixes a + * problem where audio is stopped up on the network and never gets to us. + * + * Note that we still want to use the number of seconds passed for the max + * message, otherwise we could get a situation where this stream is never + * closed (which would create a resource leak). + */ + *duration = ast_tellstream(others[0]) / 8000; if (!prepend) { for (x = 0; x < fmtcnt; x++) { |