--- channel.c.orig Sun Jul 29 19:53:10 2007
+++ channel.c Sun Jul 29 22:31:24 2007
@@ -895,9 +895,10 @@
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
{
struct ast_frame *f;
- struct ast_frame *cur;
+ struct ast_frame *prev, *cur, *next;
int blah = 1;
int qlen = 0;
+ int vqlen = 0;
/* Build us a copy and free the original one */
if (!(f = ast_frdup(fin))) {
@@ -905,6 +906,46 @@
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.
+ */
+ prev = cur = AST_LIST_FIRST(&chan->readq);
+ while (cur && vqlen > 2) {
+ next = AST_LIST_NEXT(cur, frame_list);
+ if (cur->frametype == AST_FRAME_VOICE) {
+ /* remove from queue */
+ if (cur == AST_LIST_FIRST(&chan->readq)) {
+ AST_LIST_INSERT_TAIL(&chan->readq, next, frame_list);
+ } else {
+ /*prev->next = next;*/
+ AST_LIST_INSERT_AFTER(&chan->readq, prev, next, frame_list);
+ }
+ ast_frfree(cur);
+ vqlen--;
+ } else {
+ prev = cur;
+ }
+ cur = next;
+ }
+
+ prev = NULL;
+ next = NULL;
+ cur = AST_LIST_FIRST(&chan->readq);
+
/* 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)) {