Fix strange audio bugs on 32-bit

increase audio heap size, fix buffer overflow reading gBankSetsData, warn on soundAlloc failure

Provided by: camthesaxman
This commit is contained in:
Cameron Hall 2022-02-06 15:20:00 -08:00 committed by MysterD
parent e95a1d48e0
commit fc8bb5e6bd
6 changed files with 23 additions and 20 deletions

View file

@ -60,14 +60,14 @@ struct AudioSessionSettings gAudioSessionPresets[18] = {
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3F00, 0x6200, 0x4400, 0x2A80 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x3F00, 0x6200, 0x4400, 0x2A80 },
{ 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x3300, 0x5500, 0x4000, 0x1B00 }, { 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x3300, 0x5500, 0x4000, 0x1B00 },
#else #else
{ 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x1000, 0x2FFF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 16, 1, 0x0E00, 0x3FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x0E00, 0x3FFF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 16, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x0C00, 0x4FFF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x0C00, 0x2FFF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 16, 1, 0x0A00, 0x47FF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
{ 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 32000, 20, 1, 0x0800, 0x37FF, 0x7FFF, 0x7400, 0xA000, 0x7400, 0x7400 },
#endif #endif
{ 27000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 27000, 16, 1, 0x0800, 0x2FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 },
{ 27000, 16, 1, 0x0800, 0x3FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 }, { 27000, 16, 1, 0x0800, 0x3FFF, 0x7FFF, 0x7400, 0x7400, 0x7400, 0x7400 },
@ -583,8 +583,8 @@ f32 gVolRampingRhs128[128] = {
s16 gTatumsPerBeat = TATUMS_PER_BEAT; s16 gTatumsPerBeat = TATUMS_PER_BEAT;
s8 gUnusedCount80333EE8 = UNUSED_COUNT_80333EE8; s8 gUnusedCount80333EE8 = UNUSED_COUNT_80333EE8;
s32 gAudioHeapSize = DOUBLE_SIZE_ON_64_BIT(AUDIO_HEAP_SIZE); s32 gAudioHeapSize = AUDIO_HEAP_SIZE;
s32 D_80333EF0 = DOUBLE_SIZE_ON_64_BIT(D_80333EF0_VAL); s32 D_80333EF0 = D_80333EF0_VAL;
volatile s32 gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED; volatile s32 gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED;
#ifdef VERSION_EU #ifdef VERSION_EU

View file

@ -106,12 +106,12 @@ extern u32 gAudioRandom;
//make my life easier //make my life easier
#ifdef VERSION_EU #ifdef VERSION_EU
#define UNUSED_COUNT_80333EE8 24 #define UNUSED_COUNT_80333EE8 24
#define AUDIO_HEAP_SIZE 0x2c500 #define AUDIO_HEAP_SIZE DOUBLE_SIZE_ON_64_BIT(0x2c500)
#define D_80333EF0_VAL 0x2c00 #define D_80333EF0_VAL DOUBLE_SIZE_ON_64_BIT(0x2c00)
#else #else
#define UNUSED_COUNT_80333EE8 16 #define UNUSED_COUNT_80333EE8 16
#define AUDIO_HEAP_SIZE 0x31150 #define AUDIO_HEAP_SIZE DOUBLE_SIZE_ON_64_BIT(0x48000)
#define D_80333EF0_VAL 0x2500 #define D_80333EF0_VAL DOUBLE_SIZE_ON_64_BIT(0x2500)
#endif #endif

View file

@ -1,4 +1,5 @@
#include <ultra64.h> #include <ultra64.h>
#include <stdio.h>
#include "heap.h" #include "heap.h"
#include "data.h" #include "data.h"
@ -209,6 +210,8 @@ void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
*pos = 0; *pos = 0;
} }
} else { } else {
fprintf(stderr, "soundAlloc failed: tried to alloc %u bytes (%i free)\n",
ALIGN16(size), pool->start + pool->size - pool->cur);
return NULL; return NULL;
} }
return start; return start;
@ -225,6 +228,8 @@ void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
start[i] = 0; start[i] = 0;
} }
} else { } else {
fprintf(stderr, "soundAlloc failed: tried to alloc %u bytes (%i free)\n",
(unsigned int)ALIGN16(size), (int)(pool->start + pool->size - pool->cur));
return NULL; return NULL;
} }
return start; return start;

View file

@ -1,13 +1,10 @@
#include <ultra64.h> #include <ultra64.h>
#include "buffers.h" #include "buffers.h"
#include "audio/data.h"
ALIGNED8 u8 gDecompressionHeap[0xD000]; ALIGNED8 u8 gDecompressionHeap[0xD000];
#if defined(VERSION_EU) || defined(VERSION_SH) ALIGNED16 u8 gAudioHeap[AUDIO_HEAP_SIZE];
ALIGNED16 u8 gAudioHeap[DOUBLE_SIZE_ON_64_BIT(0x31200) - 0x3800];
#else
ALIGNED16 u8 gAudioHeap[DOUBLE_SIZE_ON_64_BIT(0x31200)];
#endif
ALIGNED8 u8 gIdleThreadStack[0x800]; ALIGNED8 u8 gIdleThreadStack[0x800];
ALIGNED8 u8 gThread3Stack[0x2000]; ALIGNED8 u8 gThread3Stack[0x2000];

View file

@ -307,7 +307,7 @@ static bool gfx_texture_cache_lookup(int tile, struct TextureHashmapNode **n, co
hash = (hash >> HASH_SHIFT) & HASH_MASK; hash = (hash >> HASH_SHIFT) & HASH_MASK;
struct TextureHashmapNode **node = &gfx_texture_cache.hashmap[hash]; struct TextureHashmapNode **node = &gfx_texture_cache.hashmap[hash];
while (*node != NULL && *node - gfx_texture_cache.pool < gfx_texture_cache.pool_pos) { while (*node != NULL && *node - gfx_texture_cache.pool < (int)gfx_texture_cache.pool_pos) {
if (CMPADDR((*node)->texture_addr, orig_addr) && (*node)->fmt == fmt && (*node)->siz == siz) { if (CMPADDR((*node)->texture_addr, orig_addr) && (*node)->fmt == fmt && (*node)->siz == siz) {
gfx_rapi->select_texture(tile, (*node)->texture_id); gfx_rapi->select_texture(tile, (*node)->texture_id);
*n = *node; *n = *node;

View file

@ -339,6 +339,7 @@ void main_func(void) {
#endif #endif
#ifdef DEBUG #ifdef DEBUG
fflush(stdout); fflush(stdout);
fflush(stderr);
#endif #endif
} }
#endif #endif