From 04a8d064400936dc6ecd3b137397cb2ce2cc25d7 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 15 Mar 2008 19:02:27 +0100 Subject: [PATCH] Move the get_chunk and the get_header functions from vss.c to afh.c. Also move compute_chunk_time() to time.c. --- afh.h | 3 +++ afh_common.c | 30 ++++++++++++++++++++++++++++++ chunk_queue.c | 4 ++-- ortp_send.c | 2 +- para.h | 3 +++ send_common.c | 4 +++- time.c | 10 ++++++++++ vss.c | 41 +++++++++++------------------------------ vss.h | 2 +- 9 files changed, 64 insertions(+), 35 deletions(-) diff --git a/afh.h b/afh.h index bd6784d5..a441d5fe 100644 --- 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); diff --git a/afh_common.c b/afh_common.c index 3fa88f14..4f84334c 100644 --- a/afh_common.c +++ b/afh_common.c @@ -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; +} diff --git a/chunk_queue.c b/chunk_queue.c index 61dd3820..84f4a4a8 100644 --- a/chunk_queue.c +++ b/chunk_queue.c @@ -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; diff --git a/ortp_send.c b/ortp_send.c index 077e7cf5..9c166aee 100644 --- a/ortp_send.c +++ b/ortp_send.c @@ -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 d69acdf6..a39ed97d 100644 --- 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}; diff --git a/send_common.c b/send_common.c index 448ce522..43aeb2b3 100644 --- a/send_common.c +++ b/send_common.c @@ -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 b7155cb0..1fd7b098 100644 --- 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 8ca37d43..1be4cd15 100644 --- 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 f48e964b..3b238eb7 100644 --- 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); -- 2.39.2