X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2Fbuffering.c;h=15b3a86f6097f6ed3a319bef499547f417b2e37d;hb=83c093a48ab58670ea82d0ec81658daa9f9b950a;hp=5afc6e89fb412fa36b612aa57b0e83c06cb98a75;hpb=8b71d0ebf934f5029a29aa89ba2b49ee4c5954cc;p=picodrive.git diff --git a/Pico/cd/buffering.c b/Pico/cd/buffering.c index 5afc6e8..15b3a86 100644 --- a/Pico/cd/buffering.c +++ b/Pico/cd/buffering.c @@ -1,3 +1,6 @@ +// Buffering handling +// (c) Copyright 2007, Grazvydas "notaz" Ignotas + #include "../PicoInt.h" //#include @@ -47,9 +50,9 @@ void PicoCDBufferFree(void) /* this is a try to fight slow SD access of GP2X */ -void PicoCDBufferRead(void *dest, int lba) +PICO_INTERNAL void PicoCDBufferRead(void *dest, int lba) { - int is_bin, offs, read_len; + int is_bin, offs, read_len, moved = 0; reads++; is_bin = Pico_mcd->TOC.Tracks[0].ftype == TYPE_BIN; @@ -84,15 +87,21 @@ void PicoCDBufferRead(void *dest, int lba) if (lba < prev_lba && prev_lba - lba < PicoCDBuffers) { - dprintf("CD buffer move"); read_len = prev_lba - lba; + dprintf("CD buffer move=%i, read_len=%i", PicoCDBuffers - read_len, read_len); memmove(cd_buffer + read_len*2048, cd_buffer, (PicoCDBuffers - read_len)*2048); + moved = 1; } else { read_len = PicoCDBuffers; } + if (PicoMessage != NULL && read_len >= 512) + { + PicoMessage("Buffering data..."); + } + if (is_bin) { int i; @@ -108,5 +117,14 @@ void PicoCDBufferRead(void *dest, int lba) } memcpy32(dest, (int *) cd_buffer, 2048/4); prev_lba = lba; + + if (moved) + { + /* file pointer must point to the same data in file, as would-be data after our buffer */ + int where_seek; + lba += PicoCDBuffers; + where_seek = is_bin ? (lba * 2352 + 16) : (lba << 11); + pm_seek(Pico_mcd->TOC.Tracks[0].F, where_seek, SEEK_SET); + } }