Move the get_chunk and the get_header functions from vss.c to afh.c.
authorAndre Noll <maan@systemlinux.org>
Sat, 15 Mar 2008 18:02:27 +0000 (19:02 +0100)
committerAndre Noll <maan@systemlinux.org>
Sat, 15 Mar 2008 18:02:27 +0000 (19:02 +0100)
Also move compute_chunk_time() to time.c.

afh.h
afh_common.c
chunk_queue.c
ortp_send.c
para.h
send_common.c
time.c
vss.c
vss.h

diff --git a/afh.h b/afh.h
index bd6784d..a441d5f 100644 (file)
--- a/afh.h
+++ b/afh.h
@@ -103,3 +103,6 @@ int guess_audio_format(const char *name);
 int compute_afhi(const char *path, char *data, size_t size,
        struct afh_info *afhi);
 const char *audio_format_name(int);
+void afh_get_chunk(long unsigned chunk_num, struct afh_info *afhi,
+               void *map, char **buf, size_t *len);
+void afh_get_header(struct afh_info *afhi, void *map, char **buf, size_t *len);
index 3fa88f1..4f84334 100644 (file)
@@ -176,3 +176,33 @@ const char *audio_format_name(int i)
        return i >= 0?  afl[i].name : "(none)";
 }
 
+
+void afh_get_chunk(long unsigned chunk_num, struct afh_info *afhi,
+               void *map, char **buf, size_t *len)
+{
+       size_t pos = afhi->chunk_table[chunk_num];
+       *buf = map + pos;
+       *len = afhi->chunk_table[chunk_num + 1] - pos;
+}
+
+/**
+ * Get the header of an audio file.
+ *
+ * \param afhi The audio file handler data describing the file.
+ * \param map The data of the audio file.
+ * \param buf The length of the header is stored here.
+ * \param len Points to a buffer containing the header on return.
+ *
+ * This function sets \a buf to \p NULL and \a len to zero if \a map or \a
+ * afhi is \p NULL, or if the current audio format does not need special
+ * header treamtment.
+ */
+void afh_get_header(struct afh_info *afhi, void *map, char **buf, size_t *len)
+{
+       if (!map || !afhi || ! afhi->header_len) {
+               *buf = NULL;
+               *len = 0;
+       }
+       *len = afhi->header_len;
+       *buf = map + afhi->header_offset;
+}
index 61dd382..84f4a4a 100644 (file)
@@ -62,7 +62,7 @@ int cq_enqueue(struct chunk_queue *cq, long unsigned chunk_num,
                if (ret < 0)
                        return ret;
        } else
-               buf = vss_get_header(&len);
+               vss_get_header(&buf, &len);
        if (cq->num_pending + len > cq->max_pending)
                return -E_QUEUE;
        qc = para_malloc(sizeof(struct queued_chunk));
@@ -133,7 +133,7 @@ int cq_get(struct queued_chunk *qc, char **buf, size_t *len)
                if (ret < 0)
                        return ret;
        } else
-               *buf = vss_get_header(len);
+               vss_get_header(buf, len);
        assert(*len > qc->sent);
        *buf += qc->sent;
        *len -= qc->sent;
index 077e7cf..9c166ae 100644 (file)
@@ -190,7 +190,7 @@ static void ortp_send(long unsigned current_chunk, long unsigned chunks_sent,
        }
        if (list_empty(&targets))
                return;
-       header_buf = vss_get_header(&header_len);
+       vss_get_header(&header_buf, &header_len);
        if (!need_extra_header(current_chunk))
                header_len = 0;
        sendbuf_len = ORTP_AUDIO_HEADER_LEN + header_len + len;
diff --git a/para.h b/para.h
index d69acdf..a39ed97 100644 (file)
--- a/para.h
+++ b/para.h
@@ -157,6 +157,9 @@ int tv_convex_combination(const long a, const struct timeval *tv1,
                const long b, const struct timeval *tv2,
                struct timeval *result);
 void ms2tv(const long unsigned n, struct timeval *tv);
+void compute_chunk_time(long unsigned chunk_num,
+               struct timeval *chunk_tv, struct timeval *stream_start,
+               struct timeval *result);
 
 /** The enum of all status items. */
 enum status_items {STATUS_ITEM_ENUM NUM_STAT_ITEMS};
