]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 257713 via svnmerge from
authorDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Fri, 16 Apr 2010 21:28:10 +0000 (21:28 +0000)
committerDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Fri, 16 Apr 2010 21:28:10 +0000 (21:28 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r257713 | dhubbard | 2010-04-16 16:22:30 -0500 (Fri, 16 Apr 2010) | 28 lines

  Merged revisions 257686 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r257686 | dhubbard | 2010-04-16 16:15:43 -0500 (Fri, 16 Apr 2010) | 21 lines

    Make the mixmonitor thread process audio frames faster

    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.6.0@257738 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_mixmonitor.c

index d30130748a288cea99ab5e493eb99dbe98102117..4b127e30283769e9c8a5f27b4bb56d0b77d3d15e 100644 (file)
@@ -245,13 +245,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 */