From: Andre Noll Date: Mon, 12 Mar 2007 20:19:37 +0000 (+0100) Subject: vss.c: Use the file mapping instead of fseek()/read() X-Git-Tag: v0.2.16~24 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=357f5e11bb0dcf2b40624b3c312833af43dab0a1;p=paraslash.git vss.c: Use the file mapping instead of fseek()/read() --- diff --git a/vss.c b/vss.c index e12176d2..74b0f009 100644 --- a/vss.c +++ b/vss.c @@ -43,8 +43,6 @@ static struct timeval autoplay_barrier; extern struct misc_meta_data *mmd; extern struct audio_file_selector selectors[]; extern struct sender senders[]; -static char *inbuf; -static size_t inbuf_size; static FILE *audio_file = NULL; static char *map; @@ -505,38 +503,6 @@ again: return ret; } -/** - * read a chunk of data from the current audio file - * - * \return The length of the chunk on success, zero on end of file, negative on - * errors. Note: If the current chunk is of length zero, but the end of the - * file is not yet reached, this function returns -E_EMPTY_CHUNK. - */ -ssize_t vss_read_chunk(void) -{ - ssize_t len; - size_t pos; - int ret; - long unsigned cc = mmd->current_chunk; - - if (cc >= mmd->afi.chunks_total) /* eof */ - return 0; - len = mmd->afi.chunk_table[cc + 1] - mmd->afi.chunk_table[cc]; - if (!len) /* nothing to send for this run */ - return -E_EMPTY_CHUNK; - pos = mmd->afi.chunk_table[cc]; - if (inbuf_size < len) { - PARA_INFO_LOG("increasing inbuf for chunk #%lu/%lu to %zu bytes\n", - cc, mmd->afi.chunks_total, len); - inbuf = para_realloc(inbuf, len); - inbuf_size = len; - } - ret = para_fseek(audio_file, pos, SEEK_SET); - if (ret < 0) - return ret; - return para_fread(inbuf, len, 1, audio_file); -} - /** * main sending function * @@ -550,7 +516,7 @@ void vss_send_chunk(void) { int i; struct audio_format_handler *af; - ssize_t ret; + ssize_t pos, len; struct timeval now, due; if (mmd->audio_format < 0 || !audio_file || !vss_playing()) @@ -565,23 +531,17 @@ void vss_send_chunk(void) if (chk_barrier("data send", &now, &data_send_barrier, &due, 1) < 0) return; - ret= vss_read_chunk(); mmd->new_vss_status_flags &= ~VSS_REPOS; - if (!ret || (ret < 0 && ret != -E_EMPTY_CHUNK)) { - if (ret < 0) { - mmd->new_vss_status_flags = VSS_NEXT; - PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); - } else - mmd->new_vss_status_flags |= VSS_NEXT; - vss_eof(af); - return; + if (mmd->current_chunk >= mmd->afi.chunks_total) { /* eof */ + mmd->new_vss_status_flags |= VSS_NEXT; + return vss_eof(af); } + 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. */ - if (ret < 0) - ret = 0; if (!mmd->chunks_sent) { struct timeval tmp; gettimeofday(&mmd->stream_start, NULL); @@ -590,7 +550,8 @@ void vss_send_chunk(void) mmd->events++; } for (i = 0; senders[i].name; i++) - senders[i].send(mmd->current_chunk, mmd->chunks_sent, inbuf, ret); + senders[i].send(mmd->current_chunk, mmd->chunks_sent, + map + pos, len); mmd->new_vss_status_flags |= VSS_PLAYING; mmd->chunks_sent++; mmd->current_chunk++;