kopia lustrzana https://github.com/jameshball/osci-render
Add support for toggling upsamping, toggling legacy visualiser, and fix bugs when deleting visualiser
rodzic
e25d8e6d71
commit
9017586b39
|
@ -100,6 +100,7 @@
|
||||||
grid : true,
|
grid : true,
|
||||||
noise : true,
|
noise : true,
|
||||||
persistence : 0,
|
persistence : 0,
|
||||||
|
disableFilter : false,
|
||||||
}
|
}
|
||||||
|
|
||||||
Number.prototype.toFixedMinus = function(k)
|
Number.prototype.toFixedMinus = function(k)
|
||||||
|
@ -319,8 +320,6 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
var killed = false;
|
|
||||||
|
|
||||||
var Controls = {
|
var Controls = {
|
||||||
generateUrl : function()
|
generateUrl : function()
|
||||||
{
|
{
|
||||||
|
|
|
@ -676,16 +676,10 @@ var Render =
|
||||||
var sweepPosition = -1;
|
var sweepPosition = -1;
|
||||||
var belowTrigger = false;
|
var belowTrigger = false;
|
||||||
|
|
||||||
function doScriptProcessor(event) {
|
function doScriptProcessor(buffer) {
|
||||||
if (!killed) {
|
|
||||||
fetch(Juce.getBackendResourceAddress("audio"))
|
|
||||||
.then((response) => response.arrayBuffer())
|
|
||||||
.then((buffer) => {
|
|
||||||
var dataView = new DataView(buffer);
|
|
||||||
|
|
||||||
for (var i = 0; i < xSamples.length; i++) {
|
for (var i = 0; i < xSamples.length; i++) {
|
||||||
xSamples[i] = dataView.getFloat32(i * 4 * 2, true);
|
xSamples[i] = buffer[i * 2];
|
||||||
ySamples[i] = dataView.getFloat32(i * 4 * 2 + 4, true);
|
ySamples[i] = buffer[i * 2 + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
const getSettingsFn = Juce.getNativeFunction("getSettings");
|
const getSettingsFn = Juce.getNativeFunction("getSettings");
|
||||||
|
@ -693,6 +687,7 @@ function doScriptProcessor(event) {
|
||||||
controls.exposureStops = settings.intensity;
|
controls.exposureStops = settings.intensity;
|
||||||
controls.persistence = settings.persistence;
|
controls.persistence = settings.persistence;
|
||||||
controls.hue = settings.hue;
|
controls.hue = settings.hue;
|
||||||
|
controls.disableFilter = !settings.upsampling;
|
||||||
if (controls.grid !== settings.graticule) {
|
if (controls.grid !== settings.graticule) {
|
||||||
controls.grid = settings.graticule;
|
controls.grid = settings.graticule;
|
||||||
const image = controls.noise ? 'noise.jpg' : 'empty.jpg';
|
const image = controls.noise ? 'noise.jpg' : 'empty.jpg';
|
||||||
|
@ -741,12 +736,7 @@ function doScriptProcessor(event) {
|
||||||
AudioSystem.oldYSamples[i] = ySamples[i];
|
AudioSystem.oldYSamples[i] = ySamples[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
requestAnimationFrame(drawCRTFrame);
|
requestAnimationFrame(drawCRTFrame);
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawCRTFrame(timeStamp) {
|
function drawCRTFrame(timeStamp) {
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
|
|
||||||
std::atomic<bool> editingCustomFunction = false;
|
std::atomic<bool> editingCustomFunction = false;
|
||||||
|
|
||||||
VisualiserComponent visualiser{audioProcessor};
|
VisualiserComponent visualiser{audioProcessor, nullptr, audioProcessor.legacyVisualiserEnabled->getBoolValue()};
|
||||||
std::atomic<bool> visualiserFullScreen = false;
|
std::atomic<bool> visualiserFullScreen = false;
|
||||||
SettingsComponent settings{audioProcessor, *this};
|
SettingsComponent settings{audioProcessor, *this};
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ public:
|
||||||
std::shared_ptr<OscirenderCodeEditorComponent> customFunctionCodeEditor = std::make_shared<OscirenderCodeEditorComponent>(*customFunctionCodeDocument, &luaTokeniser, audioProcessor, CustomEffect::UNIQUE_ID, CustomEffect::FILE_NAME);
|
std::shared_ptr<OscirenderCodeEditorComponent> customFunctionCodeEditor = std::make_shared<OscirenderCodeEditorComponent>(*customFunctionCodeDocument, &luaTokeniser, audioProcessor, CustomEffect::UNIQUE_ID, CustomEffect::FILE_NAME);
|
||||||
|
|
||||||
std::unique_ptr<juce::FileChooser> chooser;
|
std::unique_ptr<juce::FileChooser> chooser;
|
||||||
MainMenuBarModel menuBarModel{*this};
|
MainMenuBarModel menuBarModel{audioProcessor, *this};
|
||||||
juce::MenuBarComponent menuBar;
|
juce::MenuBarComponent menuBar;
|
||||||
|
|
||||||
juce::StretchableLayoutManager layout;
|
juce::StretchableLayoutManager layout;
|
||||||
|
|
|
@ -177,6 +177,8 @@ OscirenderAudioProcessor::OscirenderAudioProcessor()
|
||||||
booleanParameters.push_back(invertImage);
|
booleanParameters.push_back(invertImage);
|
||||||
booleanParameters.push_back(graticuleEnabled);
|
booleanParameters.push_back(graticuleEnabled);
|
||||||
booleanParameters.push_back(smudgesEnabled);
|
booleanParameters.push_back(smudgesEnabled);
|
||||||
|
booleanParameters.push_back(upsamplingEnabled);
|
||||||
|
booleanParameters.push_back(legacyVisualiserEnabled);
|
||||||
|
|
||||||
for (auto parameter : booleanParameters) {
|
for (auto parameter : booleanParameters) {
|
||||||
addParameter(parameter);
|
addParameter(parameter);
|
||||||
|
|
|
@ -161,6 +161,8 @@ public:
|
||||||
// visualiser settings
|
// visualiser settings
|
||||||
BooleanParameter* graticuleEnabled = new BooleanParameter("Show Graticule", "graticuleEnabled", VERSION_HINT, true, "Show the graticule or grid lines over the oscilloscope display.");
|
BooleanParameter* graticuleEnabled = new BooleanParameter("Show Graticule", "graticuleEnabled", VERSION_HINT, true, "Show the graticule or grid lines over the oscilloscope display.");
|
||||||
BooleanParameter* smudgesEnabled = new BooleanParameter("Show Smudges", "smudgesEnabled", VERSION_HINT, true, "Adds a subtle layer of dirt/smudges to the oscilloscope display to make it look more realistic.");
|
BooleanParameter* smudgesEnabled = new BooleanParameter("Show Smudges", "smudgesEnabled", VERSION_HINT, true, "Adds a subtle layer of dirt/smudges to the oscilloscope display to make it look more realistic.");
|
||||||
|
BooleanParameter* upsamplingEnabled = new BooleanParameter("Upsample Audio", "upsamplingEnabled", VERSION_HINT, true, "Upsamples the audio before visualising it to make it appear more realistic, at the expense of performance.");
|
||||||
|
BooleanParameter* legacyVisualiserEnabled = new BooleanParameter("Use Legacy Visualiser", "legacyVisualiserEnabled", VERSION_HINT, false, "Replaces the realistic oscilloscope visualiser with the legacy visualiser. This may improve performance.");
|
||||||
std::shared_ptr<Effect> persistenceEffect = std::make_shared<Effect>(
|
std::shared_ptr<Effect> persistenceEffect = std::make_shared<Effect>(
|
||||||
new EffectParameter(
|
new EffectParameter(
|
||||||
"Persistence",
|
"Persistence",
|
||||||
|
|
|
@ -1,11 +1,27 @@
|
||||||
#include "MainMenuBarModel.h"
|
#include "MainMenuBarModel.h"
|
||||||
#include "../PluginEditor.h"
|
#include "../PluginEditor.h"
|
||||||
|
#include "../PluginProcessor.h"
|
||||||
|
|
||||||
|
MainMenuBarModel::MainMenuBarModel(OscirenderAudioProcessor& p, OscirenderAudioProcessorEditor& editor) : audioProcessor(p), editor(editor) {
|
||||||
|
audioProcessor.legacyVisualiserEnabled->addListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
MainMenuBarModel::~MainMenuBarModel() {
|
||||||
|
audioProcessor.legacyVisualiserEnabled->removeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenuBarModel::parameterValueChanged(int parameterIndex, float legacyVisualiserEnabled) {
|
||||||
|
editor.visualiser.setVisualiserType(legacyVisualiserEnabled >= 0.5f);
|
||||||
|
menuItemsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenuBarModel::parameterGestureChanged(int parameterIndex, bool gestureIsStarting) {}
|
||||||
|
|
||||||
juce::StringArray MainMenuBarModel::getMenuBarNames() {
|
juce::StringArray MainMenuBarModel::getMenuBarNames() {
|
||||||
if (editor.processor.wrapperType == juce::AudioProcessor::WrapperType::wrapperType_Standalone) {
|
if (editor.processor.wrapperType == juce::AudioProcessor::WrapperType::wrapperType_Standalone) {
|
||||||
return juce::StringArray("File", "About", "Audio");
|
return juce::StringArray("File", "View", "About", "Audio");
|
||||||
} else {
|
} else {
|
||||||
return juce::StringArray("File", "About");
|
return juce::StringArray("File", "View", "About");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,8 +36,10 @@ juce::PopupMenu MainMenuBarModel::getMenuForIndex(int topLevelMenuIndex, const j
|
||||||
menu.addItem(4, "Create New Project");
|
menu.addItem(4, "Create New Project");
|
||||||
}
|
}
|
||||||
} else if (topLevelMenuIndex == 1) {
|
} else if (topLevelMenuIndex == 1) {
|
||||||
menu.addItem(1, "About osci-render");
|
menu.addItem(1, "Use Legacy Visualiser", true, audioProcessor.legacyVisualiserEnabled->getBoolValue());
|
||||||
} else if (topLevelMenuIndex == 2) {
|
} else if (topLevelMenuIndex == 2) {
|
||||||
|
menu.addItem(1, "About osci-render");
|
||||||
|
} else if (topLevelMenuIndex == 3) {
|
||||||
menu.addItem(1, "Settings");
|
menu.addItem(1, "Settings");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +67,11 @@ void MainMenuBarModel::menuItemSelected(int menuItemID, int topLevelMenuIndex) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: {
|
case 1: {
|
||||||
|
audioProcessor.legacyVisualiserEnabled->setBoolValueNotifyingHost(!audioProcessor.legacyVisualiserEnabled->getBoolValue());
|
||||||
|
editor.visualiser.setVisualiserType(audioProcessor.legacyVisualiserEnabled->getBoolValue());
|
||||||
|
menuItemsChanged();
|
||||||
|
} break;
|
||||||
|
case 2: {
|
||||||
juce::DialogWindow::LaunchOptions options;
|
juce::DialogWindow::LaunchOptions options;
|
||||||
AboutComponent* about = new AboutComponent();
|
AboutComponent* about = new AboutComponent();
|
||||||
options.content.setOwned(about);
|
options.content.setOwned(about);
|
||||||
|
@ -61,7 +84,7 @@ void MainMenuBarModel::menuItemSelected(int menuItemID, int topLevelMenuIndex) {
|
||||||
|
|
||||||
juce::DialogWindow* dw = options.launchAsync();
|
juce::DialogWindow* dw = options.launchAsync();
|
||||||
} break;
|
} break;
|
||||||
case 2:
|
case 3:
|
||||||
editor.openAudioSettings();
|
editor.openAudioSettings();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -2,17 +2,22 @@
|
||||||
#include <JuceHeader.h>
|
#include <JuceHeader.h>
|
||||||
#include "AboutComponent.h"
|
#include "AboutComponent.h"
|
||||||
|
|
||||||
|
|
||||||
class OscirenderAudioProcessorEditor;
|
class OscirenderAudioProcessorEditor;
|
||||||
class MainMenuBarModel : public juce::MenuBarModel {
|
class OscirenderAudioProcessor;
|
||||||
|
class MainMenuBarModel : public juce::MenuBarModel, public juce::AudioProcessorParameter::Listener {
|
||||||
public:
|
public:
|
||||||
MainMenuBarModel(OscirenderAudioProcessorEditor& editor) : editor(editor) {}
|
MainMenuBarModel(OscirenderAudioProcessor& p, OscirenderAudioProcessorEditor& editor);
|
||||||
~MainMenuBarModel() override {}
|
~MainMenuBarModel();
|
||||||
|
|
||||||
juce::StringArray getMenuBarNames() override;
|
juce::StringArray getMenuBarNames() override;
|
||||||
juce::PopupMenu getMenuForIndex(int topLevelMenuIndex, const juce::String& menuName) override;
|
juce::PopupMenu getMenuForIndex(int topLevelMenuIndex, const juce::String& menuName) override;
|
||||||
void menuItemSelected(int menuItemID, int topLevelMenuIndex) override;
|
void menuItemSelected(int menuItemID, int topLevelMenuIndex) override;
|
||||||
void menuBarActivated(bool isActive);
|
void menuBarActivated(bool isActive);
|
||||||
|
void parameterValueChanged(int parameterIndex, float newValue) override;
|
||||||
|
void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
OscirenderAudioProcessor& audioProcessor;
|
||||||
OscirenderAudioProcessorEditor& editor;
|
OscirenderAudioProcessorEditor& editor;
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,18 +9,14 @@ VisualiserComponent::VisualiserComponent(OscirenderAudioProcessor& p, Visualiser
|
||||||
settingsWindow.setResizable(false, false);
|
settingsWindow.setResizable(false, false);
|
||||||
settingsWindow.setUsingNativeTitleBar(true);
|
settingsWindow.setUsingNativeTitleBar(true);
|
||||||
settings.setLookAndFeel(&getLookAndFeel());
|
settings.setLookAndFeel(&getLookAndFeel());
|
||||||
settings.setSize(550, 200);
|
settings.setSize(550, 230);
|
||||||
settingsWindow.setContentNonOwned(&settings, true);
|
settingsWindow.setContentNonOwned(&settings, true);
|
||||||
|
|
||||||
setMouseCursor(juce::MouseCursor::PointingHandCursor);
|
setMouseCursor(juce::MouseCursor::PointingHandCursor);
|
||||||
setWantsKeyboardFocus(true);
|
setWantsKeyboardFocus(true);
|
||||||
|
|
||||||
if (!oldVisualiser) {
|
|
||||||
addAndMakeVisible(browser);
|
|
||||||
browser.goToURL(juce::WebBrowserComponent::getResourceProviderRoot() + "oscilloscope.html");
|
|
||||||
} else {
|
|
||||||
addChildComponent(browser);
|
addChildComponent(browser);
|
||||||
browser.goToURL("about:blank");
|
setVisualiserType(oldVisualiser);
|
||||||
|
|
||||||
roughness.textBox.setValue(audioProcessor.roughness);
|
roughness.textBox.setValue(audioProcessor.roughness);
|
||||||
roughness.textBox.onValueChange = [this]() {
|
roughness.textBox.onValueChange = [this]() {
|
||||||
|
@ -55,7 +51,6 @@ VisualiserComponent::VisualiserComponent(OscirenderAudioProcessor& p, Visualiser
|
||||||
popOutButton.onClick = [this]() {
|
popOutButton.onClick = [this]() {
|
||||||
popoutWindow();
|
popoutWindow();
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
setFullScreen(false);
|
setFullScreen(false);
|
||||||
}
|
}
|
||||||
|
@ -63,6 +58,7 @@ VisualiserComponent::VisualiserComponent(OscirenderAudioProcessor& p, Visualiser
|
||||||
VisualiserComponent::~VisualiserComponent() {
|
VisualiserComponent::~VisualiserComponent() {
|
||||||
audioProcessor.consumerStop(consumer);
|
audioProcessor.consumerStop(consumer);
|
||||||
stopThread(1000);
|
stopThread(1000);
|
||||||
|
masterReference.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisualiserComponent::setFullScreenCallback(std::function<void(FullScreenMode)> callback) {
|
void VisualiserComponent::setFullScreenCallback(std::function<void(FullScreenMode)> callback) {
|
||||||
|
@ -83,7 +79,8 @@ void VisualiserComponent::mouseDoubleClick(const juce::MouseEvent& event) {
|
||||||
void VisualiserComponent::setBuffer(std::vector<float>& newBuffer) {
|
void VisualiserComponent::setBuffer(std::vector<float>& newBuffer) {
|
||||||
juce::CriticalSection::ScopedLockType scope(lock);
|
juce::CriticalSection::ScopedLockType scope(lock);
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
for (int i = 0; i < newBuffer.size(); i += (int) roughness.textBox.getValue() * 2) {
|
int stride = oldVisualiser ? roughness.textBox.getValue() : 1;
|
||||||
|
for (int i = 0; i < newBuffer.size(); i += stride * 2) {
|
||||||
buffer.push_back(newBuffer[i]);
|
buffer.push_back(newBuffer[i]);
|
||||||
buffer.push_back(newBuffer[i + 1]);
|
buffer.push_back(newBuffer[i + 1]);
|
||||||
}
|
}
|
||||||
|
@ -139,8 +136,19 @@ void VisualiserComponent::run() {
|
||||||
|
|
||||||
consumer = audioProcessor.consumerRegister(tempBuffer);
|
consumer = audioProcessor.consumerRegister(tempBuffer);
|
||||||
audioProcessor.consumerRead(consumer);
|
audioProcessor.consumerRead(consumer);
|
||||||
browser.emitEventIfBrowserIsVisible("audioUpdated", {});
|
|
||||||
setBuffer(tempBuffer);
|
setBuffer(tempBuffer);
|
||||||
|
juce::WeakReference<VisualiserComponent> visualiser(this);
|
||||||
|
if (!oldVisualiser) {
|
||||||
|
juce::MessageManager::callAsync([this, visualiser] () {
|
||||||
|
if (visualiser) {
|
||||||
|
juce::Array<juce::var> data;
|
||||||
|
for (int i = 0; i < buffer.size(); i++) {
|
||||||
|
data.add(buffer[i]);
|
||||||
|
}
|
||||||
|
browser.emitEventIfBrowserIsVisible("audioUpdated", data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,6 +225,17 @@ bool VisualiserComponent::keyPressed(const juce::KeyPress& key) {
|
||||||
|
|
||||||
void VisualiserComponent::setFullScreen(bool fullScreen) {}
|
void VisualiserComponent::setFullScreen(bool fullScreen) {}
|
||||||
|
|
||||||
|
void VisualiserComponent::setVisualiserType(bool oldVisualiser) {
|
||||||
|
this->oldVisualiser = oldVisualiser;
|
||||||
|
if (oldVisualiser) {
|
||||||
|
browser.setVisible(false);
|
||||||
|
browser.goToURL("about:blank");
|
||||||
|
} else {
|
||||||
|
browser.setVisible(true);
|
||||||
|
browser.goToURL(juce::WebBrowserComponent::getResourceProviderRoot() + "oscilloscope.html");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VisualiserComponent::paintXY(juce::Graphics& g, juce::Rectangle<float> area) {
|
void VisualiserComponent::paintXY(juce::Graphics& g, juce::Rectangle<float> area) {
|
||||||
auto transform = juce::AffineTransform::fromTargetPoints(-1.0f, -1.0f, area.getX(), area.getBottom(), 1.0f, 1.0f, area.getRight(), area.getY(), 1.0f, -1.0f, area.getRight(), area.getBottom());
|
auto transform = juce::AffineTransform::fromTargetPoints(-1.0f, -1.0f, area.getX(), area.getBottom(), 1.0f, 1.0f, area.getRight(), area.getY(), 1.0f, -1.0f, area.getRight(), area.getBottom());
|
||||||
std::vector<juce::Line<float>> lines;
|
std::vector<juce::Line<float>> lines;
|
||||||
|
@ -250,7 +269,9 @@ void VisualiserComponent::paintXY(juce::Graphics& g, juce::Rectangle<float> area
|
||||||
void VisualiserComponent::resetBuffer() {
|
void VisualiserComponent::resetBuffer() {
|
||||||
sampleRate = (int) audioProcessor.currentSampleRate;
|
sampleRate = (int) audioProcessor.currentSampleRate;
|
||||||
tempBuffer = std::vector<float>(2 * sampleRate * BUFFER_LENGTH_SECS);
|
tempBuffer = std::vector<float>(2 * sampleRate * BUFFER_LENGTH_SECS);
|
||||||
browser.refresh();
|
if (!oldVisualiser) {
|
||||||
|
browser.goToURL(juce::WebBrowserComponent::getResourceProviderRoot() + "oscilloscope.html");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisualiserComponent::resized() {
|
void VisualiserComponent::resized() {
|
||||||
|
@ -274,6 +295,7 @@ void VisualiserComponent::childChanged() {
|
||||||
|
|
||||||
void VisualiserComponent::popoutWindow() {
|
void VisualiserComponent::popoutWindow() {
|
||||||
auto visualiser = new VisualiserComponent(audioProcessor, this);
|
auto visualiser = new VisualiserComponent(audioProcessor, this);
|
||||||
|
visualiser->settings.setLookAndFeel(&getLookAndFeel());
|
||||||
child = visualiser;
|
child = visualiser;
|
||||||
childChanged();
|
childChanged();
|
||||||
popOutButton.setVisible(false);
|
popOutButton.setVisible(false);
|
||||||
|
|
|
@ -40,8 +40,8 @@ public:
|
||||||
void mouseDown(const juce::MouseEvent& event) override;
|
void mouseDown(const juce::MouseEvent& event) override;
|
||||||
void mouseMove(const juce::MouseEvent& event) override;
|
void mouseMove(const juce::MouseEvent& event) override;
|
||||||
bool keyPressed(const juce::KeyPress& key) override;
|
bool keyPressed(const juce::KeyPress& key) override;
|
||||||
|
|
||||||
void setFullScreen(bool fullScreen);
|
void setFullScreen(bool fullScreen);
|
||||||
|
void setVisualiserType(bool oldVisualiser);
|
||||||
|
|
||||||
VisualiserComponent* parent = nullptr;
|
VisualiserComponent* parent = nullptr;
|
||||||
VisualiserComponent* child = nullptr;
|
VisualiserComponent* child = nullptr;
|
||||||
|
@ -136,8 +136,12 @@ private:
|
||||||
.withNativeFunction("sampleRate", [this](auto& var, auto complete) {
|
.withNativeFunction("sampleRate", [this](auto& var, auto complete) {
|
||||||
complete(sampleRate);
|
complete(sampleRate);
|
||||||
})
|
})
|
||||||
|
.withNativeFunction("killed", [this](auto& var, auto complete) {
|
||||||
|
browserKilled = true;
|
||||||
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
bool browserKilled = false;
|
||||||
std::vector<float> tempBuffer;
|
std::vector<float> tempBuffer;
|
||||||
int precision = 4;
|
int precision = 4;
|
||||||
|
|
||||||
|
@ -151,6 +155,8 @@ private:
|
||||||
void popoutWindow();
|
void popoutWindow();
|
||||||
|
|
||||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VisualiserComponent)
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VisualiserComponent)
|
||||||
|
juce::WeakReference<VisualiserComponent>::Master masterReference;
|
||||||
|
friend class juce::WeakReference<VisualiserComponent>;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VisualiserWindow : public juce::DocumentWindow {
|
class VisualiserWindow : public juce::DocumentWindow {
|
||||||
|
|
|
@ -8,6 +8,7 @@ VisualiserSettings::VisualiserSettings(OscirenderAudioProcessor& p, VisualiserCo
|
||||||
addAndMakeVisible(hue);
|
addAndMakeVisible(hue);
|
||||||
addAndMakeVisible(graticuleToggle);
|
addAndMakeVisible(graticuleToggle);
|
||||||
addAndMakeVisible(smudgeToggle);
|
addAndMakeVisible(smudgeToggle);
|
||||||
|
addAndMakeVisible(upsamplingToggle);
|
||||||
|
|
||||||
intensity.setSliderOnValueChange();
|
intensity.setSliderOnValueChange();
|
||||||
persistence.setSliderOnValueChange();
|
persistence.setSliderOnValueChange();
|
||||||
|
@ -24,6 +25,7 @@ void VisualiserSettings::resized() {
|
||||||
hue.setBounds(area.removeFromTop(rowHeight));
|
hue.setBounds(area.removeFromTop(rowHeight));
|
||||||
graticuleToggle.setBounds(area.removeFromTop(rowHeight));
|
graticuleToggle.setBounds(area.removeFromTop(rowHeight));
|
||||||
smudgeToggle.setBounds(area.removeFromTop(rowHeight));
|
smudgeToggle.setBounds(area.removeFromTop(rowHeight));
|
||||||
|
upsamplingToggle.setBounds(area.removeFromTop(rowHeight));
|
||||||
}
|
}
|
||||||
|
|
||||||
juce::var VisualiserSettings::getSettings() {
|
juce::var VisualiserSettings::getSettings() {
|
||||||
|
@ -33,5 +35,6 @@ juce::var VisualiserSettings::getSettings() {
|
||||||
settings->setProperty("hue", audioProcessor.hueEffect->getActualValue());
|
settings->setProperty("hue", audioProcessor.hueEffect->getActualValue());
|
||||||
settings->setProperty("graticule", audioProcessor.graticuleEnabled->getBoolValue());
|
settings->setProperty("graticule", audioProcessor.graticuleEnabled->getBoolValue());
|
||||||
settings->setProperty("smudges", audioProcessor.smudgesEnabled->getBoolValue());
|
settings->setProperty("smudges", audioProcessor.smudgesEnabled->getBoolValue());
|
||||||
|
settings->setProperty("upsampling", audioProcessor.upsamplingEnabled->getBoolValue());
|
||||||
return juce::var(settings);
|
return juce::var(settings);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ private:
|
||||||
|
|
||||||
jux::SwitchButton graticuleToggle{audioProcessor.graticuleEnabled};
|
jux::SwitchButton graticuleToggle{audioProcessor.graticuleEnabled};
|
||||||
jux::SwitchButton smudgeToggle{audioProcessor.smudgesEnabled};
|
jux::SwitchButton smudgeToggle{audioProcessor.smudgesEnabled};
|
||||||
|
jux::SwitchButton upsamplingToggle{audioProcessor.upsamplingEnabled};
|
||||||
|
|
||||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VisualiserSettings)
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VisualiserSettings)
|
||||||
};
|
};
|
||||||
|
|
Ładowanie…
Reference in New Issue