From b0698dbac35535faada66a5e5c08718d9120a371 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 5 Feb 2022 23:48:56 -0500 Subject: [PATCH] GUI: audio failure resilience --- src/engine/engine.cpp | 23 ++++++++++++++++++----- src/engine/engine.h | 2 +- src/gui/gui.cpp | 4 +++- src/gui/gui.h | 5 ++--- src/main.cpp | 12 +++++++++++- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 4d792448e..7e3d4a1db 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -5937,7 +5937,7 @@ void DivEngine::setConsoleMode(bool enable) { consoleMode=enable; } -void DivEngine::switchMaster() { +bool DivEngine::switchMaster() { deinitAudioBackend(); quitDispatch(); initDispatch(); @@ -5948,8 +5948,12 @@ void DivEngine::switchMaster() { } if (!output->setRun(true)) { logE("error while activating audio!\n"); + return false; } + } else { + return false; } + return true; } TAAudioDesc& DivEngine::getAudioDescWant() { @@ -6132,7 +6136,12 @@ bool DivEngine::init() { loadConf(); // init the rest of engine - if (!initAudioBackend()) return false; + bool haveAudio=false; + if (!initAudioBackend()) { + logE("no audio output available!\n"); + } else { + haveAudio=true; + } samp_bb=blip_new(32768); if (samp_bb==NULL) { @@ -6140,7 +6149,7 @@ bool DivEngine::init() { return false; } - samp_bbOut=new short[got.bufsize]; + samp_bbOut=new short[32768]; samp_bbIn=new short[32768]; samp_bbInLen=32768; @@ -6162,9 +6171,13 @@ bool DivEngine::init() { reset(); active=true; - if (!output->setRun(true)) { - logE("error while activating!\n"); + if (!haveAudio) { return false; + } else { + if (!output->setRun(true)) { + logE("error while activating!\n"); + return false; + } } return true; } diff --git a/src/engine/engine.h b/src/engine/engine.h index 2dfcbc251..412405591 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -534,7 +534,7 @@ class DivEngine { String getWarnings(); // switch master - void switchMaster(); + bool switchMaster(); // get audio desc want TAAudioDesc& getAudioDescWant(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 4e075e7af..d0e6e2d5d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3584,7 +3584,9 @@ void FurnaceGUI::commitSettings() { e->saveConf(); - e->switchMaster(); + if (!e->switchMaster()) { + showError("could not initialize audio!"); + } ImGui::GetIO().Fonts->Clear(); diff --git a/src/gui/gui.h b/src/gui/gui.h index 484bfe43a..e16b26ac0 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -397,9 +397,6 @@ class FurnaceGUI { int load(String path); void exportAudio(String path, DivAudioExportModes mode); - void showWarning(String what, FurnaceGUIWarnings type); - void showError(String what); - void applyUISettings(); void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop); @@ -411,6 +408,8 @@ class FurnaceGUI { const char* getSystemName(DivSystem which); public: + void showWarning(String what, FurnaceGUIWarnings type); + void showError(String what); const char* noteName(short note, short octave); bool decodeNote(const char* what, short& note, short& octave); void bindEngine(DivEngine* eng); diff --git a/src/main.cpp b/src/main.cpp index 730a091c4..58765ae3a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,6 +38,8 @@ bool consoleMode=false; bool consoleMode=true; #endif +bool displayEngineFailError=false; + std::vector params; bool pHelp(String) { @@ -330,7 +332,11 @@ int main(int argc, char** argv) { } if (!e.init()) { logE("could not initialize engine!\n"); - return 1; + if (consoleMode) { + return 1; + } else { + displayEngineFailError=false; + } } if (outName!="" || vgmOutName!="") { if (vgmOutName!="") { @@ -383,6 +389,10 @@ int main(int argc, char** argv) { g.bindEngine(&e); if (!g.init()) return 1; + if (displayEngineFailError) { + g.showError("error while initializing audio!"); + } + if (!fileName.empty()) { g.setFileName(fileName); }