*/
#include "server.h"
+#include <sys/mman.h> /* mmap */
#include <sys/time.h> /* gettimeofday */
#include "server.cmdline.h"
#include "afs.h"
static size_t inbuf_size;
static FILE *audio_file = NULL;
+static char *map;
#if 1
void mp3_init(struct audio_format_handler *);
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);
}
/**
*/
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);
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;
}
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;
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],
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;