diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-07-17 20:03:24 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-07-17 20:03:24 +0200 |
commit | bf4c1afea0afe5519e53d3b7f5a8e07c5df1c344 (patch) | |
tree | d6f4ec71a403042cea61630f3dd00e8575f2c230 /cgme.c | |
parent | f43f9b570a2ab8629bd4b203a28f27b7852ccb50 (diff) |
fixed gme codec
Diffstat (limited to 'cgme.c')
-rw-r--r-- | cgme.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -9,16 +9,17 @@ static Music_Emu *emu; static int reallength; static int nzerosamples; +extern int sdl_player_freq; // hack! int cgme_init (const char *fname, int track, float start, float end) { - gme_open_file (fname, &emu, 44100); + gme_open_file (fname, &emu, sdl_player_freq); gme_start_track (emu, track); track_info_t inf; gme_track_info (emu, &inf, track); cgme.info.bitsPerSample = 16; cgme.info.channels = 2; - cgme.info.samplesPerSecond = 44100; + cgme.info.samplesPerSecond = sdl_player_freq; reallength = inf.length; nzerosamples = 0; if (inf.length == -1) { @@ -41,10 +42,19 @@ cgme_free (void) { int cgme_read (char *bytes, int size) { + float t = (size/4) / (float)cgme.info.samplesPerSecond; + if (cgme.info.position + t >= cgme.info.duration) { + t = cgme.info.duration - cgme.info.position; + if (t <= 0) { + return 0; + } + // DON'T ajust size, buffer must always be po2 + //size = t * (float)cgme.info.samplesPerSecond * 4; + } if (gme_play (emu, size/2, (short*)bytes)) { - return 1; + return 0; } - cgme.info.position += (size/4) / 44100.f; + cgme.info.position += t; if (reallength == -1) { // check if whole buffer is zeroes int i; @@ -55,18 +65,15 @@ cgme_read (char *bytes, int size) { } if (i == size) { nzerosamples += size / 4; - if (nzerosamples > 44100 * 4) { - return -1; + if (nzerosamples > cgme.info.samplesPerSecond * 4) { + return 0; } } else { nzerosamples = 0; } } - if (reallength == -1 && cgme.info.position >= cgme.info.duration) { - return -1; - } - return 0; + return size; } int |