]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
simplify spy queue flushing logic, and always force a flush when one side gets full...
authorKevin P. Fleming <kpfleming@digium.com>
Tue, 11 Apr 2006 21:35:52 +0000 (21:35 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Tue, 11 Apr 2006 21:35:52 +0000 (21:35 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@19347 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c

index 011bdaef3e6dfb34039a4f5d82009f5726d56377..ae4c747e4e1bc9c4f29f5930e443a507e7f43eff 100644 (file)
--- a/channel.c
+++ b/channel.c
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
  *
  * Mark Spencer <markster@digium.com>
  *
@@ -1135,7 +1135,6 @@ static void queue_frame_to_spies(struct ast_channel *chan, struct ast_frame *f,
        struct ast_frame *translated_frame = NULL;
        struct ast_channel_spy *spy;
        struct ast_channel_spy_queue *queue;
-       struct ast_channel_spy_queue *other_queue;
        struct channel_spy_trans *trans;
        struct ast_frame *last;
 
@@ -1197,48 +1196,42 @@ static void queue_frame_to_spies(struct ast_channel *chan, struct ast_frame *f,
 
                if (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
                        if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
-                               other_queue = (dir == SPY_WRITE) ? &spy->read_queue : &spy->write_queue;
-
-                               if (other_queue->samples == 0) {
-                                       switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
-                                       case CHANSPY_TRIGGER_READ:
-                                               if (dir == SPY_WRITE) {
-                                                       ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
-                                                       ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
-                                                       if (option_debug)
-                                                               ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
-                                                                       spy->type, chan->name);
-                                               }
-                                               break;
-                                       case CHANSPY_TRIGGER_WRITE:
-                                               if (dir == SPY_READ) {
-                                                       ast_set_flag(spy, CHANSPY_TRIGGER_READ);
-                                                       ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
-                                                       if (option_debug)
-                                                               ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
-                                                                       spy->type, chan->name);
-                                               }
-                                               break;
+                               switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
+                               case CHANSPY_TRIGGER_READ:
+                                       if (dir == SPY_WRITE) {
+                                               ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
+                                               ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
+                                               if (option_debug)
+                                                       ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
+                                                               spy->type, chan->name);
                                        }
-                                       if (option_debug)
-                                               ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
-                                                       spy->type, chan->name);
-                                       ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
-                                       ast_cond_signal(&spy->trigger);
-                                       ast_mutex_unlock(&spy->lock);
-                                       continue;
+                                       break;
+                               case CHANSPY_TRIGGER_WRITE:
+                                       if (dir == SPY_READ) {
+                                               ast_set_flag(spy, CHANSPY_TRIGGER_READ);
+                                               ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
+                                               if (option_debug)
+                                                       ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
+                                                               spy->type, chan->name);
+                                       }
+                                       break;
+                               }
+                               if (option_debug)
+                                       ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
+                                               spy->type, chan->name);
+                               ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
+                               ast_cond_signal(&spy->trigger);
+                       } else {
+                               if (option_debug)
+                                       ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
+                                               spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
+                               while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
+                                       struct ast_frame *drop = queue->head;
+                                       
+                                       queue->samples -= drop->samples;
+                                       queue->head = drop->next;
+                                       ast_frfree(drop);
                                }
-                       }
-
-                       if (option_debug)
-                               ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
-                                       spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
-                       while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
-                               struct ast_frame *drop = queue->head;
-
-                               queue->samples -= drop->samples;
-                               queue->head = drop->next;
-                               ast_frfree(drop);
                        }
                } else {
                        switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {