Improve performance and get Windows working with new visualiser

pull/249/head
James H Ball 2024-08-14 22:17:11 +01:00 zatwierdzone przez James H Ball
rodzic 0939e4f786
commit 51b788a367
4 zmienionych plików z 73 dodań i 66 usunięć

Wyświetl plik

@ -18,7 +18,7 @@ var AudioSystem =
startSound : function()
{
const audioUpdated = window.__JUCE__.backend.addEventListener("audioUpdated", doScriptProcessor);
window.__JUCE__.backend.addEventListener("audioUpdated", doScriptProcessor);
}
}
@ -671,67 +671,71 @@ var Render =
var sweepPosition = -1;
var belowTrigger = false;
function doScriptProcessor(buffer) {
for (var i = 0; i < xSamples.length; i++) {
xSamples[i] = buffer[i * 2];
ySamples[i] = buffer[i * 2 + 1];
}
function doScriptProcessor(bufferBase64) {
var req = new XMLHttpRequest;
req.open('GET', "data:application/octet;base64," + bufferBase64);
req.responseType = 'arraybuffer';
req.onload = function fileLoaded(e) {
var dataView = new DataView(e.target.response);
const getSettingsFn = Juce.getNativeFunction("getSettings");
getSettingsFn().then(settings => {
controls.exposureStops = settings.intensity;
controls.persistence = settings.persistence;
controls.hue = settings.hue;
controls.disableFilter = !settings.upsampling;
if (controls.grid !== settings.graticule) {
controls.grid = settings.graticule;
const image = controls.noise ? 'noise.jpg' : 'empty.jpg';
Render.screenTexture = Render.loadTexture(image);
}
if (controls.noise !== settings.smudges) {
controls.noise = settings.smudges;
const image = controls.noise ? 'noise.jpg' : 'empty.jpg';
Render.screenTexture = Render.loadTexture(image);
}
});
for (var i = 0; i < xSamples.length; i++) {
xSamples[i] = dataView.getFloat32(i * 4 * 2, true);
ySamples[i] = dataView.getFloat32(i * 4 * 2 + 4, true);
}
if (controls.sweepOn) {
var gain = Math.pow(2.0,controls.mainGain);
var sweepMinTime = controls.sweepMsDiv*10/1000;
var triggerValue = controls.sweepTriggerValue;
for (var i=0; i<xSamples.length; i++)
{
xSamples[i] = sweepPosition / gain;
sweepPosition += 2*AudioSystem.timePerSample/sweepMinTime;
if (sweepPosition > 1.1 && belowTrigger && ySamples[i]>=triggerValue)
sweepPosition =-1.3;
belowTrigger = ySamples[i]<triggerValue;
}
}
const getSettingsFn = Juce.getNativeFunction("getSettings");
getSettingsFn().then(settings => {
controls.exposureStops = settings.intensity;
controls.persistence = settings.persistence;
controls.hue = settings.hue;
controls.disableFilter = !settings.upsampling;
if (controls.grid !== settings.graticule) {
controls.grid = settings.graticule;
const image = controls.noise ? 'noise.jpg' : 'empty.jpg';
Render.screenTexture = Render.loadTexture(image);
}
if (controls.noise !== settings.smudges) {
controls.noise = settings.smudges;
const image = controls.noise ? 'noise.jpg' : 'empty.jpg';
Render.screenTexture = Render.loadTexture(image);
}
});
if (!controls.freezeImage)
{
if (!controls.disableFilter)
{
Filter.generateSmoothedSamples(AudioSystem.oldXSamples, xSamples, AudioSystem.smoothedXSamples);
Filter.generateSmoothedSamples(AudioSystem.oldYSamples, ySamples, AudioSystem.smoothedYSamples);
if (controls.sweepOn) {
var gain = Math.pow(2.0, controls.mainGain);
var sweepMinTime = controls.sweepMsDiv * 10 / 1000;
var triggerValue = controls.sweepTriggerValue;
for (var i = 0; i < xSamples.length; i++) {
xSamples[i] = sweepPosition / gain;
sweepPosition += 2 * AudioSystem.timePerSample / sweepMinTime;
if (sweepPosition > 1.1 && belowTrigger && ySamples[i] >= triggerValue)
sweepPosition = -1.3;
belowTrigger = ySamples[i] < triggerValue;
}
}
if (!controls.swapXY) Render.drawLineTexture(AudioSystem.smoothedXSamples, AudioSystem.smoothedYSamples);
else Render.drawLineTexture(AudioSystem.smoothedYSamples, AudioSystem.smoothedXSamples);
}
else
{
if (!controls.swapXY) Render.drawLineTexture(xSamples, ySamples);
else Render.drawLineTexture(ySamples, xSamples);
}
}
if (!controls.freezeImage) {
if (!controls.disableFilter) {
Filter.generateSmoothedSamples(AudioSystem.oldXSamples, xSamples, AudioSystem.smoothedXSamples);
Filter.generateSmoothedSamples(AudioSystem.oldYSamples, ySamples, AudioSystem.smoothedYSamples);
for (var i = 0; i<xSamples.length; i++) {
AudioSystem.oldXSamples[i] = xSamples[i];
AudioSystem.oldYSamples[i] = ySamples[i];
}
if (!controls.swapXY) Render.drawLineTexture(AudioSystem.smoothedXSamples, AudioSystem.smoothedYSamples);
else Render.drawLineTexture(AudioSystem.smoothedYSamples, AudioSystem.smoothedXSamples);
}
else {
if (!controls.swapXY) Render.drawLineTexture(xSamples, ySamples);
else Render.drawLineTexture(ySamples, xSamples);
}
}
requestAnimationFrame(drawCRTFrame);
for (var i = 0; i < xSamples.length; i++) {
AudioSystem.oldXSamples[i] = xSamples[i];
AudioSystem.oldYSamples[i] = ySamples[i];
}
requestAnimationFrame(drawCRTFrame);
}
req.send();
}
function drawCRTFrame(timeStamp) {

Wyświetl plik

@ -15,7 +15,7 @@ VisualiserComponent::VisualiserComponent(OscirenderAudioProcessor& p, Visualiser
setMouseCursor(juce::MouseCursor::PointingHandCursor);
setWantsKeyboardFocus(true);
addChildComponent(browser);
addAndMakeVisible(browser);
setVisualiserType(oldVisualiser);
roughness.textBox.setValue(audioProcessor.roughness);
@ -141,11 +141,7 @@ void VisualiserComponent::run() {
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);
browser.emitEventIfBrowserIsVisible("audioUpdated", juce::Base64::toBase64(buffer.data(), buffer.size() * sizeof(float)));
}
});
}
@ -228,12 +224,12 @@ void VisualiserComponent::setFullScreen(bool fullScreen) {}
void VisualiserComponent::setVisualiserType(bool oldVisualiser) {
this->oldVisualiser = oldVisualiser;
if (oldVisualiser) {
browser.setVisible(false);
// required to hide the browser - it is buggy if we use setVisible(false) on Windows
browser.goToURL("about:blank");
} else {
browser.setVisible(true);
browser.goToURL(juce::WebBrowserComponent::getResourceProviderRoot() + "oscilloscope.html");
}
resized();
}
void VisualiserComponent::paintXY(juce::Graphics& g, juce::Rectangle<float> area) {
@ -275,7 +271,11 @@ void VisualiserComponent::resetBuffer() {
}
void VisualiserComponent::resized() {
browser.setBounds(getLocalBounds());
if (oldVisualiser) {
browser.setBounds(0, 0, 0, 0);
} else {
browser.setBounds(getLocalBounds());
}
auto area = getLocalBounds();
area.removeFromBottom(5);
auto buttonRow = area.removeFromBottom(25);

Wyświetl plik

@ -105,6 +105,8 @@ private:
juce::WebBrowserComponent::Options()
.withNativeIntegrationEnabled()
.withResourceProvider(provider)
.withBackend(juce::WebBrowserComponent::Options::Backend::webview2)
.withWinWebView2Options(juce::WebBrowserComponent::Options::WinWebView2{})
.withNativeFunction("toggleFullscreen", [this](auto& var, auto complete) {
enableFullScreen();
})

Wyświetl plik

@ -631,7 +631,8 @@
</GROUP>
</MAINGROUP>
<JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_VST3_CAN_REPLACE_VST2="0"
JUCE_WIN_PER_MONITOR_DPI_AWARE="0"/>
JUCE_WIN_PER_MONITOR_DPI_AWARE="0" JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING="1"
JUCE_USE_WIN_WEBVIEW2="1"/>
<EXPORTFORMATS>
<LINUX_MAKE targetFolder="Builds/LinuxMakefile" smallIcon="pSc1mq" bigIcon="pSc1mq">
<CONFIGURATIONS>