]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - vss.c
first draft of the mmap patch series
[paraslash.git] / vss.c
diff --git a/vss.c b/vss.c
index 1bb6ff86995c256c0f4230259dc0641a8899bd91..e12176d2df3ce08eeb457aa05d10a418206d59f8 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -23,6 +23,7 @@
  */
 
 #include "server.h"
+#include <sys/mman.h> /* mmap */
 #include <sys/time.h> /* 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;