]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 89540 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Sat, 24 Nov 2007 06:24:46 +0000 (06:24 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sat, 24 Nov 2007 06:24:46 +0000 (06:24 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r89540 | tilghman | 2007-11-24 00:19:23 -0600 (Sat, 24 Nov 2007) | 9 lines

Currently, zero-length voicemail messages cause a hangup in VoicemailMain.
This change fixes the problem, with a multi-faceted approach.  First, we
do our best to avoid these messages from being created in the first place,
and second, if that fails, we detect when the voicemail message is
zero-length and avoid exiting at that point.
Reported by: dtyoo
Patch by: gkloepfer,tilghman
(Closes issue #11083)

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@89541 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_voicemail.c
main/app.c

index 1ae60eddad6f90c4364fed311842b3984dffabac..3b1b25b60733bb6b8628ba7438b6846d901036d2 100644 (file)
@@ -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;
index 68310d35927d2b23cc45a4ad1f020616dcf1dfa9..20064af140ade06f057b59878925b75179acd7a8 100644 (file)
@@ -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++) {