From f7080bb2c1889104bffcf023d838d1e02394b805 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 9 Jun 2021 03:33:03 -0500 Subject: [PATCH] add parameter parsing --- CMakeLists.txt | 1 + README.md | 3 +- src/engine/engine.cpp | 30 +++++- src/engine/engine.h | 13 +++ src/engine/platform/sound/pce_psg.cpp | 1 - src/main.cpp | 134 +++++++++++++++++++++++++- src/ta-utils.h | 16 +++ 7 files changed, 192 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad8fea93..a1e89bef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,7 @@ target_link_libraries(furnace ${HAVE_SDL2} ${HAVE_Z}) if (HAVE_JACK) target_link_libraries(furnace ${HAVE_JACK}) + target_compile_definitions(furnace PUBLIC HAVE_JACK) endif() if (WIN32) diff --git a/README.md b/README.md index 7a41a3c1..bbd8a922 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,9 @@ this is a work-in-progress chip music player (currently) for the .dmf format. - CMake - SDL2 - zlib +- JACK (optional) -the latter two are included as submodules for Windows and macOS. +SDL2 and zlib are included as submodules for Windows and macOS. ## compilation diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 4e031667..3a956329 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2,6 +2,9 @@ #include "safeReader.h" #include "../ta-log.h" #include "../audio/sdl.h" +#ifdef HAVE_JACK +#include "../audio/jack.h" +#endif #include "platform/genesis.h" #include "platform/genesisext.h" #include "platform/sms.h" @@ -677,15 +680,38 @@ void DivEngine::play() { } +void DivEngine::setAudio(DivAudioEngines which) { + audioEngine=which; +} + +void DivEngine::setView(DivStatusView which) { + view=which; +} + bool DivEngine::init() { - output=new TAAudioSDL; + switch (audioEngine) { + case DIV_AUDIO_JACK: +#ifndef HAVE_JACK + logE("Furnace was not compiled with JACK support!\n"); + return false; +#else + output=new TAAudioJACK; +#endif + break; + case DIV_AUDIO_SDL: + output=new TAAudioSDL; + break; + default: + logE("invalid audio engine!\n"); + return false; + } want.bufsize=1024; want.rate=44100; want.fragments=2; want.inChans=0; want.outChans=2; want.outFormat=TA_AUDIO_FORMAT_F32; - want.name="DivAudio"; + want.name="Furnace"; output->setCallback(process,this); diff --git a/src/engine/engine.h b/src/engine/engine.h index 650f908a..d6ab7000 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -11,6 +11,11 @@ enum DivStatusView { DIV_STATUS_COMMANDS }; +enum DivAudioEngines { + DIV_AUDIO_JACK=0, + DIV_AUDIO_SDL +}; + struct DivChannelState { std::vector delayed; int note, pitch, portaSpeed, portaNote; @@ -54,6 +59,7 @@ class DivEngine { int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond; DivStatusView view; DivChannelState chan[17]; + DivAudioEngines audioEngine; short vibTable[64]; @@ -83,6 +89,12 @@ class DivEngine { // play void play(); + // set the audio system. + void setAudio(DivAudioEngines which); + + // set the view mode. + void setView(DivStatusView which); + // initialize the engine. bool init(); @@ -101,6 +113,7 @@ class DivEngine { lastCmds(0), cmdsPerSecond(0), view(DIV_STATUS_PATTERN), + audioEngine(DIV_AUDIO_SDL), temp{0,0}, prevSample{0,0} {} }; diff --git a/src/engine/platform/sound/pce_psg.cpp b/src/engine/platform/sound/pce_psg.cpp index 522e7425..c7c2fdec 100644 --- a/src/engine/platform/sound/pce_psg.cpp +++ b/src/engine/platform/sound/pce_psg.cpp @@ -76,7 +76,6 @@ static const int16_t Phase_Filter[2][7] = inline void PCE_PSG::UpdateOutputSub(const int32_t timestamp, psg_channel *ch, const int32_t samp0, const int32_t samp1) { - if (samp0!=0) HRBufs[0][0]+=samp0; HRBufs[1][0]+=samp1; /* diff --git a/src/main.cpp b/src/main.cpp index 9506289c..7f736ed0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,94 @@ DivEngine e; +std::vector params; + +bool pHelp(String) { + printf("usage: furnace [params] [filename]\n" + "you may specify the following parameters:\n"); + for (auto& i: params) { + if (i.value) { + printf(" -%s %s: %s\n",i.name.c_str(),i.valName.c_str(),i.desc.c_str()); + } else { + printf(" -%s: %s\n",i.name.c_str(),i.desc.c_str()); + } + } + return false; +} + +bool pAudio(String val) { + if (val=="jack") { + e.setAudio(DIV_AUDIO_JACK); + } else if (val=="sdl") { + e.setAudio(DIV_AUDIO_SDL); + } else { + logE("invalid value for audio engine! valid values are: jack, sdl.\n"); + return false; + } + return true; +} + +bool pView(String val) { + if (val=="pattern") { + e.setView(DIV_STATUS_PATTERN); + } else if (val=="commands") { + e.setView(DIV_STATUS_COMMANDS); + } else if (val=="nothing") { + e.setView(DIV_STATUS_NOTHING); + } else { + logE("invalid value for view type! valid values are: pattern, commands, nothing.\n"); + return false; + } + return true; +} + +bool pVersion(String) { + printf("Furnace version " DIV_VERSION ".\n\n"); + printf("developed by tildearrow. copyright (C) 2021.\n"); + printf("licensed under the GNU General Public License version 2\n"); + printf(".\n\n"); + printf("this is free software with ABSOLUTELY NO WARRANTY.\n"); + printf("pass the -warranty parameter for more information.\n\n"); + printf("DISCLAIMER: this program is not affiliated with Delek in any form.\n"); + return false; +} + +bool pWarranty(String) { + printf("This program is free software; you can redistribute it and/or\n" + "modify it under the terms of the GNU General Public License\n" + "as published by the Free Software Foundation; either version 2\n" + "of the License, or (at your option) any later version.\n\n" + + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n\n" + + "You should have received a copy of the GNU General Public License\n" + "along with this program; if not, write to the Free Software\n" + "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"); + return false; +} + +bool needsValue(String param) { + for (size_t i=0; i