diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-11 21:50:48 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-11 21:50:48 +0000 |
commit | 374a523ba36575b8f2f74a530a4ceeb69e91fe8d (patch) | |
tree | 06d5d92bbffddfbbbb45aa1f8197ad3bdce5037d /channel.c | |
parent | 88396ce2e33aac6ba14dcb92ccfce69f4ed4ef08 (diff) |
Merged revisions 19347 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2
........
r19347 | kpfleming | 2006-04-11 16:35:52 -0500 (Tue, 11 Apr 2006) | 2 lines
simplify spy queue flushing logic, and always force a flush when one side gets full, even if the other side is not empty (issue #6457)
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@19349 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channel.c')
-rw-r--r-- | channel.c | 75 |
1 files changed, 34 insertions, 41 deletions
@@ -1271,7 +1271,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; @@ -1333,48 +1332,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)) { |