Rewrite chunk queueing.
[paraslash.git] / vss.c
diff --git a/vss.c b/vss.c
index 7892fb1..a16b006 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -495,6 +495,32 @@ again:
        return ret;
 }
 
+static void get_chunk(long unsigned chunk_num, char **buf, size_t *len)
+{
+       size_t pos = mmd->afi.chunk_table[chunk_num];
+       *buf = map + pos;
+       *len = mmd->afi.chunk_table[chunk_num + 1] - pos;
+}
+
+/**
+ * Get the data of the given chunk.
+ *
+ * \param chunk_num The number of the desired chunk.
+ * \param buf Chunk data.
+ * \param len Chunk length in bytes.
+ *
+ * \return Positive on success, negative on errors.
+ */
+int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len)
+{
+       if (mmd->audio_format < 0 || !map || !vss_playing())
+               return -E_CHUNK;
+       if (chunk_num >= mmd->afi.chunks_total)
+               return -E_CHUNK;
+       get_chunk(chunk_num, buf, len);
+       return 1;
+}
+
 /**
  * main sending function
  *
@@ -508,8 +534,6 @@ void vss_send_chunk(void)
 {
        int i;
        struct audio_format_handler *af;
-       ssize_t pos;
-       size_t len;
        struct timeval now, due;
 
        if (mmd->audio_format < 0 || !map || !vss_playing())
@@ -529,8 +553,6 @@ void vss_send_chunk(void)
                mmd->new_vss_status_flags |= VSS_NEXT;
                return vss_eof();
        }
-       pos = mmd->afi.chunk_table[mmd->current_chunk];
-       len = mmd->afi.chunk_table[mmd->current_chunk + 1] - pos;
        /*
         * We call the send function also in case of empty chunks as they
         * might have still some data queued which can be sent in this case.
@@ -542,9 +564,12 @@ void vss_send_chunk(void)
                mmd->offset = tv2ms(&tmp);
                mmd->events++;
        }
-       for (i = 0; senders[i].name; i++)
-               senders[i].send(mmd->current_chunk, mmd->chunks_sent,
-                       map + pos, len);
+       for (i = 0; senders[i].name; i++) {
+               char *buf;
+               size_t len;
+               get_chunk(mmd->current_chunk, &buf, &len);
+               senders[i].send(mmd->current_chunk, mmd->chunks_sent, buf, len);
+       }
        mmd->new_vss_status_flags |= VSS_PLAYING;
        mmd->chunks_sent++;
        mmd->current_chunk++;