gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 642cff8f61aea3e24afe8888e730acf91b62488f
parent a6ff82eea530df1b7523940d81e6705ee0abff0d
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Thu,  6 Feb 2025 20:38:45 +0100

add command line options

Diffstat:
Msource/pluginTester/fakeAudioDevice.cpp | 27+++++++++------------------
Msource/pluginTester/fakeAudioDevice.h | 13++++++++++++-
Msource/pluginTester/pluginTester.cpp | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
3 files changed, 96 insertions(+), 40 deletions(-)

diff --git a/source/pluginTester/fakeAudioDevice.cpp b/source/pluginTester/fakeAudioDevice.cpp @@ -35,10 +35,17 @@ String FakeAudioIODevice::open(const BigInteger& _inputChannels, const BigIntege void FakeAudioIODevice::start(AudioIODeviceCallback* _callback) { + if (!m_isOpenFlag) + return; + m_callback = _callback; m_isPlayingFlag = true; - if (m_callback) - m_callback->audioDeviceAboutToStart(this); + if (!m_callback) + return; + + m_callback->audioDeviceAboutToStart(this); + + m_buffer = AudioBuffer<float>(static_cast<int>(std::max(m_numInputChannels, m_numOutputChannels)), m_bufferSizeSamples); } void FakeAudioIODevice::stop() @@ -47,19 +54,3 @@ void FakeAudioIODevice::stop() if (m_callback) m_callback->audioDeviceStopped(); } - -void FakeAudioIODevice::processAudio() const -{ - if (!m_callback || !m_isPlayingFlag || !m_isOpenFlag) - return; - - AudioBuffer<float> buffer(std::max(m_numInputChannels, m_numOutputChannels), m_bufferSizeSamples); - buffer.clear(); - - m_callback->audioDeviceIOCallbackWithContext(buffer.getArrayOfReadPointers(), - m_numInputChannels ? static_cast<int>(m_numInputChannels) : 2, - buffer.getArrayOfWritePointers(), - static_cast<int>(m_numOutputChannels), - buffer.getNumSamples(), - AudioIODeviceCallbackContext()); -} diff --git a/source/pluginTester/fakeAudioDevice.h b/source/pluginTester/fakeAudioDevice.h @@ -62,7 +62,17 @@ private: int getXRunCount() const noexcept override { return 0; } public: - void processAudio() const; + void prepareProcess(); + + void processAudio() + { + m_callback->audioDeviceIOCallbackWithContext(m_buffer.getArrayOfReadPointers(), + m_numInputChannels ? static_cast<int>(m_numInputChannels) : 2, + m_buffer.getArrayOfWritePointers(), + static_cast<int>(m_numOutputChannels), + m_buffer.getNumSamples(), + AudioIODeviceCallbackContext()); + } private: double m_sampleRate; @@ -74,4 +84,5 @@ private: uint32_t m_numOutputChannels = 2; BigInteger m_activeInputChannels{0b11}; BigInteger m_activeOutputChannels{0b11}; + AudioBuffer<float> m_buffer; }; \ No newline at end of file diff --git a/source/pluginTester/pluginTester.cpp b/source/pluginTester/pluginTester.cpp @@ -1,6 +1,7 @@ #include "fakeAudioDevice.h" #include "pluginHost.h" #include "logger.h" +#include "baseLib/commandline.h" #include "baseLib/filesystem.h" class JuceAppLifetimeObjects @@ -22,19 +23,28 @@ private: int main(const int _argc, char* _argv[]) { + baseLib::CommandLine cmdLine(_argc, _argv); + StdoutLogger logger; + auto error = [](const String& _msg) -> int + { + Logger::writeToLog("Error: " + _msg); + Logger::writeToLog("Usage:\n" + "pluginTester -plugin <pathToPlugin> [-seconds n -blocks n -blocksize n -samplerate x -forever]"); + return 1; + }; try { - if (_argc < 2) - { - Logger::writeToLog("Usage: pluginTester <path_to_vst2/3_plugin>"); - return 1; - } - ConsoleApplication app; - const String pluginPathName = _argv[1]; + const String pluginPathName = cmdLine.get("plugin"); + + if (pluginPathName.isEmpty()) + { + return error("No plugin specified"); + } + const String pluginPath = baseLib::filesystem::getPath(_argv[1]); const String pluginFilename = baseLib::filesystem::getFilenameWithoutPath(_argv[1]); @@ -68,37 +78,81 @@ int main(const int _argc, char* _argv[]) } if (desc.fileOrIdentifier.isEmpty()) - { - Logger::writeToLog("Failed to find plugin " + pluginPathName); - return 3; - } + return error("Failed to find plugin " + pluginPathName); if (!pluginHost.loadPlugin(desc)) - { - Logger::writeToLog("Failed to load plugin " + pluginPathName); - return 1; - } + return error("Failed to load plugin " + pluginPathName); FakeAudioIODevice audioDevice; const uint32_t numIns = pluginHost.getCurrentProcessor()->getTotalNumInputChannels(); const uint32_t numOuts = pluginHost.getCurrentProcessor()->getTotalNumOutputChannels(); - auto res = audioDevice.open(numIns, numOuts, 48000, 512); + const auto blocksize = cmdLine.getInt("blocksize", 512); + const auto samplerate = cmdLine.getFloat("samplerate", 48000.0f); + + auto res = audioDevice.open(numIns, numOuts, samplerate, blocksize); if (res.isNotEmpty()) + return error("Failed to open audio device: " + res); + + audioDevice.start(&pluginHost); + + const auto forever = cmdLine.contains("forever"); + + if (forever) { - Logger::writeToLog("Failed to open audio device: " + res); - return 2; + uint64_t blockCount = 0; + uint64_t sr = static_cast<uint64_t>(samplerate); + + uint64_t lastMinutes = 0; + + using Clock = std::chrono::high_resolution_clock; + + const auto tBegin = Clock::now(); + + while (true) + { + audioDevice.processAudio(); + ++blockCount; + + auto totalSeconds = blockCount * blocksize / sr; + auto minutes = totalSeconds / 60; + auto hours = minutes / 60; + auto seconds = totalSeconds - minutes * 60; + minutes -= hours * 60; + + if (minutes != lastMinutes) + { + const auto t2 = Clock::now(); + const auto duration = std::chrono::duration_cast<std::chrono::seconds>(t2 - tBegin).count(); + + const auto speed = static_cast<double>(duration) / static_cast<double>(totalSeconds); + + char temp[64]; + (void)snprintf(temp, sizeof(temp), "Executed %02uh %02um %02us, Speed %2.2f%%", static_cast<uint32_t>(hours), static_cast<uint32_t>(minutes), static_cast<uint32_t>(seconds), speed); + Logger::writeToLog(temp); + lastMinutes = minutes; + } + } } - audioDevice.start(&pluginHost); + const auto seconds = cmdLine.getInt("seconds", 0); + auto blocks = cmdLine.getInt("blocks", 0); + + if (blocks && seconds) + return error("Cannot specify both blocks and seconds"); - while (true) + if (seconds) { - audioDevice.processAudio(); + blocks = static_cast<int>(samplerate) / blocksize * seconds; + if (blocks == 0) + blocks = 1; } + for (size_t i=0; i<blocks; ++i) + audioDevice.processAudio(); + return 0; } catch (const std::exception& e)