X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=e12176d2df3ce08eeb457aa05d10a418206d59f8;hp=1bb6ff86995c256c0f4230259dc0641a8899bd91;hb=57a8d22ad5e81dc815390685ae5f83c0f16156e7;hpb=dc3bbfa529d9eb9151fdc4119983e8bdf23f751d diff --git a/vss.c b/vss.c index 1bb6ff86..e12176d2 100644 --- a/vss.c +++ b/vss.c @@ -23,6 +23,7 @@ */ #include "server.h" +#include /* mmap */ #include /* gettimeofday */ #include "server.cmdline.h" #include "afs.h" @@ -46,6 +47,7 @@ static char *inbuf; static size_t inbuf_size; static FILE *audio_file = NULL; +static char *map; #if 1 void mp3_init(struct audio_format_handler *); @@ -185,7 +187,7 @@ void vss_init(void) static int get_file_info(int i) { - return afl[i].get_file_info(audio_file, &mmd->afi); + return afl[i].get_file_info(audio_file, map, mmd->size, &mmd->afi); } /** @@ -238,9 +240,14 @@ static int get_audio_format(int omit) */ static int update_mmd(void) { - int i; + int i, fd = fileno(audio_file); struct stat file_status; + if (fstat(fd, &file_status) == -1) + return -E_FSTAT; + mmd->size = file_status.st_size; + mmd->mtime = file_status.st_mtime; + map = para_mmap(file_status.st_size, PROT_READ, MAP_PRIVATE, fd, 0); i = guess_audio_format(mmd->filename); if (i < 0 || get_file_info(i) < 0) i = get_audio_format(i); @@ -250,16 +257,12 @@ static int update_mmd(void) mmd->chunks_sent = 0; mmd->current_chunk = 0; mmd->offset = 0; - if (fstat(fileno(audio_file), &file_status) == -1) - return -E_FSTAT; - mmd->size = file_status.st_size; - mmd->mtime = file_status.st_mtime; mmd->events++; PARA_NOTICE_LOG("next audio file: %s\n", mmd->filename); return 1; } -static void get_song(void) +static void vss_get_audio_file(void) { char **sl = selectors[mmd->selector_num].get_audio_file_list(10); int i; @@ -372,6 +375,7 @@ static void vss_eof(struct audio_format_handler *af) } gettimeofday(&now, NULL); tv_add(&mmd->afi.eof_tv, &now, &eof_barrier); + munmap(map, mmd->size); fclose(audio_file); audio_file = NULL; mmd->audio_format = -1; @@ -381,7 +385,6 @@ static void vss_eof(struct audio_format_handler *af) mmd->afi.seconds_total = 0; free(mmd->afi.chunk_table); mmd->afi.chunk_table = NULL; - PARA_ERROR_LOG("freeing header %p\n", mmd->afi.header); free(mmd->afi.header); mmd->afi.header = NULL; tmp = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_INFO1], @@ -496,7 +499,7 @@ again: if (!ret && !audio_file && vss_playing() && !(mmd->new_vss_status_flags & VSS_NOMORE)) { PARA_DEBUG_LOG("%s", "ready and playing, but no audio file\n"); - get_song(); + vss_get_audio_file(); goto again; } return ret;