]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 279949 via svnmerge from
authorDavid Vossel <dvossel@digium.com>
Tue, 27 Jul 2010 20:59:16 +0000 (20:59 +0000)
committerDavid Vossel <dvossel@digium.com>
Tue, 27 Jul 2010 20:59:16 +0000 (20:59 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

................
  r279949 | dvossel | 2010-07-27 15:57:00 -0500 (Tue, 27 Jul 2010) | 31 lines

  Merged revisions 279946 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.6.2

  ................
    r279946 | dvossel | 2010-07-27 15:54:32 -0500 (Tue, 27 Jul 2010) | 24 lines

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

    ........
      r279945 | dvossel | 2010-07-27 15:33:40 -0500 (Tue, 27 Jul 2010) | 19 lines

      remove empty audiohook write list on channel

      If a channel has an audiohook write list created on it, that
      list stays on the channel until the channel is destroyed.  There
      is no reason to keep that list on the channel if it becomes empty.
      If it is empty that just means we are doing needless translating
      for every ast_read and ast_write.  This patch removes the audiohook
      list from the channel once it is detected to be empty on either a
      read or write.  If a audiohook is added back to the channel after
      this list is destroyed, the list just gets recreated as if it never
      existed to begin with.

      (closes issue #17630)
      Reported by: manvirr

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

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

include/asterisk/audiohook.h
main/audiohook.c
main/channel.c

index 6d773bf9076274bea97ff61667364341b0f00aab..abf6ca34574dfe7ecd089d2ca5afbeca4fd591b1 100644 (file)
@@ -202,6 +202,13 @@ int ast_audiohook_detach_source(struct ast_channel *chan, const char *source);
  */
 int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audiohook);
 
+/*!
+ * \brief determines if a audiohook_list is empty or not.
+ *
+ * retval 0 false, 1 true
+ */
+int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list);
+
 /*! \brief Pass a frame off to be handled by the audiohook core
  * \param chan Channel that the list is coming off of
  * \param audiohook_list List of audiohooks
index 031f36e7e54cbe9d313cf427d0e427c8742488e1..ad977ecbc60f31f85350bc508de0b0eaab7e6876 100644 (file)
@@ -735,6 +735,17 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
        return end_frame;
 }
 
+int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
+{
+       if (AST_LIST_EMPTY(&audiohook_list->spy_list) &&
+               AST_LIST_EMPTY(&audiohook_list->whisper_list) &&
+               AST_LIST_EMPTY(&audiohook_list->manipulate_list)) {
+
+               return 1;
+       }
+       return 0;
+}
+
 /*! \brief Pass a frame off to be handled by the audiohook core
  * \param chan Channel that the list is coming off of
  * \param audiohook_list List of audiohooks
@@ -752,7 +763,6 @@ struct ast_frame *ast_audiohook_write_list(struct ast_channel *chan, struct ast_
        else
                return frame;
 }
-                       
 
 /*! \brief Wait for audiohook trigger to be triggered
  * \param audiohook Audiohook to wait on
index 00f3f78637c5d157d860d763ed5607d8c0197a78..fc7ade9851db2381fdb7f36a3528421ae106e5ea 100644 (file)
@@ -4064,6 +4064,11 @@ done:
        if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END)
                chan->generator->digit(chan, f->subclass.integer);
 
+       if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) {
+               /* The list gets recreated if audiohooks are added again later */
+               ast_audiohook_detach_list(chan->audiohooks);
+               chan->audiohooks = NULL;
+       }
        ast_channel_unlock(chan);
        return f;
 }
@@ -4801,6 +4806,11 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
                chan->fout = FRAMECOUNT_INC(chan->fout);
        }
 done:
+       if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) {
+               /* The list gets recreated if audiohooks are added again later */
+               ast_audiohook_detach_list(chan->audiohooks);
+               chan->audiohooks = NULL;
+       }
        ast_channel_unlock(chan);
        return res;
 }