]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make the mixmonitor thread process audio frames faster
authorDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Fri, 16 Apr 2010 21:15:43 +0000 (21:15 +0000)
committerDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Fri, 16 Apr 2010 21:15:43 +0000 (21:15 +0000)
Mantis issue 17078 reports MixMonitor recordings have shorter durations than
the call duration.  This was because the mixmonitor thread was not processing
frames from the audiohook fast enough.  The mixmonitor thread would slowly fall
behind the most recent audio frame and when the channel hangs up, the mixmonitor
thread would exit without processing the same number of frames as the channel;
leaving the mixmonitor recording shorter than actual call duration.

This revision fixes this issue by moving the ast_audiohook_trigger_wait() and
the subsequent audiohook.status check into the block where the
ast_audiohook_read_frame() function returns NULL.

(closes issue #17078)
Reported by: geoff2010
Patches:
      dw-M17078.patch uploaded by dhubbard (license 733)
Tested by: dhubbard, geoff2010

Review: https://reviewboard.asterisk.org/r/611/

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

apps/app_mixmonitor.c

index bb4a9da216ec51cdad09bb568d7cd7179a8fed7e..706c0f3d61fd907bab0dcc9a8d190b1dbc4cd5bb 100644 (file)
@@ -256,13 +256,14 @@ static void *mixmonitor_thread(void *obj)
        while (mixmonitor->audiohook.status == AST_AUDIOHOOK_STATUS_RUNNING && !mixmonitor->mixmonitor_ds->fs_quit) {
                struct ast_frame *fr = NULL;
 
-               ast_audiohook_trigger_wait(&mixmonitor->audiohook);
+               if (!(fr = ast_audiohook_read_frame(&mixmonitor->audiohook, SAMPLES_PER_FRAME, AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR))) {
+                       ast_audiohook_trigger_wait(&mixmonitor->audiohook);
 
-               if (mixmonitor->audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING)
-                       break;
-
-               if (!(fr = ast_audiohook_read_frame(&mixmonitor->audiohook, SAMPLES_PER_FRAME, AST_AUDIOHOOK_DIRECTION_BOTH, AST_FORMAT_SLINEAR)))
+                       if (mixmonitor->audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) {
+                               break;
+                       }
                        continue;
+               }
 
                /* audiohook lock is not required for the next block.
                 * Unlock it, but remember to lock it before looping or exiting */