diff --git a/installer/kernel_patches.S b/installer/kernel_patches.S index 770977d..35e45f6 100644 --- a/installer/kernel_patches.S +++ b/installer/kernel_patches.S @@ -79,7 +79,13 @@ #endif #define BAT4U_VAL 0x008000FF -#define BAT4L_VAL 0x30800012 +#if VER >= 410 + #define BAT4L_VAL 0x30800012 +#elif VER == 400 + #define BAT4L_VAL 0x4E800012 +#else + #error Please define valid value for firmware setup. +#endif #define SET_R4_TO_ADDR(addr) \ lis r3, addr@h ; \ diff --git a/installer/launcher.c b/installer/launcher.c index eed8cb0..6def932 100644 --- a/installer/launcher.c +++ b/installer/launcher.c @@ -41,7 +41,7 @@ #define KERN_SYSCALL_TBL_3 0xFFE85470 // works with loader #define KERN_SYSCALL_TBL_4 0xFFEAAA60 // works with home menu #define KERN_SYSCALL_TBL_5 0xFFEAAE60 // works with browser (previously KERN_SYSCALL_TBL) -#elif ( (VER == 400) || (VER == 410) ) +#elif (VER == 410) #define ADDRESS_OSTitle_main_entry_ptr 0x1005A8C0 #define ADDRESS_main_entry_hook 0x0101BD4C @@ -50,8 +50,31 @@ #define KERN_SYSCALL_TBL_3 0xFFE85C90 #define KERN_SYSCALL_TBL_4 0xFFE85490 #define KERN_SYSCALL_TBL_5 0xFFE85890 // works with browser +#elif (VER == 400) + #define ADDRESS_OSTitle_main_entry_ptr 0x1005A600 + #define ADDRESS_main_entry_hook 0x0101BD4C + + #define KERN_SYSCALL_TBL_1 0xFFE84C90 + #define KERN_SYSCALL_TBL_2 0xFFE85090 + #define KERN_SYSCALL_TBL_3 0xFFE85C90 + #define KERN_SYSCALL_TBL_4 0xFFE85490 + #define KERN_SYSCALL_TBL_5 0xFFE85890 // works with browser +#else + #error Please define valid values for firmware. #endif // VER +#define ROOTRPX_DBAT0U_VAL 0xC00003FF +#define COREINIT_DBAT0U_VAL 0xC20001FF +#if (VER >= 410) + #define ROOTRPX_DBAT0L_VAL 0x30000012 + #define COREINIT_DBAT0L_VAL 0x32000012 +#elif (VER == 400) + #define ROOTRPX_DBAT0L_VAL 0x4E000012 + #define COREINIT_DBAT0L_VAL 0x4D000012 +#else + #error Please define valid values for firmware. +#endif + /* Install functions */ static void InstallMain(private_data_t *private_data); static void InstallPatches(private_data_t *private_data); @@ -283,12 +306,23 @@ static void KernelCopyData(unsigned int addr, unsigned int src, unsigned int len /* * Setup a DBAT access for our 0xC0800000 area and our 0xBC000000 area which hold our variables like GAME_LAUNCHED and our BSS/rodata section */ - register int dbatu0, dbatl0; + register unsigned int dbatu0, dbatl0, target_dbat0u, target_dbat0l; + // setup mapping based on target address + if ((addr >= 0xC0000000) && (addr < 0xC2000000)) // root.rpx address + { + target_dbat0u = ROOTRPX_DBAT0U_VAL; + target_dbat0l = ROOTRPX_DBAT0L_VAL; + } + else if ((addr >= 0xC2000000) && (addr < 0xC3000000)) + { + target_dbat0u = COREINIT_DBAT0U_VAL; + target_dbat0l = COREINIT_DBAT0L_VAL; + } // save the original DBAT value asm volatile("mfdbatu %0, 0" : "=r" (dbatu0)); asm volatile("mfdbatl %0, 0" : "=r" (dbatl0)); - asm volatile("mtdbatu 0, %0" : : "r" (0xC0001FFF)); - asm volatile("mtdbatl 0, %0" : : "r" (0x30000012)); + asm volatile("mtdbatu 0, %0" : : "r" (target_dbat0u)); + asm volatile("mtdbatl 0, %0" : : "r" (target_dbat0l)); asm volatile("eieio; isync"); unsigned char *src_p = (unsigned char*)src; diff --git a/src/dynamic_libs/ax_functions.c b/src/dynamic_libs/ax_functions.c index d84d6f8..97db459 100644 --- a/src/dynamic_libs/ax_functions.c +++ b/src/dynamic_libs/ax_functions.c @@ -72,3 +72,23 @@ void InitAXFunctionPointers(void) OS_FIND_EXPORT(sound_handle, AXSetVoiceLoopOffset); } +void ProperlyEndTransitionAudio(void) +{ + bool (* check_os_audio_transition_flag_old)(void); + void (* AXInit_old)(void); + void (* AXQuit_old)(void); + + unsigned int *funcPointer = 0; + unsigned int sound_handle; + OSDynLoad_Acquire("snd_core.rpl", &sound_handle); + + OS_FIND_EXPORT_EX(sound_handle, check_os_audio_transition_flag, check_os_audio_transition_flag_old); + OS_FIND_EXPORT_EX(sound_handle, AXInit, AXInit_old); + OS_FIND_EXPORT_EX(sound_handle, AXQuit, AXQuit_old); + + if (check_os_audio_transition_flag_old()) + { + AXInit_old(); + AXQuit_old(); + } +} \ No newline at end of file diff --git a/src/dynamic_libs/ax_functions.h b/src/dynamic_libs/ax_functions.h index df9647c..8fe8df5 100644 --- a/src/dynamic_libs/ax_functions.h +++ b/src/dynamic_libs/ax_functions.h @@ -31,6 +31,7 @@ extern "C" { #include void InitAXFunctionPointers(void); +void ProperlyEndTransitionAudio(void); extern void (* AXInitWithParams)(u32 * params); extern void (* AXQuit)(void); diff --git a/src/sounds/SoundHandler.cpp b/src/sounds/SoundHandler.cpp index 60a55a6..93ce942 100644 --- a/src/sounds/SoundHandler.cpp +++ b/src/sounds/SoundHandler.cpp @@ -216,14 +216,23 @@ SoundDecoder * SoundHandler::GetSoundDecoder(const u8 * sound, int length) void SoundHandler::executeThread() { + // v2 sound lib can not properly end transition audio on old firmwares + if (OS_FIRMWARE <= 410) + { + ProperlyEndTransitionAudio(); + } + //! initialize 48 kHz renderer u32 params[3] = { 1, 0, 0 }; AXInitWithParams(params); - for(u32 i = 0; i < MAX_DECODERS; ++i) + // The problem with last voice on 500 was caused by it having priority 0 + // We would need to change this priority distribution if for some reason + // we would need MAX_DECODERS > Voice::PRIO_MAX + for(u32 i = 0; i < MAX_DECODERS; ++i) { - int priority = (MAX_DECODERS - 1 - i) * (Voice::PRIO_MAX - Voice::PRIO_MIN) / (MAX_DECODERS - 1); + int priority = (MAX_DECODERS - i) * Voice::PRIO_MAX / MAX_DECODERS; voiceList[i] = new Voice(priority); // allocate voice 0 with highest priority } @@ -257,15 +266,7 @@ void SoundHandler::executeThread() AXRegisterFrameCallback(NULL); AXQuit(); - // deleting the last voice from the decoder produced DSI errors on 5.0.0 so we skip it - // expecting same behaviour on every FW below 532 - u32 delete_skip = 0; - if(OS_FIRMWARE < 532) - { - delete_skip = 1; - } - - for(u32 i = 0; i < MAX_DECODERS - delete_skip; ++i) + for(u32 i = 0; i < MAX_DECODERS; ++i) { delete voiceList[i]; voiceList[i] = NULL; diff --git a/src/sounds/Voice.h b/src/sounds/Voice.h index b1ad9d7..720ebc2 100644 --- a/src/sounds/Voice.h +++ b/src/sounds/Voice.h @@ -26,7 +26,7 @@ public: enum VoicePriorities { - PRIO_MIN = 0, + PRIO_MIN = 1, PRIO_MAX = 31 };