index 448ce52..43aeb2b 100644 (file)
@@ -174,7 +174,9 @@ void send_chunk(struct sender_client *sc, struct sender_status *ss,
 
        if (!sc->header_sent && current_chunk) {
                size_t header_len;
-               char *header_buf = vss_get_header(&header_len);
+               char *header_buf;
+
+               vss_get_header(&header_buf, &header_len);
                if (header_buf && header_len > 0) {
                        ret = queue_chunk_or_shutdown(sc, ss, -1U, 0);
                        if (ret < 0)
diff --git a/time.c b/time.c
index b7155cb..1fd7b09 100644 (file)
--- a/time.c
+++ b/time.c
@@ -169,3 +169,13 @@ int tv_convex_combination(const long a, const struct timeval *tv1,
                        ret = -ret;
        return ret;
 }
+
+void compute_chunk_time(long unsigned chunk_num,
+               struct timeval *chunk_tv, struct timeval *stream_start,
+               struct timeval *result)
+{
+       struct timeval tmp;
+
+       tv_scale(chunk_num, chunk_tv, &tmp);
+       tv_add(&tmp, stream_start, result);
+}
diff --git a/vss.c b/vss.c
index 8ca37d4..1be4cd1 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -143,14 +143,6 @@ static int chk_barrier(const char *bname, const struct timeval *now,
        return -1;
 }
 
-static void vss_next_chunk_time(struct timeval *due)
-{
-       struct timeval tmp;
-
-       tv_scale(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv, &tmp);
-       tv_add(&tmp, &mmd->stream_start, due);
-}
-
 /*
  * != NULL: timeout for next chunk
  * NULL: nothing to do
@@ -177,7 +169,8 @@ static struct timeval *vss_compute_timeout(void)
                return &the_timeout;
        if (!vss_playing() || !map)
                return NULL;
-       vss_next_chunk_time(&next_chunk);
+       compute_chunk_time(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv,
+               &mmd->stream_start, &next_chunk);
        if (chk_barrier("chunk", &now, &next_chunk, &the_timeout, 0) < 0)
                return &the_timeout;
        /* chunk is due or bof */
@@ -222,19 +215,14 @@ static void vss_eof(void)
 /**
  * Get the header of the current audio file.
  *
- * \param header_len The length of the header is stored here.
- *
- * \return A pointer to a buffer containing the header, or NULL, if no audio
- * file is selected or if the current audio format does not need special header
- * treamtment.
+ * \param buf The length of the header is stored here.
+ * \param len Points to a buffer containing the header on return.
  *
+ * \sa afh_get_header.
  */
-char *vss_get_header(size_t *header_len)
+void vss_get_header(char **buf, size_t *len)
 {
-       if (!map || !mmd->afd.afhi.header_len)
-               return NULL;
-       *header_len = mmd->afd.afhi.header_len;
-       return map + mmd->afd.afhi.header_offset;
+       afh_get_header(&mmd->afd.afhi, map, buf, len);
 }
 
 /**
@@ -440,14 +428,6 @@ void vss_post_select(fd_set *rfds, fd_set *wfds)
        ret = send_buffer(afs_socket, "new");
        afsss = AFS_SOCKET_AFD_PENDING;
 }
-
-static void get_chunk(long unsigned chunk_num, char **buf, size_t *len)
-{
-       size_t pos = mmd->afd.afhi.chunk_table[chunk_num];
-       *buf = map + pos;
-       *len = mmd->afd.afhi.chunk_table[chunk_num + 1] - pos;
-}
-
 /**
  * Get the data of the given chunk.
  *
@@ -463,7 +443,7 @@ int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len)
                return -E_CHUNK;
        if (chunk_num >= mmd->afd.afhi.chunks_total)
                return -E_CHUNK;
-       get_chunk(chunk_num, buf, len);
+       afh_get_chunk(chunk_num, &mmd->afd.afhi, map, buf, len);
        return 1;
 }
 
@@ -486,7 +466,8 @@ void vss_send_chunk(void)
        if (!map || !vss_playing())
                return;
        gettimeofday(&now, NULL);
-       vss_next_chunk_time(&due);
+       compute_chunk_time(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv,
+               &mmd->stream_start, &due);
        if (tv_diff(&due, &now, NULL) > 0)
                return;
        if (chk_barrier("eof", &now, &eof_barrier, &due, 1) < 0)
@@ -510,7 +491,7 @@ void vss_send_chunk(void)
                mmd->offset = tv2ms(&tmp);
                mmd->events++;
        }
-       get_chunk(mmd->current_chunk, &buf, &len);
+       afh_get_chunk(mmd->current_chunk, &mmd->afd.afhi, map, &buf, &len);
        for (i = 0; senders[i].name; i++)
                senders[i].send(mmd->current_chunk, mmd->chunks_sent, buf, len);
        mmd->new_vss_status_flags |= VSS_PLAYING;
diff --git a/vss.h b/vss.h
index f48e964..3b238eb 100644 (file)
--- a/vss.h
+++ b/vss.h
@@ -14,7 +14,7 @@ unsigned int vss_next(void);
 unsigned int vss_repos(void);
 unsigned int vss_paused(void);
 unsigned int vss_stopped(void);
-char *vss_get_header(size_t *header_len);
+void vss_get_header(char **buf, size_t *len);
 struct timeval *vss_chunk_time(void);
 const char *supported_audio_formats(void);
 int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len);