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:
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)