> David,
> 
> >    1.4 has converted to using LIST macros to do list traversals and
> > manipulations. I'll have to rewrite the patch for that. No promises on
> > when I'll be able to get to that.
> >
> 
> I've attached my first attempt at this. It seems to be dropping a few
> initial frames during a call (announcements begin mid-word) and has
> segfaulted Asterisk a few times. My 1.4.x programming skills are
> nothing to write home about but perhaps someone can take a look both
> of our patches and see where I've gone wrong.

   Nice try, but you translated the patch a bit too literally. :-) It
needed to be re-implemented for use with the queue macros.
   Try the attached. Note that this is *completely* untested - I don't even
know for sure if it will compile - I don't run 1.4.x on any machines yet
...but nonetheless I think it will work perfectly. :-)
   Please let me know if/how it works for you.

-DG

David G. Lawrence
President
Download Technologies, Inc. - http://www.downloadtech.com - (866) 399 8500
The FreeBSD Project - http://www.freebsd.org
Pave the road of life with opportunities.
*** channel.c.orig      Fri Jul 20 11:22:24 2007
--- channel.c   Sun Jul 29 17:27:04 2007
***************
*** 898,903 ****
--- 898,904 ----
        struct ast_frame *cur;
        int blah = 1;
        int qlen = 0;
+       int vqlen = 0;
  
        /* Build us a copy and free the original one */
        if (!(f = ast_frdup(fin))) {
***************
*** 905,910 ****
--- 906,941 ----
                return -1;
        }
        ast_channel_lock(chan);
+       
+       /*
+        * Drop any previous voice frames beyond the limit.
+        */
+ 
+       /*
+        * First count up how many voice frames that we have.
+        */
+       AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
+               if (cur->frametype == AST_FRAME_VOICE) {
+                       vqlen++;
+               }
+       }
+ 
+       /*
+        * Now drop voice frames past the limit, currently 2 voice frames.
+        */
+ 
+       if (vqlen > 2) {
+               AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->readq, cur, frame_list) {
+                       if (cur->frametype == AST_FRAME_VOICE) {
+                               AST_LIST_REMOVE_CURRENT(&chan->readq, 
frame_list);
+                               ast_frfree(cur);
+                               vqlen--;
+                               if (vqlen <= 2)
+                                       break;
+                       }
+               }
+               AST_LIST_TRAVERSE_SAFE_END;
+       }
  
        /* See if the last frame on the queue is a hangup, if so don't queue 
anything */
        if ((cur = AST_LIST_LAST(&chan->readq)) && (cur->frametype == 
AST_FRAME_CONTROL) && (cur->subclass == AST_CONTROL_HANGUP)) {
_______________________________________________
--Bandwidth and Colocation Provided by http://www.api-digital.com--

Asterisk-BSD mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-bsd

Reply via email to