From 61f841d9bb5987f49ef76e901ff04cce7d25709b Mon Sep 17 00:00:00 2001 From: RocketRobz Date: Fri, 23 Jun 2023 21:37:00 -0600 Subject: [PATCH] Add support for starting points to custom skin music --- .../arm9/source/graphics/themefilenames.h | 2 ++ romsel_dsimenutheme/arm9/source/sound.cpp | 27 ++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h b/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h index 611366ae1b..506f721f13 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h +++ b/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h @@ -139,7 +139,9 @@ #define TFN_FONT_LARGE_DSI TFN_UI_DIRECTORY"/font/large-dsi.nftr" #define TFN_SOUND_EFFECTBANK TFN_UI_DIRECTORY"/sound/sfx.bin" +#define TFN_START_SOUND_BG TFN_UI_DIRECTORY"/sound/bgm.start.wav" #define TFN_SOUND_BG TFN_UI_DIRECTORY"/sound/bgm.wav" +#define TFN_START_SOUND_BG_CACHE TFN_UI_DIRECTORY"/sound/bgm.start.pcm.raw" #define TFN_SOUND_BG_CACHE TFN_UI_DIRECTORY"/sound/bgm.pcm.raw" #define TFN_DEFAULT_SOUND_EFFECTBANK TFN_SYSTEM_SOUND_DIRECTORY"/defaultfx.bin" diff --git a/romsel_dsimenutheme/arm9/source/sound.cpp b/romsel_dsimenutheme/arm9/source/sound.cpp index 6340a7ee13..548e32cfd7 100644 --- a/romsel_dsimenutheme/arm9/source/sound.cpp +++ b/romsel_dsimenutheme/arm9/source/sound.cpp @@ -212,10 +212,17 @@ SoundControl::SoundControl() break; } if (customSkin) { + std::string musicStartPath = TFN_START_SOUND_BG; std::string musicPath = TFN_SOUND_BG; + std::string cacheStartPath = TFN_START_SOUND_BG_CACHE; std::string cachePath = TFN_SOUND_BG_CACHE; bool closed = false; if (access(musicPath.c_str(), F_OK) == 0) { + loopableMusic = (access(musicStartPath.c_str(), F_OK) == 0); + if (loopableMusic) { + stream_start_source = fopen(musicStartPath.c_str(), "rb"); + } + // Read properties from WAV header u8 wavFormat = 0; u8 numChannels = 1; @@ -229,21 +236,35 @@ SoundControl::SoundControl() fread(&stream.sampling_rate, sizeof(u16), 1, stream_source); if (wavFormat == 0x11) { - // If ADPCM and hasn't been successfully converted yet, do so now - if(access(cachePath.c_str(), F_OK) != 0 || getFileSize(cachePath.c_str()) == 0) { + // If music is ADPCM and hasn't been successfully converted yet, do so now + if (loopableMusic && (access(cacheStartPath.c_str(), F_OK) != 0 || getFileSize(cacheStartPath.c_str()) == 0)) { // Start point + if (adpcm_main(musicStartPath.c_str(), cacheStartPath.c_str(), numChannels == 2) == -1) { + remove(cacheStartPath.c_str()); + } + } + if (access(cachePath.c_str(), F_OK) != 0 || getFileSize(cachePath.c_str()) == 0) { // Loop point if (adpcm_main(musicPath.c_str(), cachePath.c_str(), numChannels == 2) == -1) { remove(cachePath.c_str()); } } + if (loopableMusic) { + fclose(stream_start_source); + } fclose(stream_source); closed = true; } else { seekPos = 0x2C; } } else { + loopableMusic = (access(cacheStartPath.c_str(), F_OK) == 0); closed = true; } - if (closed) stream_source = fopen(cachePath.c_str(), "rb"); + if (closed) { + if (loopableMusic) { + stream_start_source = fopen(cacheStartPath.c_str(), "rb"); + } + stream_source = fopen(cachePath.c_str(), "rb"); + } if (stream_source) break; } // fallthrough if stream_source fails. } case 4: