diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 4ba725c..063ea20 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -21,6 +21,7 @@ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "PluginProcessor.h" #include "PluginEditor.h" #include +#include "RenderSettingsComponent.h" extern String g_plugintitle; @@ -246,6 +247,9 @@ PaulstretchpluginAudioProcessorEditor::~PaulstretchpluginAudioProcessorEditor() void PaulstretchpluginAudioProcessorEditor::showRenderDialog() { + auto content = new RenderSettingsComponent(&processor); + CallOutBox& myBox + = CallOutBox::launchAsynchronously(content, getScreenBounds(), nullptr); } void PaulstretchpluginAudioProcessorEditor::paint (Graphics& g) diff --git a/Source/RenderSettingsComponent.cpp b/Source/RenderSettingsComponent.cpp new file mode 100644 index 0000000..f6d5fbb --- /dev/null +++ b/Source/RenderSettingsComponent.cpp @@ -0,0 +1,215 @@ +/* +Copyright (C) 2017 Xenakios + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License +as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License (version 2) for more details. + +You should have received a copy of the GNU General Public License (version 2) +along with this program; if not, write to the Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "PluginProcessor.h" +//extern std::unique_ptr g_propsfile; +#include "RenderSettingsComponent.h" + +RenderSettingsComponent::RenderSettingsComponent (PaulstretchpluginAudioProcessor* mc) +{ + m_proc = mc; + addAndMakeVisible(&m_labelMaxOutDuration); + m_labelMaxOutDuration.setText("Max output duration (hours) :", dontSendNotification); + addAndMakeVisible(&m_editorMaxOutDuration); + m_editorMaxOutDuration.setText("1.0", dontSendNotification); + addAndMakeVisible(&m_toggleFloatClip); + m_toggleFloatClip.setButtonText("Clip floating point output"); + m_toggleFloatClip.setToggleState(false, dontSendNotification); + addAndMakeVisible(&labelSamplerate); + labelSamplerate.setText("Sample rate :", dontSendNotification); + addAndMakeVisible(&comboBoxSamplerate); + comboBoxSamplerate.addItem("Source sample rate", 1); + comboBoxSamplerate.addItem("44100", 44100); + comboBoxSamplerate.addItem("48000", 48000); + comboBoxSamplerate.addItem("88200", 88200); + comboBoxSamplerate.addItem("96000", 96000); + + comboBoxSamplerate.addListener (this); + + addAndMakeVisible(&labelBitDepth); + labelBitDepth.setText("Format :", dontSendNotification); + addAndMakeVisible(&comboBoxBitDepth); + comboBoxBitDepth.addItem (TRANS("16 bit PCM"), 1); + comboBoxBitDepth.addItem (TRANS("24 bit PCM"), 2); + comboBoxBitDepth.addItem (TRANS("32 bit floating point"), 3); + comboBoxBitDepth.addListener (this); + + addAndMakeVisible(&buttonRender); + buttonRender.setButtonText (TRANS("Render")); + buttonRender.addListener (this); + + addAndMakeVisible(&label3); + label3.setText("Number of loops\n(approximate) :", dontSendNotification); + addAndMakeVisible(&numLoopsEditor); + numLoopsEditor.setMultiLine (false); + numLoopsEditor.setReturnKeyStartsNewLine (false); + numLoopsEditor.setReadOnly (false); + numLoopsEditor.setCaretVisible (true); + numLoopsEditor.setText (TRANS("1")); + + addAndMakeVisible(&label4); + label4.setText("Output file :\n", dontSendNotification); + + + addAndMakeVisible(&outfileNameEditor); + outfileNameEditor.setMultiLine (false); + outfileNameEditor.setReturnKeyStartsNewLine (false); + outfileNameEditor.setReadOnly (false); + outfileNameEditor.setScrollbarsShown (true); + outfileNameEditor.setCaretVisible (true); + outfileNameEditor.addListener(this); + + addAndMakeVisible(&buttonSelectFile); + buttonSelectFile.setTooltip("Open dialog to choose file to render to"); + buttonSelectFile.setButtonText (TRANS("...")); + buttonSelectFile.addListener (this); + setSize (600, 400); + comboBoxSamplerate.setSelectedId(1); + comboBoxBitDepth.setSelectedId(3); + String lastexportfile = ""; // g_propsfile->getValue("last_export_file"); + auto sep = File::getSeparatorChar(); + File temp(lastexportfile); + if (temp.getParentDirectory().exists()) + outfileNameEditor.setText(lastexportfile, dontSendNotification); + else + outfileNameEditor.setText(File::getSpecialLocation(File::userDocumentsDirectory).getFullPathName()+sep+"untitled.wav", + dontSendNotification); + numLoopsEditor.setVisible(m_proc->getStretchSource()->isLoopingEnabled()); + label3.setVisible(m_proc->getStretchSource()->isLoopingEnabled()); +} + +RenderSettingsComponent::~RenderSettingsComponent() +{ + //g_propsfile->setValue("last_export_file",outfileNameEditor.getText()); +} + +//============================================================================== +void RenderSettingsComponent::paint (Graphics& g) +{ + g.fillAll (Colour (0xff323e44)); +} + +void RenderSettingsComponent::resized() +{ + int xoffs = 8; + int yoffs = 1; + int labelw = 160; + int labelh = 24; + + label4.setBounds(xoffs, yoffs, labelw, 24); + outfileNameEditor.setBounds(label4.getRight()+1, yoffs, getWidth() - labelw - 34 - xoffs, 24); + buttonSelectFile.setBounds(outfileNameEditor.getRight() + 1, yoffs, 31, 24); + yoffs += 25; + labelSamplerate.setBounds (xoffs, yoffs, labelw, labelh); + comboBoxSamplerate.setBounds (labelSamplerate.getRight()+1, yoffs, 150, 24); + yoffs += 25; + labelBitDepth.setBounds (xoffs, yoffs, labelw, 24); + comboBoxBitDepth.setBounds (labelBitDepth.getRight()+1, yoffs, 150, 24); + m_toggleFloatClip.setBounds(comboBoxBitDepth.getRight() + 1, yoffs, 10, 24); + m_toggleFloatClip.changeWidthToFitText(); + yoffs += 25; + if (m_proc->getStretchSource()->isLoopingEnabled()) + { + label3.setBounds(xoffs, yoffs, labelw, 48); + numLoopsEditor.setBounds(label3.getRight() + 1, yoffs, 150, 24); + yoffs += 50; + } + + + m_labelMaxOutDuration.setBounds(xoffs, yoffs, 220, 24); + m_editorMaxOutDuration.setBounds(m_labelMaxOutDuration.getRight() + 1, yoffs, 50, 24); + yoffs += 25; + buttonRender.setBounds(getWidth() - 152, getHeight()-25, 150, 24); +} + +void RenderSettingsComponent::comboBoxChanged (ComboBox* comboBoxThatHasChanged) +{ + if (comboBoxThatHasChanged == &comboBoxBitDepth) + { + if (comboBoxBitDepth.getSelectedId() == 3) + m_toggleFloatClip.setEnabled(true); + else m_toggleFloatClip.setEnabled(false); + } + +} + +void RenderSettingsComponent::buttonClicked (Button* buttonThatWasClicked) +{ + if (buttonThatWasClicked == &buttonRender) + { + File outfile(outfileNameEditor.getText()); + if (outfile.getParentDirectory().exists()==false) + buttonClicked(&buttonSelectFile); + outfile = File(outfileNameEditor.getText()); + if (outfile.getParentDirectory().exists()==false) + return; + int64_t numLoops = 0; + if (numLoopsEditor.isVisible()) + numLoops = numLoopsEditor.getText().getLargeIntValue(); + numLoops = jlimit(0, 1000000, numLoops); + int sampleRate = comboBoxSamplerate.getSelectedId(); + if (sampleRate == 1) + sampleRate = 0; + double maxrenderlen = m_editorMaxOutDuration.getText().getDoubleValue()*3600.0; + maxrenderlen = jlimit(1.0, 1000000.0, maxrenderlen); + //m_main->renderToFile(File(outfileNameEditor.getText()),numLoops, + // comboBoxBitDepth.getSelectedId()-1,sampleRate,m_toggleFloatClip.getToggleState(),maxrenderlen); + auto pardlg = dynamic_cast(getParentComponent()); + { + if (pardlg != nullptr) + pardlg->exitModalState(1); + } + return; + } + else if (buttonThatWasClicked == &buttonSelectFile) + { + File lastexportfolder = ""; // File(g_propsfile->getValue("last_export_file")).getParentDirectory(); + FileChooser myChooser("Please select audio file to render...", + lastexportfolder, + "*.wav"); + if (myChooser.browseForFileToSave(true)) + { + outfileNameEditor.setText(myChooser.getResult().getFullPathName(), dontSendNotification); + } + } +} + +int RenderSettingsComponent::getPreferredHeight() +{ + if (m_proc->getStretchSource()->isLoopingEnabled()) + return 180; + return 150; +} + +void RenderSettingsComponent::textEditorTextChanged(TextEditor & ed) +{ + return; + if (&ed == &outfileNameEditor) + { + File temp(outfileNameEditor.getText()); + if (temp.getParentDirectory().exists() == false) + { + Logger::writeToLog("directory does not exist"); + } + if (temp.exists() == true) + { + File temp2 = temp.getNonexistentSibling(); + Logger::writeToLog(temp.getFullPathName() + " exists, will instead use " + temp2.getFullPathName()); + } + } +} + diff --git a/Source/RenderSettingsComponent.h b/Source/RenderSettingsComponent.h new file mode 100644 index 0000000..3513488 --- /dev/null +++ b/Source/RenderSettingsComponent.h @@ -0,0 +1,56 @@ +#pragma once + +/* +Copyright (C) 2017 Xenakios + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License +as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License (version 2) for more details. + +You should have received a copy of the GNU General Public License (version 2) +along with this program; if not, write to the Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "../JuceLibraryCode/JuceHeader.h" +class PaulstretchpluginAudioProcessor; + +class RenderSettingsComponent : public Component, + public ComboBox::Listener, + public Button::Listener, + public TextEditor::Listener +{ +public: + //============================================================================== + RenderSettingsComponent (PaulstretchpluginAudioProcessor* mc); + ~RenderSettingsComponent(); + + void paint (Graphics& g) override; + void resized() override; + void comboBoxChanged (ComboBox* comboBoxThatHasChanged) override; + void buttonClicked (Button* buttonThatWasClicked) override; + int getPreferredHeight(); + void textEditorTextChanged(TextEditor& ed) override; +private: + PaulstretchpluginAudioProcessor * m_proc = nullptr; + Label labelSamplerate; + ComboBox comboBoxSamplerate; + Label labelBitDepth; + ComboBox comboBoxBitDepth; + TextButton buttonRender; + Label label3; + TextEditor numLoopsEditor; + Label label4; + TextEditor outfileNameEditor; + TextButton buttonSelectFile; + Label m_labelMaxOutDuration; + TextEditor m_editorMaxOutDuration; + ToggleButton m_toggleFloatClip; + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RenderSettingsComponent) +}; diff --git a/paulstretchplugin.jucer b/paulstretchplugin.jucer index 13e2747..440e155 100644 --- a/paulstretchplugin.jucer +++ b/paulstretchplugin.jucer @@ -14,6 +14,8 @@ jucerVersion="5.3.1" headerPath=" " pluginFormats="buildVST,buildAU,buildStandalone"> +