diff --git a/libs/stfu/stfu.c b/libs/stfu/stfu.c
index 75a659d894..7ddc4e93bb 100644
--- a/libs/stfu/stfu.c
+++ b/libs/stfu/stfu.c
@@ -600,7 +600,7 @@ static int stfu_n_find_any_frame(stfu_instance_t *in, stfu_queue_t *queue, stfu_
 }
 
 
-static int stfu_n_find_frame(stfu_instance_t *in, stfu_queue_t *queue, uint32_t ts, stfu_frame_t **r_frame)
+static int stfu_n_find_frame(stfu_instance_t *in, stfu_queue_t *queue, uint32_t min_ts, uint32_t max_ts, stfu_frame_t **r_frame)
 {
     uint32_t i = 0;
     stfu_frame_t *frame = NULL;
@@ -612,7 +612,7 @@ static int stfu_n_find_frame(stfu_instance_t *in, stfu_queue_t *queue, uint32_t
     for(i = 0; i < queue->array_size; i++) {
         frame = &queue->array[i];
         
-        if (frame->ts == ts) {
+        if (frame->ts == max_ts || (frame->ts > min_ts && frame->ts < max_ts)) {
             if (r_frame) {
                 *r_frame = frame;
                 queue->last_index = i;
@@ -662,20 +662,24 @@ stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
         i->cur_ts = i->cur_ts + i->samples_per_packet;
     }
     
-    found = stfu_n_find_frame(i, i->out_queue, i->cur_ts, &rframe);
+    found = stfu_n_find_frame(i, i->out_queue, i->last_wr_ts, i->cur_ts, &rframe);
 
     if (found) {
         if (i->out_queue->array_len) {
             i->out_queue->array_len--;
         }
     } else {
-        found = stfu_n_find_frame(i, i->in_queue, i->cur_ts, &rframe);
+        found = stfu_n_find_frame(i, i->in_queue, i->last_wr_ts, i->cur_ts, &rframe);
 
         if (!found) {
-            found = stfu_n_find_frame(i, i->old_queue, i->cur_ts, &rframe);
+            found = stfu_n_find_frame(i, i->old_queue, i->last_wr_ts, i->cur_ts, &rframe);
         }
     }
 
+    if (found) {
+        i->cur_ts = rframe->ts;
+    }
+
     if (i->sync_out) {
         if (!found) {
             if ((found = stfu_n_find_any_frame(i, i->out_queue, &rframe))) {