From d51efee6fe713181f6cdcc7591cc2a48209065f6 Mon Sep 17 00:00:00 2001 From: labdmc <neuron@neurons-Mac-mini.local> Date: Fri, 20 Sep 2013 15:30:35 +0200 Subject: [PATCH] Add option to open new files in Record Controller --- Source/Processors/Editors/GenericEditor.cpp | 2 +- .../Editors/RecordControlEditor.cpp | 37 +++++++++++++++---- .../Processors/Editors/RecordControlEditor.h | 7 ++-- Source/Processors/GenericProcessor.h | 6 +++ Source/Processors/ProcessorGraph.cpp | 2 +- Source/Processors/RecordNode.cpp | 37 ++++++++++++++++++- Source/Processors/RecordNode.h | 13 +++++++ Source/Processors/Utilities/RecordControl.cpp | 36 +++++++++++++++++- Source/Processors/Utilities/RecordControl.h | 10 +++++ Source/UI/EditorViewport.cpp | 2 +- Source/UI/ProcessorList.cpp | 2 +- 11 files changed, 136 insertions(+), 18 deletions(-) diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp index ea497eb13..745d0dad0 100755 --- a/Source/Processors/Editors/GenericEditor.cpp +++ b/Source/Processors/Editors/GenericEditor.cpp @@ -158,7 +158,7 @@ void GenericEditor::refreshColors() backgroundColor = getProcessorList()->findColour(SOURCE_COLOR);// Colour(255, 0, 0);//Colour(int(0.9*255.0f),int(0.019*255.0f),int(0.16*255.0f)); else if (getProcessor()->isSink()) backgroundColor = getProcessorList()->findColour(SINK_COLOR);//Colour(255, 149, 0);//Colour(int(0.06*255.0f),int(0.46*255.0f),int(0.9*255.0f)); - else if (getProcessor()->isSplitter() || getProcessor()->isMerger()) + else if (getProcessor()->isSplitter() || getProcessor()->isMerger() || getProcessor()->isUtility()) backgroundColor = getProcessorList()->findColour(UTILITY_COLOR);//Colour(40, 40, 40);//Colour(int(0.7*255.0f),int(0.7*255.0f),int(0.7*255.0f)); else backgroundColor = getProcessorList()->findColour(FILTER_COLOR);//Colour(255, 89, 0);//Colour(int(1.0*255.0f),int(0.5*255.0f),int(0.0*255.0f)); diff --git a/Source/Processors/Editors/RecordControlEditor.cpp b/Source/Processors/Editors/RecordControlEditor.cpp index d374e7739..c43770639 100644 --- a/Source/Processors/Editors/RecordControlEditor.cpp +++ b/Source/Processors/Editors/RecordControlEditor.cpp @@ -50,29 +50,50 @@ RecordControlEditor::RecordControlEditor(GenericProcessor* parentNode, bool useD availableChans->setSelectedId(0); addAndMakeVisible(availableChans); - + + newFileToggleButton = new UtilityButton("SPLIT FILES", Font("Small Text", 13, Font::plain)); + newFileToggleButton->setRadius(3.0f); + newFileToggleButton->setBounds(45, 95, 90, 18); + newFileToggleButton->addListener(this); + newFileToggleButton->setClickingTogglesState(true); + addAndMakeVisible(newFileToggleButton); } RecordControlEditor::~RecordControlEditor() { - deleteAllChildren(); + //deleteAllChildren(); } void RecordControlEditor::comboBoxChanged(ComboBox* comboBox) { - RecordControl* processor = (RecordControl*)getProcessor(); + if (comboBox->getSelectedId() > 0) - processor->updateTriggerChannel(processor->eventChannels[comboBox->getSelectedId()-1]->num); + getProcessor()->setParameter(0, (float) comboBox->getSelectedId()-1); else - processor->updateTriggerChannel(-1); + getProcessor()->setParameter(0, -1); +} + +void RecordControlEditor::buttonEvent(Button* button) +{ + + if (button->getToggleState()) + { + getProcessor()->setParameter(1, 1.0f); + } else { + getProcessor()->setParameter(1, 0.0f); + } } void RecordControlEditor::updateSettings() { availableChans->clear(); - GenericProcessor* processor = getProcessor(); - for (int i = 0; i < processor->eventChannels.size() ; i++) - availableChans->addItem(processor->eventChannels[i]->name,i+1); + //GenericProcessor* processor = getProcessor(); + for (int i = 0; i < 10 ; i++) + { + String channelName = "Channel "; + channelName += i + 1; + availableChans->addItem(channelName,i+1); + } } \ No newline at end of file diff --git a/Source/Processors/Editors/RecordControlEditor.h b/Source/Processors/Editors/RecordControlEditor.h index fd750ee8b..011ec844c 100644 --- a/Source/Processors/Editors/RecordControlEditor.h +++ b/Source/Processors/Editors/RecordControlEditor.h @@ -43,11 +43,12 @@ public: ~RecordControlEditor(); void comboBoxChanged(ComboBox* comboBox); void updateSettings(); + void buttonEvent(Button* button); private: - ComboBox* availableChans; - Label* chanSel; - + ScopedPointer<ComboBox> availableChans; + ScopedPointer<Label> chanSel; + ScopedPointer<UtilityButton> newFileToggleButton; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControlEditor); diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h index 6ac89462f..21a77ccc4 100755 --- a/Source/Processors/GenericProcessor.h +++ b/Source/Processors/GenericProcessor.h @@ -363,6 +363,12 @@ public: { return false; } + + /** Returns true if a processor is a utility (non-merger or splitter), false otherwise.*/ + virtual bool isUtility() + { + return false; + } /** Returns true if a processor is able to send its output to a given processor. diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp index b086dbebc..d03d5a391 100644 --- a/Source/Processors/ProcessorGraph.cpp +++ b/Source/Processors/ProcessorGraph.cpp @@ -535,7 +535,7 @@ GenericProcessor* ProcessorGraph::createProcessorFromDescription(String& descrip sendActionMessage("New merger created."); } - else if (subProcessorType.equalsIgnoreCase("Record Control")) + else if (subProcessorType.equalsIgnoreCase("Record Controller")) { std::cout << "Creating a new record controller." << std::endl; diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp index 3ec1c1f7f..0ddd3f160 100755 --- a/Source/Processors/RecordNode.cpp +++ b/Source/Processors/RecordNode.cpp @@ -30,7 +30,8 @@ RecordNode::RecordNode() : GenericProcessor("Record Node"), - newDirectoryNeeded(true), zeroBuffer(1, 50000), timestamp(0) + newDirectoryNeeded(true), zeroBuffer(1, 50000), timestamp(0), + appendTrialNum(false), trialNum(0) { isProcessing = false; @@ -197,20 +198,39 @@ void RecordNode::updateFileName(Channel* ch) filename += ch->nodeId; filename += "_"; filename += ch->name; + + if (appendTrialNum) + { + filename += "_"; + filename += trialNum; + } + filename += ".continuous"; } else { filename += "all_channels.events"; } - + + ch->filename = filename; ch->file = 0; + //std::cout << "Updating " << filename << std::endl; } +void RecordNode::updateTrialNumber() +{ + trialNum++; +} + +void RecordNode::appendTrialNumber(bool t) +{ + appendTrialNum = t; +} + void RecordNode::createNewDirectory() { std::cout << "Creating new directory." << std::endl; @@ -225,9 +245,20 @@ void RecordNode::createNewDirectory() } newDirectoryNeeded = false; + + trialNum = 0; } +void RecordNode::createNewFiles() +{ + for (int i = 0; i < channelPointers.size(); i++) + { + updateFileName(channelPointers[i]); + } + +} + String RecordNode::generateDirectoryName() { Time calendar = Time::getCurrentTime(); @@ -325,6 +356,8 @@ void RecordNode::setParameter(int parameterIndex, float newValue) getEditorViewport()->saveState(File(settingsFileName)); } + createNewFiles(); + openFile(eventChannel); sampleCount = 0; // reset sample count diff --git a/Source/Processors/RecordNode.h b/Source/Processors/RecordNode.h index 1b1a6ce96..aa84b43fa 100755 --- a/Source/Processors/RecordNode.h +++ b/Source/Processors/RecordNode.h @@ -101,6 +101,16 @@ public: /** Creates a new data directory in the location specified by the fileNameComponent. */ void createNewDirectory(); + + /** Creates a new data file for each channel. + */ + void createNewFiles(); + + /** Creates a new data file for each channel. + */ + void appendTrialNumber(bool); + + void updateTrialNumber(); File getDataDirectory() { @@ -203,6 +213,9 @@ private: char* recordMarker; CriticalSection diskWriteLock; + + bool appendTrialNum; + int trialNum; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordNode); diff --git a/Source/Processors/Utilities/RecordControl.cpp b/Source/Processors/Utilities/RecordControl.cpp index 528488a18..1b4286a10 100644 --- a/Source/Processors/Utilities/RecordControl.cpp +++ b/Source/Processors/Utilities/RecordControl.cpp @@ -27,7 +27,8 @@ #include "../../UI/ControlPanel.h" RecordControl::RecordControl() - : GenericProcessor("Record Controller"), triggerChannel(0) + : GenericProcessor("Record Controller"), + createNewFilesOnTrigger(false), triggerChannel(0), recordNode(0) { } @@ -43,11 +44,40 @@ AudioProcessorEditor* RecordControl::createEditor() return editor; } +void RecordControl::setParameter(int parameterIndex, float newValue) +{ + if (parameterIndex == 0) + { + updateTriggerChannel((int) newValue); + } else { + + if (newValue == 0.0) + { + createNewFilesOnTrigger = false; + + + } else { + createNewFilesOnTrigger = true; + } + //recordNode->appendTrialNumber(createNewFilesOnTrigger); + } +} + void RecordControl::updateTriggerChannel(int newChannel) { triggerChannel = newChannel; } +bool RecordControl::enable() +{ + if (recordNode == 0) + recordNode = getProcessorGraph()->getRecordNode(); + + recordNode->appendTrialNumber(createNewFilesOnTrigger); + + return true; +} + void RecordControl::process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples) @@ -74,6 +104,10 @@ void RecordControl::handleEvent(int eventType, MidiMessage& event, int) if (eventId == 1) { + if (createNewFilesOnTrigger) + { + recordNode->updateTrialNumber(); + } getControlPanel()->setRecordState(true); } else diff --git a/Source/Processors/Utilities/RecordControl.h b/Source/Processors/Utilities/RecordControl.h index 55c9bf609..56c47bc60 100644 --- a/Source/Processors/Utilities/RecordControl.h +++ b/Source/Processors/Utilities/RecordControl.h @@ -27,6 +27,7 @@ #include "../../../JuceLibraryCode/JuceHeader.h" #include "../GenericProcessor.h" #include "../Editors/RecordControlEditor.h" +#include "../RecordNode.h" /** @@ -43,13 +44,22 @@ public: ~RecordControl(); void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int, float); void updateTriggerChannel(int newChannel); void handleEvent(int eventType, MidiMessage& event, int); + bool enable(); + + bool createNewFilesOnTrigger; + + bool isUtility() {return true;} AudioProcessorEditor* createEditor(); private: int triggerChannel; + + + RecordNode* recordNode; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControl); diff --git a/Source/UI/EditorViewport.cpp b/Source/UI/EditorViewport.cpp index a3c45dc1d..85e32616f 100755 --- a/Source/UI/EditorViewport.cpp +++ b/Source/UI/EditorViewport.cpp @@ -1059,7 +1059,7 @@ XmlElement* EditorViewport::createNodeXml(GenericEditor* editor, name += "Sources/"; else if (source->isSink()) name += "Sinks/"; - else if (source->isSplitter() || source->isMerger()) + else if (source->isSplitter() || source->isMerger() || source->isUtility()) name += "Utilities/"; else name += "Filters/"; diff --git a/Source/UI/ProcessorList.cpp b/Source/UI/ProcessorList.cpp index ff7ded654..87719e223 100755 --- a/Source/UI/ProcessorList.cpp +++ b/Source/UI/ProcessorList.cpp @@ -79,7 +79,7 @@ ProcessorList::ProcessorList() ProcessorListItem* utilities = new ProcessorListItem("Utilities"); utilities->addSubItem(new ProcessorListItem("Splitter")); utilities->addSubItem(new ProcessorListItem("Merger")); - utilities->addSubItem(new ProcessorListItem("Record Control")); + utilities->addSubItem(new ProcessorListItem("Record Controller")); baseItem = new ProcessorListItem("Processors"); baseItem->addSubItem(sources); -- GitLab