/* Copyright (C) 2017 Xenakios This program is free software; you can redistribute it and/or modify it under the terms of version 3 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 3) for more details. www.gnu.org/licenses */ #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 = m_proc->m_propsfile->m_props_file->getValue(ID_lastrenderpath); auto sep = File::getSeparatorChar(); File temp(lastexportfile); if (temp.getParentDirectory().exists()) outfileNameEditor.setText(lastexportfile, dontSendNotification); else outfileNameEditor.setText(File::getSpecialLocation(File::userDocumentsDirectory).getFullPathName()+sep+"pxsrender.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; int 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); int oformat = comboBoxBitDepth.getSelectedId() - 1; if (oformat == 2 && m_toggleFloatClip.getToggleState()) oformat = 3; OfflineRenderParams renderpars{ File(outfileNameEditor.getText()),(double)comboBoxSamplerate.getSelectedId(), oformat,maxrenderlen,numLoops }; m_proc->m_propsfile->m_props_file->setValue(ID_lastrenderpath, outfileNameEditor.getText()); m_proc->offlineRender(renderpars); if (auto pardlg = dynamic_cast(getParentComponent()); 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"); myChooser.launchAsync(FileBrowserComponent::saveMode, [this](const FileChooser &chooser) { outfileNameEditor.setText(chooser.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()); } } }