diff --git a/asm/rom_header.s b/asm/rom_header.s index 4ce1ab32..1ed6540d 100644 --- a/asm/rom_header.s +++ b/asm/rom_header.s @@ -26,13 +26,13 @@ .ascii "E" /* NTSC-U (North America) */ #endif #if defined(SRAM) - .byte 0x30 /* Version */ + .byte 0x32 /* Version */ #elif defined(EEP16K) - .byte 0x20 /* Version */ + .byte 0x22 /* Version */ #elif defined(SRAM768K) - .byte 0x40 /* Version */ + .byte 0x42 /* Version */ #elif defined(FLASHRAM) - .byte 0x50 /* Version */ + .byte 0x52 /* Version */ #else - .byte 0x10 /* Version */ + .byte 0x12 /* Version */ #endif diff --git a/include/macros.h b/include/macros.h index 3c171faf..cfa3a6d3 100644 --- a/include/macros.h +++ b/include/macros.h @@ -69,4 +69,8 @@ #define VIRTUAL_TO_PHYSICAL2(addr) ((void *)(addr)) #endif +#define MODE_NTSC 0 +#define MODE_MPAL 1 +#define MODE_PAL 2 + #endif // MACROS_H diff --git a/include/types.h b/include/types.h index b77762e7..15ff15b7 100644 --- a/include/types.h +++ b/include/types.h @@ -19,6 +19,14 @@ #define BAD_RETURN(cmd) cmd #endif +struct Config +{ + f32 audioFrequency; +#ifdef WIDE + s16 widescreen; +#endif + u8 tvType; +}; struct Controller { diff --git a/src/audio/effects.c b/src/audio/effects.c index 71065168..f18af4af 100644 --- a/src/audio/effects.c +++ b/src/audio/effects.c @@ -4,6 +4,7 @@ #include "load.h" #include "data.h" #include "seqplayer.h" +#include "game/main.h" #ifdef VERSION_JP #define US_FLOAT2(x) x##.0 @@ -73,7 +74,7 @@ static void sequence_channel_process_sound(struct SequenceChannel *seqChannel) { for (i = 0; i < 4; i++) { struct SequenceChannelLayer *layer = seqChannel->layers[i]; if (layer != NULL && layer->enabled && layer->note != NULL) { - layer->noteFreqScale = layer->freqScale * seqChannel->freqScale; + layer->noteFreqScale = layer->freqScale * seqChannel->freqScale * gConfig.audioFrequency; layer->noteVelocity = layer->velocitySquare * channelVolume; layer->notePan = (layer->pan * panLayerWeight) + panFromChannel; } @@ -402,7 +403,7 @@ s32 adsr_update(struct AdsrState *adsr) { restart: #endif // fall through - + case ADSR_STATE_LOOP: adsr->delay = BSWAP16(adsr->envelope[adsr->envIndex].delay); switch (adsr->delay) { diff --git a/src/audio/heap.c b/src/audio/heap.c index 42db24ee..5a91587c 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -1013,7 +1013,6 @@ void clear_curr_ai_buffer(void) { s32 audio_shut_down_and_reset_step(void) { s32 i; s32 j; - OSTime first; switch (gAudioResetStatus) { case 5: @@ -1050,7 +1049,6 @@ s32 audio_shut_down_and_reset_step(void) { case 1: audio_reset_session(); gAudioResetStatus = 0; - first = osGetTime(); for (i = 0; i < NUMAIBUFFERS; i++) { gAiBufferLengths[i] = gAudioBufferParameters.maxAiBufferLength; } @@ -1082,37 +1080,26 @@ void wait_for_audio_frames(s32 frames) { s32 sAudioFirstBoot = 0; //Separate the reverb settings into their own func. Bit unstable currently, so still only runs at boot. -#ifdef VERSION_EU +#if defined(VERSION_EU) || defined(VERSION_SH) void init_reverb_eu(void) { s16 *mem; struct AudioSessionSettingsEU *preset = &gAudioSessionPresets[0]; struct SynthesisReverb *reverb; struct ReverbSettingsEU *reverbSettings; - s32 j, i; - for (j = 0; j < 4; j++) { + s32 i, j; + for (j = 0; j < 4; j++) + { gSynthesisReverbs[j].useReverb = 0; } - //gAudioResetPresetIdToLoad gNumSynthesisReverbs = preset->numReverbs; - for (j = 0; j < gNumSynthesisReverbs; j++) { + for (j = 0; j < gNumSynthesisReverbs; j++) + { reverb = &gSynthesisReverbs[j]; - reverbSettings = &sReverbSettings[j]; -#ifdef VERSION_SH - reverb->downsampleRate = reverbSettings->downsampleRate; - reverb->windowSize = reverbSettings->windowSize * 64; - reverb->windowSize /= reverb->downsampleRate; -#else + reverbSettings = &sReverbSettings[gAudioResetPresetIdToLoad+j]; reverb->windowSize = reverbSettings->windowSize * 64; reverb->downsampleRate = reverbSettings->downsampleRate; -#endif reverb->reverbGain = reverbSettings->gain; -#ifdef VERSION_SH - reverb->panRight = reverbSettings->unk4; - reverb->panLeft = reverbSettings->unk6; - reverb->unk5 = reverbSettings->unk8; - reverb->unk08 = reverbSettings->unkA; -#endif reverb->useReverb = 8; reverb->ringBuffer.left = soundAlloc(&gNotesAndBuffersPool, reverb->windowSize * 2); reverb->ringBuffer.right = soundAlloc(&gNotesAndBuffersPool, reverb->windowSize * 2); @@ -1121,19 +1108,17 @@ void init_reverb_eu(void) reverb->curFrame = 0; reverb->bufSizePerChannel = reverb->windowSize; reverb->framesLeftToIgnore = 2; -#ifdef VERSION_SH - reverb->resampleFlags = A_INIT; -#endif - if (reverb->downsampleRate != 1) { -#ifndef VERSION_SH - reverb->resampleFlags = A_INIT; -#endif + if (sAudioFirstBoot) + return; + if (reverb->downsampleRate != 1) + { reverb->resampleRate = 0x8000 / reverb->downsampleRate; reverb->resampleStateLeft = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16)); reverb->resampleStateRight = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16)); reverb->unk24 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16)); reverb->unk28 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16)); - for (i = 0; i < gAudioBufferParameters.updatesPerFrame; i++) { + for (i = 0; i < gAudioBufferParameters.updatesPerFrame; i++) + { mem = soundAlloc(&gNotesAndBuffersPool, DEFAULT_LEN_2CH); reverb->items[0][i].toDownsampleLeft = mem; reverb->items[0][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16); @@ -1142,47 +1127,35 @@ void init_reverb_eu(void) reverb->items[1][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16); } } -#ifdef VERSION_SH - if (reverbSettings->unkC != 0) { - reverb->unk108 = sound_alloc_uninitialized(&gNotesAndBuffersPool, 16 * sizeof(s16)); - reverb->unk100 = sound_alloc_uninitialized(&gNotesAndBuffersPool, 8 * sizeof(s16)); - func_sh_802F0DE8(reverb->unk100, reverbSettings->unkC); - } else { - reverb->unk100 = NULL; - } - if (reverbSettings->unkE != 0) { - reverb->unk10C = sound_alloc_uninitialized(&gNotesAndBuffersPool, 16 * sizeof(s16)); - reverb->unk104 = sound_alloc_uninitialized(&gNotesAndBuffersPool, 8 * sizeof(s16)); - func_sh_802F0DE8(reverb->unk104, reverbSettings->unkE); - } else { - reverb->unk104 = NULL; - } -#endif } } #endif #if defined(VERSION_JP) || defined(VERSION_US) void audio_reset_session(struct AudioSessionSettings *preset) { + if (sAudioFirstBoot) + { + return; + } #else void audio_reset_session(void) { if (sAudioFirstBoot) { - //init_reverb_eu(); + init_reverb_eu(); return; } struct AudioSessionSettingsEU *preset = &gAudioSessionPresets[0]; #endif - s16 *mem; #if defined(VERSION_JP) || defined(VERSION_US) s8 updatesPerFrame; s32 reverbWindowSize; s32 k; + s16 *mem; + s32 i; #endif #ifdef PUPPYPRINT OSTime first = osGetTime(); #endif - s32 i; s32 j; s32 persistentMem; s32 temporaryMem; @@ -1194,8 +1167,6 @@ void audio_reset_session(void) { #ifdef BETTER_REVERB s8 reverbConsole; #endif -#else - struct SynthesisReverb *reverb; #endif #ifdef VERSION_EU eu_stubbed_printf_1("Heap Reconstruct Start %x\n", gAudioResetPresetIdToLoad); diff --git a/src/boot/main.c b/src/boot/main.c index c4e3b8f6..7a6851bf 100644 --- a/src/boot/main.c +++ b/src/boot/main.c @@ -51,6 +51,8 @@ OSMesg gUnknownMesgBuf[16]; OSViMode VI; +struct Config gConfig; + struct VblankHandler *gVblankHandler1 = NULL; struct VblankHandler *gVblankHandler2 = NULL; struct VblankHandler *gVblankHandler3 = NULL; @@ -450,6 +452,34 @@ void change_vi(OSViMode *mode, int width, int height){ } } +void get_audio_frequency(void) +{ + switch (gConfig.tvType) + { + #if defined(VERSION_JP) || defined(VERSION_US) + case MODE_NTSC: + gConfig.audioFrequency = 1.0f; + break; + case MODE_MPAL: + gConfig.audioFrequency = 0.9915f; + break; + case MODE_PAL: + gConfig.audioFrequency = 0.9876f; + break; + #else + case MODE_NTSC: + gConfig.audioFrequency = 1.0126f; + break; + case MODE_MPAL: + gConfig.audioFrequency = 1.0086f; + break; + case MODE_PAL: + gConfig.audioFrequency = 1.0f; + break; + #endif + } +} + /** * Initialize hardware, start main thread, then idle. */ @@ -461,18 +491,22 @@ void thread1_idle(UNUSED void *arg) { // NTSC //osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]); VI = osViModeTable[OS_VI_NTSC_LAN1]; + gConfig.tvType = MODE_NTSC; break; case OS_TV_MPAL: // MPAL //osViSetMode(&osViModeTable[OS_VI_MPAL_LAN1]); - VI = osViModeTable[OS_VI_MPAL_LAN1]; + VI = osViModeTable[OS_VI_NTSC_LAN1]; + gConfig.tvType = MODE_MPAL; break; case OS_TV_PAL: // PAL //osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]); - VI = osViModeTable[OS_VI_PAL_LAN1]; + VI = osViModeTable[OS_VI_NTSC_LAN1]; + gConfig.tvType = MODE_PAL; break; } + get_audio_frequency(); change_vi(&VI, SCREEN_WIDTH, SCREEN_HEIGHT); osViSetMode(&VI); osViBlack(TRUE); diff --git a/src/game/game_init.c b/src/game/game_init.c index 02400112..1b54e68b 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -83,9 +83,6 @@ UNUSED static s32 sUnusedGameInitValue = 0; // General timer that runs as the game starts u32 gGlobalTimer = 0; -#ifdef WIDE -s16 gWidescreen; -#endif u8 *gAreaSkyboxStart[AREA_COUNT]; u8 *gAreaSkyboxEnd[AREA_COUNT]; @@ -740,7 +737,7 @@ void thread5_game_loop(UNUSED void *arg) { play_music(SEQ_PLAYER_SFX, SEQUENCE_ARGS(0, SEQ_SOUND_PLAYER), 0); set_sound_mode(save_file_get_sound_mode()); #ifdef WIDE - gWidescreen = save_file_get_widescreen_mode(); + gConfig.widescreen = save_file_get_widescreen_mode(); #endif render_init(); diff --git a/src/game/game_init.h b/src/game/game_init.h index 3cfbdcad..a61e2d60 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -42,9 +42,6 @@ extern u8 *gGfxPoolEnd; extern struct GfxPool *gGfxPool; extern u8 gControllerBits; extern u8 gIsConsole; -#ifdef WIDE -extern s16 gWidescreen; -#endif extern u8 gBorderHeight; #ifdef CUSTOM_DEBUG extern u8 gCustomDebugMode; diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index 7d3175b6..33782742 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -25,6 +25,7 @@ #include "types.h" #include "config.h" #include "puppycam2.h" +#include "main.h" u16 gDialogColorFadeTimer; s8 gLastDialogLineNum; @@ -1567,7 +1568,7 @@ void render_pause_red_coins(void) { void render_widescreen_setting(void) { gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - if (!gWidescreen) { + if (!gConfig.widescreen) { print_generic_string(10, 20, textCurrRatio43); print_generic_string(10, 7, textPressL); } @@ -1577,8 +1578,8 @@ void render_widescreen_setting(void) { } gSPDisplayList(gDisplayListHead++, dl_ia_text_end); if (gPlayer1Controller->buttonPressed & L_TRIG){ - gWidescreen ^= 1; - save_file_set_widescreen_mode(gWidescreen); + gConfig.widescreen ^= 1; + save_file_set_widescreen_mode(gConfig.widescreen); } } #endif diff --git a/src/game/main.h b/src/game/main.h index ddb7d02a..fc06ec9a 100644 --- a/src/game/main.h +++ b/src/game/main.h @@ -20,6 +20,7 @@ struct StructSH8031D9B0 { s16 unk0C; s16 unk0E; }; +extern struct Config gConfig; extern OSThread D_80339210; extern OSThread gIdleThread; diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 6cc6ca59..28e7c033 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -84,7 +84,7 @@ static const struct gPCOptionStruct static const struct gPCOptionStruct gPCOptions[]= { //If the min and max are 0 and 1, then the value text is used, otherwise it's ignored. #ifdef WIDE - {/*Option Name*/ 7, /*Option Variable*/ &gWidescreen, /*Option Value Text Start*/ 0, /*Option Minimum*/ FALSE, /*Option Maximum*/ TRUE}, + {/*Option Name*/ 7, /*Option Variable*/ &gConfig.widescreen, /*Option Value Text Start*/ 0, /*Option Minimum*/ FALSE, /*Option Maximum*/ TRUE}, #endif #if MULTILANG {/*Option Name*/ 8, /*Option Variable*/ &gInGameLanguage, /*Option Value Text Start*/ 4, /*Option Minimum*/ 1, /*Option Maximum*/ 3}, diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index e4c96d0e..66c307a4 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -251,7 +251,7 @@ static void geo_process_perspective(struct GraphNodePerspective *node) { u16 perspNorm; Mtx *mtx = alloc_display_list(sizeof(*mtx)); #ifdef WIDE - if (gWidescreen && (gCurrLevelNum != 0x01)){ + if (gConfig.widescreen && (gCurrLevelNum != 0x01)){ aspect = 1.775f; } else { aspect = 1.33333f; @@ -259,6 +259,8 @@ static void geo_process_perspective(struct GraphNodePerspective *node) { #else aspect = 1.33333f; #endif + if (!gIsConsole) + aspect *= 3.0f; if (gCamera) gWorldScale = MAX(((gCamera->pos[0] * gCamera->pos[0]) + (gCamera->pos[1] * gCamera->pos[1]) + (gCamera->pos[2] * gCamera->pos[2]))/67108864, 1.0f); diff --git a/src/game/save_file.c b/src/game/save_file.c index bcdcdbaf..525682de 100644 --- a/src/game/save_file.c +++ b/src/game/save_file.c @@ -408,7 +408,7 @@ void puppycam_get_save(void) gSaveBuffer.menuData[0].firstBoot = gSaveBuffer.menuData[0].firstBoot; #ifdef WIDE - gWidescreen = save_file_get_widescreen_mode(); + gConfig.widescreen = save_file_get_widescreen_mode(); #endif puppycam_check_save(); @@ -421,7 +421,7 @@ void puppycam_set_save(void) gSaveBuffer.menuData[0].firstBoot = 4; #ifdef WIDE - save_file_set_widescreen_mode(gWidescreen); + save_file_set_widescreen_mode(gConfig.widescreen); #endif gMainMenuDataModified = TRUE; diff --git a/src/menu/star_select.c b/src/menu/star_select.c index 8bfacca7..624ff5c8 100644 --- a/src/menu/star_select.c +++ b/src/menu/star_select.c @@ -20,7 +20,7 @@ #include "star_select.h" #include "text_strings.h" #include "prevent_bss_reordering.h" -#include "game/game_init.h" +#include "game/main.h" /** * @file star_select.c @@ -94,7 +94,7 @@ void render_100_coin_star(u8 stars) { if (stars & (1 << 6)) { // If the 100 coin star has been collected, create a new star selector next to the coin score. #ifdef WIDE - if (gWidescreen) { + if (gConfig.widescreen) { sStarSelectorModels[6] = spawn_object_abs_with_rot(gCurrentObject, 0, MODEL_STAR, bhvActSelectorStarType, ((370*4.0f)/3), 24, -300, 0, 0, 0); } else { @@ -160,7 +160,7 @@ void bhv_act_selector_init(void) { // Render star selector objects #ifdef WIDE - if (gWidescreen) { + if (gConfig.widescreen) { for (i = 0; i < sVisibleStars; i++) { sStarSelectorModels[i] = spawn_object_abs_with_rot(gCurrentObject, 0, selectorModelIDs[i], bhvActSelectorStarType,