diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index 03ddd617d53e5e19cf783edbab99c715403655b4..151287fe10235e5717abf93f8105602401514331 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -19,7 +19,7 @@ ifeq ($(CONFIG),Debug) OUTDIR := build CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 - CXXFLAGS += $(CFLAGS) -D__STDC_LIMIT_MACROS + CXXFLAGS += $(CFLAGS) -export-dynamic LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -L"/usr/X11R6/lib/" -L"../../JuceLibraryCode/bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound -lftdi -lftgl LDDEPS := RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" @@ -34,7 +34,7 @@ ifeq ($(CONFIG),Release) OUTDIR := build CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 - CXXFLAGS += $(CFLAGS) -D__STDC_LIMIT_MACROS + CXXFLAGS += $(CFLAGS) -export-dynamic LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -L"/usr/X11R6/lib/" -L"../../JuceLibraryCode/bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound -lftdi -lftgl LDDEPS := RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj index 0489fc54fe0b5810858a5df4c779a6adb27fb0f4..e6dfea255137553f617920d46d8f9d8ae4730225 100644 --- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj @@ -325,6 +325,7 @@ 1640CC946EDFD5EC9A321954 = { isa = PBXGroup; children = ( 2D8E1C366F21D3C8FE662382, 4E8DA551A1B5D7A2B1229181 ); name = Resources; sourceTree = "<group>"; }; + 21721C7CD4451993F10354CB = { isa = PBXGroup; children = ( ); name = Plugins; sourceTree = "<group>"; }; 8F98BACF97340868397BA4BB = { isa = PBXGroup; children = ( 673778A175624FC9F52E7A15, 2EAE0475B719C3233AD8BB35 ); name = Network; sourceTree = "<group>"; }; @@ -479,6 +480,7 @@ 2A78F719BAFBDCD63AE9A88A, DB605BA15852F367DF625300 ); name = UI; sourceTree = "<group>"; }; 98D3BECE25EB3CF1F64F54B4 = { isa = PBXGroup; children = ( + 21721C7CD4451993F10354CB, CA0A1584725D21237DBCD70A, 63992CB3AC42F91A51135EAC, 8F98BACF97340868397BA4BB, diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp index 842b46e2ef66f232c2a29271cd0dad1e19501b04..a6d26414e2369f8739ab2faa7c18ea36867f105e 100644 --- a/Source/Processors/Editors/GenericEditor.cpp +++ b/Source/Processors/Editors/GenericEditor.cpp @@ -83,6 +83,11 @@ GenericEditor::GenericEditor (GenericProcessor* owner)//, FilterViewport* vp) backgroundColor = Colour(255, 89, 0);//Colour(int(1.0*255.0f),int(0.5*255.0f),int(0.0*255.0f)); + paramsChannels.clear(); + audioChannels.clear(); + recordChannels.clear(); + + fadeIn(); } @@ -311,25 +316,25 @@ bool GenericEditor::checkChannelSelectors(Button* button) if (button == channelSelectorButtons[n]) { - String type; + // String type; if (audioButton->getToggleState()) { audioChannels.set(n,button->getToggleState()); - type = "Audio "; + //type = "Audio "; } else if (recordButton->getToggleState()) { recordChannels.set(n,button->getToggleState()); - type = "Record "; + //type = "Record "; } else if (paramsButton->getToggleState()) { paramsChannels.set(n,button->getToggleState()); - type = "Params "; + //type = "Params "; } - std::cout << type << "button " << n << " clicked." << std::endl; + //std::cout << type << "button " << n << " clicked." << std::endl; return true; } @@ -401,6 +406,22 @@ bool GenericEditor::checkChannelSelectors(Button* button) } +Array<int> GenericEditor::getActiveChannels() +{ + Array<int> chans; + + for (int n = 0; n < paramsChannels.size(); n++) + { + if (paramsChannels[n]) + { + chans.add(n); + } + + } + + return chans; +} + void GenericEditor::createRadioButtons(int x, int y, int w, StringArray values, const String& groupName) { int numButtons = values.size(); diff --git a/Source/Processors/Editors/GenericEditor.h b/Source/Processors/Editors/GenericEditor.h index a6c3f702829576801fbd09f41a0b81c2bc6862c2..fd961afb62c4072c8f950233a40059f5acf67dd1 100644 --- a/Source/Processors/Editors/GenericEditor.h +++ b/Source/Processors/Editors/GenericEditor.h @@ -99,6 +99,8 @@ public: bool checkDrawerButton(Button* button); bool checkChannelSelectors(Button* button); + + Array<int> getActiveChannels(); private: diff --git a/Source/Processors/Editors/SignalGeneratorEditor.cpp b/Source/Processors/Editors/SignalGeneratorEditor.cpp index 4e3fc1efbc1029d8fce2222818461fd00c4431d8..ccf5a351e49bbb4524d20167d34158552d025a28 100644 --- a/Source/Processors/Editors/SignalGeneratorEditor.cpp +++ b/Source/Processors/Editors/SignalGeneratorEditor.cpp @@ -55,9 +55,22 @@ SignalGeneratorEditor::~SignalGeneratorEditor() void SignalGeneratorEditor::sliderValueChanged (Slider* slider) { - if (slider == amplitudeSlider) - getAudioProcessor()->setParameter(0,slider->getValue()); - else - getAudioProcessor()->setParameter(1,slider->getValue()); + Array<int> chans = getActiveChannels(); + + //std::cout << chans.size() << " channels selected." << std::endl; + + GenericProcessor* p = (GenericProcessor*) getAudioProcessor(); + + for (int n = 0; n < chans.size(); n++) { + + p->setCurrentChannel(chans[n]); + + if (slider == amplitudeSlider) + p->setParameter(0,slider->getValue()); + else + p->setParameter(1,slider->getValue()); + + } + } \ No newline at end of file diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp index 1fe7db01ddec10edacf71076389e9b07ea32f716..cd622da74210967d55e0726eec4bb91655189089 100644 --- a/Source/Processors/GenericProcessor.cpp +++ b/Source/Processors/GenericProcessor.cpp @@ -26,7 +26,7 @@ GenericProcessor::GenericProcessor(const String& name_) : name(name_), sourceNode(0), destNode(0), editor(0), isEnabled(true), saveOrder(-1), loadOrder(-1), - nextAvailableChannel(0), wasConnected(false) + nextAvailableChannel(0), wasConnected(false), currentChannel(-1) { @@ -81,7 +81,7 @@ int GenericProcessor::getDefaultNumOutputs() { if (!isSink()) { - return 16; + return 10; } else { return 0; } @@ -294,6 +294,13 @@ void GenericProcessor::updateSettings() setPlayConfigDetails(getNumInputs(), getNumOutputs(), 44100.0, 128); + updateParameters(); + +} + +void GenericProcessor::updateParameters() +{ + } diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h index 9c159be66efd27d0fd15cdee256edcc2df1ad773..1612abe31703ec09ba94ce1a219f3672d5f59980 100644 --- a/Source/Processors/GenericProcessor.h +++ b/Source/Processors/GenericProcessor.h @@ -137,7 +137,10 @@ public: virtual int getNextChannel(bool); virtual void resetConnections(); - virtual void updateSettings(); + virtual void updateSettings(); // updates sample rate and number of channels + virtual void updateParameters(); // called in updateSettings() to update params + + virtual void setCurrentChannel(int chan) {currentChannel = chan;} int getNodeId() {return nodeId;} void setNodeId(int id) {nodeId = id;} @@ -188,6 +191,8 @@ public: int saveOrder; int loadOrder; + int currentChannel; + // Getting and setting: diff --git a/Source/Processors/SignalGenerator.cpp b/Source/Processors/SignalGenerator.cpp index a016c9d1759795871c3f25c1141d7c06646e6312..08093b35b4b8e70368bfb8d027252c8b3069240e 100644 --- a/Source/Processors/SignalGenerator.cpp +++ b/Source/Processors/SignalGenerator.cpp @@ -29,15 +29,12 @@ SignalGenerator::SignalGenerator() : GenericProcessor("Signal Generator"), - frequency(10.0), - sampleRate (44100.0), - currentPhase (0.0), - phasePerSample (0.0), - amplitude (0.02f) + defaultFrequency(10.0), + defaultAmplitude (0.02f) { - setNumOutputs(16); + setNumOutputs(10); setNumInputs(0); @@ -73,25 +70,44 @@ AudioProcessorEditor* SignalGenerator::createEditor( ) return ed; } +void SignalGenerator::updateParameters() +{ + + std::cout << "Signal generator updating parameters" << std::endl; + + frequencies.clear(); + amplitudes.clear(); + currentPhase.clear(); + phasePerSample.clear(); + + for (int n = 0; n < getNumOutputs(); n++) + { + frequencies.add(defaultFrequency*n); + amplitudes.add(defaultAmplitude); + currentPhase.add(0); + phasePerSample.add(double_Pi * 2.0 / (getSampleRate() / frequencies[n])); + } + +} void SignalGenerator::setParameter (int parameterIndex, float newValue) { //std::cout << "Message received." << std::endl; - if (parameterIndex == 0) - amplitude = newValue; - else - frequency = newValue; - - phasePerSample = double_Pi * 2.0 / (sampleRate / frequency); + if (currentChannel > -1) { + if (parameterIndex == 0) { + amplitudes.set(currentChannel,newValue); + } else { + frequencies.set(currentChannel,newValue); + phasePerSample.set(currentChannel, double_Pi * 2.0 / (sampleRate / frequencies[currentChannel])); + } + } } bool SignalGenerator::enable () { - phasePerSample = double_Pi * 2.0 / (getSampleRate() / frequency); - std::cout << "Signal generator received enable signal." << std::endl; return true; } @@ -112,11 +128,13 @@ void SignalGenerator::process(AudioSampleBuffer &buffer, for (int i = 0; i < nSamps; ++i) { - const float sample = amplitude * (float) std::sin (currentPhase); - currentPhase += phasePerSample; + for (int j = buffer.getNumChannels(); --j >= 0;) { + + const float sample = amplitudes[j] * (float) std::sin (currentPhase[j]); + currentPhase.set(j,currentPhase[j] + phasePerSample[j]); - for (int j = buffer.getNumChannels(); --j >= 0;) - // dereference pointer to one of the buffer's samples + // dereference pointer to one of the buffer's samples *buffer.getSampleData (j, i) = sample; + } } } diff --git a/Source/Processors/SignalGenerator.h b/Source/Processors/SignalGenerator.h index 9da2f8939ad0b1a5adcf36ef774e5c61b558cedf..abf1036edcff43ff4d3530e60b87b19c2d2d53ed 100644 --- a/Source/Processors/SignalGenerator.h +++ b/Source/Processors/SignalGenerator.h @@ -61,11 +61,17 @@ public: bool isSource() {return true;} + void updateParameters(); + private: - double frequency, sampleRate; - double currentPhase, phasePerSample; - float amplitude; + double defaultFrequency; + double defaultAmplitude; + + Array<double> frequencies; + Array<double> amplitudes; + Array<double> currentPhase; + Array<double> phasePerSample; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SignalGenerator); diff --git a/open-ephys.jucer b/open-ephys.jucer index 13b88c879fdfa49b63605609f659359045938f61..2768d9df5014df67ecc942d65400bef9ec6de543 100644 --- a/open-ephys.jucer +++ b/open-ephys.jucer @@ -12,7 +12,7 @@ <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" juceFolder="JuceLibraryCode" extraLinkerFlags="-lftdi -lftgl"/> <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" juceFolder="JuceLibraryCode" - extraLinkerFlags="-lftdi -lftgl" extraCompilerFlags="-D__STDC_LIMIT_MACROS"/> + extraLinkerFlags="-lftdi -lftgl" extraCompilerFlags="-export-dynamic"/> </EXPORTFORMATS> <CONFIGURATIONS> <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="open-ephys" @@ -74,6 +74,7 @@ </GROUP> </GROUP> <GROUP id="ZMfWAFj" name="Source"> + <GROUP id="C4YiLUg" name="Plugins"/> <FILE id="AXFRUPT" name="AccessClass.cpp" compile="1" resource="0" file="Source/AccessClass.cpp"/> <FILE id="2ViPrE" name="AccessClass.h" compile="0" resource="0" file="Source/AccessClass.h"/>