diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index ffc128bcd..98532e499 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -167,6 +167,11 @@ else() list(FILTER soh__Enhancements EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/(Darwin|SAPI).*") endif() +# handle accessible audio engine removals +if (CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") + list(FILTER soh__Enhancements EXCLUDE REGEX "soh/Enhancements/accessible-actors/*") +endif() + source_group("soh\\Enhancements" REGULAR_EXPRESSION "soh/Enhancements/*") source_group("soh\\Enhancements\\audio" REGULAR_EXPRESSION "soh/Enhancements/audio/*") source_group("soh\\Enhancements\\controls" REGULAR_EXPRESSION "soh/Enhancements/controls/*") diff --git a/soh/soh/Enhancements/accessible-actors/AccessibleActorList.cpp b/soh/soh/Enhancements/accessible-actors/AccessibleActorList.cpp index 66bf2577a..9f914a8b1 100644 --- a/soh/soh/Enhancements/accessible-actors/AccessibleActorList.cpp +++ b/soh/soh/Enhancements/accessible-actors/AccessibleActorList.cpp @@ -8,8 +8,7 @@ #include #include #include -#include "overlays\actors\ovl_Boss_Goma\z_boss_goma.h" - +#include "overlays/actors/ovl_Boss_Goma/z_boss_goma.h" //Declarations specific to chests. #include "overlays/actors/ovl_En_Box/z_en_box.h" extern "C" { diff --git a/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.cpp b/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.cpp index 919992b66..9b55fe6f7 100644 --- a/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.cpp +++ b/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.cpp @@ -39,7 +39,7 @@ typedef float f32; typedef int8_t s8; typedef uint8_t u8; //Processing for our custom audio positioning. -static float lerp(float x, float y, float z) { +static float lerp_aae(float x, float y, float z) { return (1.0 - z) * x + z * y; } @@ -48,9 +48,9 @@ static float lerp(float x, float y, float z) { return 0; float leftover = ma_volume_db_to_linear(AAE_MAX_DB_REDUCTION); float normDist = fabs(extras->distToPlayer) / extras->maxDistance; - float db = lerp(0, AAE_MAX_DB_REDUCTION, normDist); + float db = lerp_aae(0, AAE_MAX_DB_REDUCTION, normDist); float gain = ma_volume_db_to_linear(db); - gain -= lerp(0, leftover, normDist); + gain -= lerp_aae(0, leftover, normDist); return gain; } //Borrow the pan calculation from the game itself. Todo: this is technical debt, so copy/ revise it or something at some point. @@ -148,7 +148,7 @@ void AccessibleAudioEngine::doPrepare(SoundAction& action) //This should not loop more than twice. uint32_t nextChunk = nFrames; ma_pcm_rb_acquire_write(&preparedOutput, &nextChunk, (void**)&chunk);//Might reduce nextChunk if there isn't enough buffer space available to accommodate the request. - uint64_t framesRead = 0; + ma_uint64 framesRead = 0; ma_engine_read_pcm_frames(&engine, chunk, nextChunk, &framesRead); //Even if we get fewer frames than expected, we should still submit a full buffer of silence. if (framesRead < nextChunk) @@ -357,7 +357,7 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) { return; slot->extras.cutoff = action.cutoff; ma_lpf_config config = - ma_lpf_config_init(ma_format_f32, AAE_CHANNELS, AAE_SAMPLE_RATE, lerp(0.0, AAE_SAMPLE_RATE / 2, action.cutoff), AAE_LPF_ORDER); + ma_lpf_config_init(ma_format_f32, AAE_CHANNELS, AAE_SAMPLE_RATE, lerp_aae(0.0, AAE_SAMPLE_RATE / 2, action.cutoff), AAE_LPF_ORDER); ma_lpf_reinit(&config, &slot->extras.filter); } diff --git a/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.h b/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.h index c2bccabf3..d069a1cef 100644 --- a/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.h +++ b/soh/soh/Enhancements/accessible-actors/AccessibleAudioEngine.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include diff --git a/soh/soh/Enhancements/accessible-actors/SfxExtractor.cpp b/soh/soh/Enhancements/accessible-actors/SfxExtractor.cpp index 0202ac5a9..d681b76aa 100644 --- a/soh/soh/Enhancements/accessible-actors/SfxExtractor.cpp +++ b/soh/soh/Enhancements/accessible-actors/SfxExtractor.cpp @@ -7,6 +7,7 @@ #include "functions.h" #include "soh/OTRGlobals.h" #include "SfxTable.h" +#include const char* GetLanguageCode(); extern "C" { extern Vec3f D_801333D4; diff --git a/soh/soh/Enhancements/accessible-actors/accessibility_cues.cpp b/soh/soh/Enhancements/accessible-actors/accessibility_cues.cpp index 011431b68..a57e1e4e6 100644 --- a/soh/soh/Enhancements/accessible-actors/accessibility_cues.cpp +++ b/soh/soh/Enhancements/accessible-actors/accessibility_cues.cpp @@ -2,6 +2,7 @@ #include "z64.h" #include "macros.h" #include "functions.h" +#include extern "C" { s32 Player_PosVsWallLineTest(PlayState* play, Player* p, Vec3f* offset, CollisionPoly** wallPoly, s32* bgId, Vec3f* posResult); diff --git a/soh/soh/Enhancements/speechsynthesizer/SpeechLogger.cpp b/soh/soh/Enhancements/speechsynthesizer/SpeechLogger.cpp new file mode 100644 index 000000000..a47a61d62 --- /dev/null +++ b/soh/soh/Enhancements/speechsynthesizer/SpeechLogger.cpp @@ -0,0 +1,16 @@ +#include "SpeechLogger.h" +#include + +SpeechLogger::SpeechLogger() { +} + +void SpeechLogger::Speak(const char* text, const char* language) { + lusprintf(__FILE__, __LINE__, 2, "Spoken Text (%s): %s", language, text); +} + +bool SpeechLogger::DoInit() { + return true; +} + +void SpeechLogger::DoUninitialize() { +} diff --git a/soh/soh/Enhancements/speechsynthesizer/SpeechLogger.h b/soh/soh/Enhancements/speechsynthesizer/SpeechLogger.h new file mode 100644 index 000000000..3be27945f --- /dev/null +++ b/soh/soh/Enhancements/speechsynthesizer/SpeechLogger.h @@ -0,0 +1,17 @@ +#ifndef SOHSpeechLogger_h +#define SOHSpeechLogger_h + +#include "SpeechSynthesizer.h" + +class SpeechLogger : public SpeechSynthesizer { + public: + SpeechLogger(); + + void Speak(const char* text, const char* language); + + protected: + bool DoInit(void); + void DoUninitialize(void); +}; + +#endif diff --git a/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h b/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h index b08aab05c..29d209b5f 100644 --- a/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h +++ b/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h @@ -36,3 +36,5 @@ class SpeechSynthesizer { #elif defined(__APPLE__) #include "DarwinSpeechSynthesizer.h" #endif + +#include "SpeechLogger.h" diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 37d6586a9..1748075ff 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -120,12 +120,10 @@ GameInteractorSail* GameInteractorSail::Instance; #include "soh/resource/importer/BackgroundFactory.h" #include "soh/config/ConfigUpdaters.h" -#include "soh/Enhancements/accessible-actors/ActorAccessibility.h" -#include "Enhancements//accessible-actors/ActorAccessibility.h" - - +#if !defined(__SWITCH__) && !defined(__WIIU__) +#include "Enhancements/accessible-actors/ActorAccessibility.h" +#endif void SoH_ProcessDroppedFiles(std::string filePath); - OTRGlobals* OTRGlobals::Instance; SaveManager* SaveManager::Instance; CustomMessageManager* CustomMessageManager::Instance; @@ -506,10 +504,11 @@ void OTRAudio_Thread() { for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) { AudioMgr_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), num_audio_samples); +#if !defined(__SWITCH__) && !defined(__WIIU__) // Give accessibility a chance to merge its own audio in. ActorAccessibility_MixAccessibleAudioWithGameAudio( audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), num_audio_samples); - +#endif } AudioPlayer_Play((u8*)audio_buffer, num_audio_samples * (sizeof(int16_t) * NUM_AUDIO_CHANNELS * AUDIO_FRAMES_PER_UPDATE)); @@ -1113,6 +1112,9 @@ extern "C" void InitOTR() { #elif defined(_WIN32) SpeechSynthesizer::Instance = new SAPISpeechSynthesizer(); SpeechSynthesizer::Instance->Init(); +#else + SpeechSynthesizer::Instance = new SpeechLogger(); + SpeechSynthesizer::Instance->Init(); #endif #ifdef ENABLE_REMOTE_CONTROL @@ -1122,7 +1124,9 @@ extern "C" void InitOTR() { clearMtx = (uintptr_t)&gMtxClear; OTRMessage_Init(); + #if !defined(__SWITCH__) && !defined(__WIIU__) ActorAccessibility_Init(); + #endif OTRAudio_Init(); OTRExtScanner(); VanillaItemTable_Init(); @@ -1185,7 +1189,9 @@ extern "C" void DeinitOTR() { } SDLNet_Quit(); #endif +#if !defined(__SWITCH__) && !defined(__WIIU__) ActorAccessibility_Shutdown(); +#endif // Destroying gui here because we have shared ptrs to LUS objects which output to SPDLOG which is destroyed before these shared ptrs. SohGui::Destroy(); @@ -2701,7 +2707,9 @@ void OTRAudio_SfxCaptureThread() { } } std::unique_lock Lock(audio.mutex); +#if !defined(__SWITCH__) && !defined(__WIIU__) ActorAccessibility_DoSoundExtractionStep(); +#endif audio.processing = false; audio.cv_from_thread.notify_one(); }