fixed mp3 buffer overlapping of GP2X sound buffer

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@129 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-05-12 15:06:44 +00:00
parent d5d119243c
commit e362c57310
4 changed files with 32 additions and 20 deletions

View file

@ -29,7 +29,7 @@ static _940_data_t *shared_data = 0;
_940_ctl_t *shared_ctl = 0; _940_ctl_t *shared_ctl = 0;
unsigned char *mp3_mem = 0; unsigned char *mp3_mem = 0;
#define MP3_SIZE_MAX (0x1000000 - 4*640*480) #define MP3_SIZE_MAX (0x400000 + 0x800000) // 12M
int crashed_940 = 0; int crashed_940 = 0;
@ -360,7 +360,7 @@ void sharedmem_init(void)
shared_data = (_940_data_t *) (shared_mem+0x100000); shared_data = (_940_data_t *) (shared_mem+0x100000);
/* this area must not get buffered on either side */ /* this area must not get buffered on either side */
shared_ctl = (_940_ctl_t *) (shared_mem+0x200000); shared_ctl = (_940_ctl_t *) (shared_mem+0x200000);
mp3_mem = (unsigned char *) mmap(0, MP3_SIZE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x3000000); mp3_mem = (unsigned char *) mmap(0, MP3_SIZE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x2400000);
if (mp3_mem == MAP_FAILED) if (mp3_mem == MAP_FAILED)
{ {
printf("mmap(mp3_mem) failed with %i\n", errno); printf("mmap(mp3_mem) failed with %i\n", errno);
@ -599,7 +599,6 @@ void mp3_start_play(FILE *f, int pos) // pos is 0-1023
if (loaded_mp3 != f) if (loaded_mp3 != f)
{ {
// printf("loading mp3... "); fflush(stdout);
if (PicoMessage != NULL) if (PicoMessage != NULL)
{ {
fseek(f, 0, SEEK_END); fseek(f, 0, SEEK_END);
@ -608,8 +607,7 @@ void mp3_start_play(FILE *f, int pos) // pos is 0-1023
} }
fseek(f, 0, SEEK_SET); fseek(f, 0, SEEK_SET);
fread(mp3_mem, 1, MP3_SIZE_MAX, f); fread(mp3_mem, 1, MP3_SIZE_MAX, f);
// if (feof(f)) printf("done.\n"); if (!feof(f)) printf("Warning: mp3 was too large, not all data loaded.\n");
// else printf("done. mp3 too large, not all data loaded.\n");
shared_ctl->mp3_len = ftell(f); shared_ctl->mp3_len = ftell(f);
loaded_mp3 = f; loaded_mp3 = f;

View file

@ -5,7 +5,7 @@
static _940_data_t *shared_data = (_940_data_t *) 0x00100000; static _940_data_t *shared_data = (_940_data_t *) 0x00100000;
static _940_ctl_t *shared_ctl = (_940_ctl_t *) 0x00200000; static _940_ctl_t *shared_ctl = (_940_ctl_t *) 0x00200000;
static unsigned char *mp3_data = (unsigned char *) 0x01000000; static unsigned char *mp3_data = (unsigned char *) 0x00400000;
YM2612 *ym2612_940; YM2612 *ym2612_940;
// from init.s // from init.s

View file

@ -87,19 +87,25 @@ code940:
mcr p15, 0, r0, c6, c3, 0 mcr p15, 0, r0, c6, c3, 0
mcr p15, 0, r0, c6, c3, 1 mcr p15, 0, r0, c6, c3, 1
@ set up region 4: 16M 0x01000000-0x02000000 (mp3 area) @ region 4: 4K 0x00000000-0x00001000 (boot code protection region)
mov r0, #(0x17<<1)|1 mov r0, #(0x0b<<1)|1
orr r0, r0, #0x01000000
mcr p15, 0, r0, c6, c4, 0 mcr p15, 0, r0, c6, c4, 0
mcr p15, 0, r0, c6, c4, 1 mcr p15, 0, r0, c6, c4, 1
@ region 5: 4K 0x00000000-0x00001000 (boot code protection region) @ region 5: 4M 0x00400000-0x00800000 (mp3 area part1)
mov r0, #(0x0b<<1)|1 mov r0, #(0x15<<1)|1
orr r0, r0, #0x00400000
mcr p15, 0, r0, c6, c5, 0 mcr p15, 0, r0, c6, c5, 0
mcr p15, 0, r0, c6, c5, 1 mcr p15, 0, r0, c6, c5, 1
@ set regions 1, 4 and 5 to be cacheable (so the first 2M and mp3 area will be cacheable) @ region 6: 8M 0x00800000-0x01000000 (mp3 area part2)
mov r0, #(1<<1)|(1<<4)|(1<<5) mov r0, #(0x16<<1)|1
orr r0, r0, #0x00800000
mcr p15, 0, r0, c6, c6, 0
mcr p15, 0, r0, c6, c6, 1
@ set regions 1, 4, 5 and 6 to be cacheable (so the first 2M and mp3 area will be cacheable)
mov r0, #(1<<1)|(1<<4)|(1<<5)|(1<<6)
mcr p15, 0, r0, c2, c0, 0 mcr p15, 0, r0, c2, c0, 0
mcr p15, 0, r0, c2, c0, 1 mcr p15, 0, r0, c2, c0, 1
@ -108,12 +114,13 @@ code940:
mcr p15, 0, r0, c3, c0, 0 mcr p15, 0, r0, c3, c0, 0
@ set access protection @ set access protection
@ data: [no, full, full, full, full, no access] for regions [5 4 3 2 1 0] @ data: [full, full, no, full, full, full, no access] for regions [6 5 4 3 2 1 0]
mov r0, #(0<<10)|(3<<8)|(3<<6)|(3<<4)|(3<<2)|(0) mov r0, # (3<<12)|(3<<10)|(0<<8)
orr r0, r0, #(3<<6)|(3<< 4)|(3<< 2)|(0<<0)
mcr p15, 0, r0, c5, c0, 0 mcr p15, 0, r0, c5, c0, 0
@ instructions: [full, no access, no, no, full, no] @ instructions: [no, no, full, no, no, full, no]
mov r0, #(0<< 6)|(0<<4)|(3<<2)|(0) mov r0, # (0<<12)|(0<<10)|(3<<8)
orr r0, r0, #(3<<10)|(0<<8) orr r0, r0, #(0<<6)|(0<< 4)|(3<< 2)|(0<<0)
mcr p15, 0, r0, c5, c0, 1 mcr p15, 0, r0, c5, c0, 1
mrc p15, 0, r0, c1, c0, 0 @ fetch current control reg mrc p15, 0, r0, c1, c0, 0 @ fetch current control reg

View file

@ -89,8 +89,8 @@ Other important stuff
Badly encoded mp3s can cause various kind of problems, like noises, incorrect Badly encoded mp3s can cause various kind of problems, like noises, incorrect
playback speeds, not repeating music or even prevent game from starting. playback speeds, not repeating music or even prevent game from starting.
* Use lower bitrate for better performance (96 or 128kbps CBRs recommended). * Use lower bitrate for better performance (96 or 128kbps CBRs recommended).
* Due to internal implementation mp3s must not be larger that ~15MB * Due to internal implementation mp3s must not be larger that 12MB
(15548416 bytes). Larger mp3s will not be fully loaded. (12582912 bytes). Larger mp3s will not be fully loaded.
* RAM timings option is good for dualcore operation (it is disabled by * RAM timings option is good for dualcore operation (it is disabled by
default because it doesn't work on every GP2X, so enable it in advanced default because it doesn't work on every GP2X, so enable it in advanced
options). options).
@ -224,6 +224,13 @@ Symbian:
Changelog Changelog
--------- ---------
1.321
* Sometimes stray sounds were played after loading a savestate. Fixed.
* Fixed a problem where >6MB mp3s were corrupted in memory (sound glitches in
Snatcher).
* PD no longer overwrites video player code in memory, video player now can be
used after PicoDrive.
1.32 1.32
+ Added some new scaling options. + Added some new scaling options.
+ Added ability to reload CD images while game is running (needed for games + Added ability to reload CD images while game is running (needed for games