Skip to content

Commit 7b9078e

Browse files
committed
Implemented LinearSmoothedValueAtomic class.
* Implemented LinearSmoothedValueAtomic class based on the JUCE 4.0 library' LinearSmoothedValue class but with some improvements that were suggested by Timur Doumler during his JUCE Summit 2015 talk. * LinearSmoothedValueAtomic is very convenient to use with float values that need linearly smoothed behaviour (like volume, etc.) and which are shared between several threads (i.e. audio and GUI). * This class guarantees we won't have any race conditions and it will remains lock-free because of using std::atomic inside it.
1 parent dbcd7ff commit 7b9078e

8 files changed

Lines changed: 154 additions & 8 deletions

File tree

Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@
202202
13D9DC48F19699485F9888A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathIterator.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h"; sourceTree = "SOURCE_ROOT"; };
203203
1463D2DAB3A1D8CEE825056A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h"; sourceTree = "SOURCE_ROOT"; };
204204
146C6A6E3C6B17F2AF475B50 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLFrameBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp"; sourceTree = "SOURCE_ROOT"; };
205+
148FE750B55B2F7EA3899408 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LinearSmoothedValueAtomic.h; path = ../../Source/Processors/Dsp/LinearSmoothedValueAtomic.h; sourceTree = "SOURCE_ROOT"; };
205206
14DD0220B41F74C01A9DC676 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; };
206207
14FE601229C9A40C6E182F28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MouseCursor.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm"; sourceTree = "SOURCE_ROOT"; };
207208
1518D2BA7FCAF267EF1F02E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1140,19 +1141,16 @@
11401141
E835BEB3C42E4B241804BE13 = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-light-serialized"; path = "../../Resources/Fonts/cpmono-light-serialized"; sourceTree = "SOURCE_ROOT"; };
11411142
E8964C0BE264A55753BC6B7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp"; sourceTree = "SOURCE_ROOT"; };
11421143
E8D51D470C9955D7D03D5469 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevII.h; path = ../../Source/Processors/Dsp/ChebyshevII.h; sourceTree = "SOURCE_ROOT"; };
1144+
E91923510CB2280C3A3B9E9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; };
1145+
E91A272EF06892937CB4B9CE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; };
11431146
E93BE115650B1CB80EACB841 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EditorViewportButtons.h; path = ../../Source/UI/EditorViewportButtons.h; sourceTree = "SOURCE_ROOT"; };
11441147
E946426F95E0240683CB3337 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawablePath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h"; sourceTree = "SOURCE_ROOT"; };
1145-
EA2FC92CECD1EDA1F07DC59C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h"; sourceTree = "SOURCE_ROOT"; };
1146-
EA354D7D8E48D461415D52D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
1147-
ECBEF88BBC974D96ED781C75 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; };
1148-
ECCE033FF2ACE42188FA4A7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; };
1149-
EF610B2A17D9B1C0D24DCE67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; };
1148+
E97684DCE824DEDA6683C6CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; };
11501149
F5A00ACFA3D76168F22F1205 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
11511150
99E1BC08B886CFDD2CCFD462 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
11521151
E39CC410838072043E3C30DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OriginalRecording.cpp; path = ../../Source/Processors/RecordNode/OriginalRecording.cpp; sourceTree = "SOURCE_ROOT"; };
1153-
E91923510CB2280C3A3B9E9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; };
1154-
E91A272EF06892937CB4B9CE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; };
1155-
E97684DCE824DEDA6683C6CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; };
1152+
EA2FC92CECD1EDA1F07DC59C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h"; sourceTree = "SOURCE_ROOT"; };
1153+
EA354D7D8E48D461415D52D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
11561154
EA73332E3D5AEC04ADDFBB2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDataConverters.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"; sourceTree = "SOURCE_ROOT"; };
11571155
EA9518CDEA7049C21D5CE2D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; };
11581156
EAB2319C7AA57E06A2247CDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BorderSize.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1164,6 +1162,8 @@
11641162
EB5F9A50EB53A57D6AE303C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_QuickTimeMovieComponent.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm"; sourceTree = "SOURCE_ROOT"; };
11651163
EBD8622EAEF10558809888B7 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; };
11661164
EC95A2CF4B33EA37DA5FC1AC = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; };
1165+
ECBEF88BBC974D96ED781C75 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; };
1166+
ECCE033FF2ACE42188FA4A7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; };
11671167
ECE3BE71EB6B9CF1CE869BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; };
11681168
ED86166920362E9D2BE2CB26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; };
11691169
ED887A521EEB8F3EBA7DDB31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1177,6 +1177,7 @@
11771177
EF059B26886B32000BCF8CFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; };
11781178
EF3F9AA8D70E1D4D55F13182 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; };
11791179
EF4A6E0E1232071252ACCD7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; };
1180+
EF610B2A17D9B1C0D24DCE67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; };
11801181
EF7B66764093D950724EFE70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; };
11811182
EFC21F3CD0EB87D67E044E06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; };
11821183
F06884C6399CB102B1E8A24E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000registers.cpp; path = "../../Source/Processors/DataThreads/RhythmNode/rhythm-api/rhd2000registers.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1326,6 +1327,7 @@
13261327
9AD7314174B2AB01FBF7E1E1,
13271328
E46FFF196BAA78472FF1C0B4, ); name = PlaceholderProcessor; sourceTree = "<group>"; };
13281329
F74BE11F6446ACF243895BFF = {isa = PBXGroup; children = (
1330+
148FE750B55B2F7EA3899408,
13291331
041038F6E67FE0409D8ECC74,
13301332
AAF5C27D2EEDD254A3652717,
13311333
CB5C14E82DE06F767EAD62F9,

Builds/VisualStudio2012/open-ephys.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,7 @@
14671467
<ClInclude Include="..\..\Source\Audio\AudioComponent.h"/>
14681468
<ClInclude Include="..\..\Source\Processors\PlaceholderProcessor\PlaceholderProcessorEditor.h"/>
14691469
<ClInclude Include="..\..\Source\Processors\PlaceholderProcessor\PlaceholderProcessor.h"/>
1470+
<ClInclude Include="..\..\Source\Processors\Dsp\LinearSmoothedValueAtomic.h"/>
14701471
<ClInclude Include="..\..\Source\Processors\Dsp\Bessel.h"/>
14711472
<ClInclude Include="..\..\Source\Processors\Dsp\Biquad.h"/>
14721473
<ClInclude Include="..\..\Source\Processors\Dsp\Butterworth.h"/>

Builds/VisualStudio2012/open-ephys.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,6 +1896,9 @@
18961896
<ClInclude Include="..\..\Source\Processors\PlaceholderProcessor\PlaceholderProcessor.h">
18971897
<Filter>open-ephys\Source\Processors\PlaceholderProcessor</Filter>
18981898
</ClInclude>
1899+
<ClInclude Include="..\..\Source\Processors\Dsp\LinearSmoothedValueAtomic.h">
1900+
<Filter>open-ephys\Source\Processors\Dsp</Filter>
1901+
</ClInclude>
18991902
<ClInclude Include="..\..\Source\Processors\Dsp\Bessel.h">
19001903
<Filter>open-ephys\Source\Processors\Dsp</Filter>
19011904
</ClInclude>

Builds/VisualStudio2013/open-ephys.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,6 +1471,7 @@
14711471
<ClInclude Include="..\..\Source\Audio\AudioComponent.h"/>
14721472
<ClInclude Include="..\..\Source\Processors\PlaceholderProcessor\PlaceholderProcessorEditor.h"/>
14731473
<ClInclude Include="..\..\Source\Processors\PlaceholderProcessor\PlaceholderProcessor.h"/>
1474+
<ClInclude Include="..\..\Source\Processors\Dsp\LinearSmoothedValueAtomic.h"/>
14741475
<ClInclude Include="..\..\Source\Processors\Dsp\Bessel.h"/>
14751476
<ClInclude Include="..\..\Source\Processors\Dsp\Biquad.h"/>
14761477
<ClInclude Include="..\..\Source\Processors\Dsp\Butterworth.h"/>

Builds/VisualStudio2013/open-ephys.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,6 +1896,9 @@
18961896
<ClInclude Include="..\..\Source\Processors\PlaceholderProcessor\PlaceholderProcessor.h">
18971897
<Filter>open-ephys\Source\Processors\PlaceholderProcessor</Filter>
18981898
</ClInclude>
1899+
<ClInclude Include="..\..\Source\Processors\Dsp\LinearSmoothedValueAtomic.h">
1900+
<Filter>open-ephys\Source\Processors\Dsp</Filter>
1901+
</ClInclude>
18991902
<ClInclude Include="..\..\Source\Processors\Dsp\Bessel.h">
19001903
<Filter>open-ephys\Source\Processors\Dsp</Filter>
19011904
</ClInclude>
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/*
2+
==============================================================================
3+
4+
This file is part of the JUCE library.
5+
Copyright (c) 2015 - ROLI Ltd.
6+
7+
Permission is granted to use this software under the terms of either:
8+
a) the GPL v2 (or any later version)
9+
b) the Affero GPL v3
10+
11+
Details of these licenses can be found at: www.gnu.org/licenses
12+
13+
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
14+
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15+
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16+
17+
------------------------------------------------------------------------------
18+
19+
To release a closed-source product which uses JUCE, commercial licenses are
20+
available: visit www.juce.com for more information.
21+
22+
==============================================================================
23+
*/
24+
25+
#ifndef JUCE_LINEARSMOOTHEDVALUE_H_INCLUDED
26+
#define JUCE_LINEARSMOOTHEDVALUE_H_INCLUDED
27+
28+
#include "../PluginManager/OpenEphysPlugin.h"
29+
#include <atomic>
30+
31+
//==============================================================================
32+
/**
33+
Utility class for linearly smoothed values like volume etc. that should
34+
not change abruptly but as a linear ramp, to avoid audio glitches.
35+
36+
This class was modified by Open Ephys and just an improvement of LinearSmoothedValue
37+
class from the JUCE 4.0 library, but with some features made that were suggested
38+
by Timur Doumler during his JUCE Summit 2015 talk, to make it lock-free and guarantee
39+
that no race conditions will ever occur using it.
40+
41+
Usage:
42+
- set value by calling setValue() method;
43+
44+
- get value by calling updateTarget() and then getNextValue() method.
45+
We need to call updateTarget() because we should suppose the value could be changed before
46+
so we need to update it smoothly and then use it.
47+
*/
48+
49+
//==============================================================================
50+
template<typename FloatType>
51+
class PLUGIN_API LinearSmoothedValueAtomic
52+
{
53+
public:
54+
/** Constructor. */
55+
LinearSmoothedValueAtomic() noexcept
56+
: currentValue (0)
57+
, target (0)
58+
, step (0)
59+
, countdown (0)
60+
, stepsToTarget (0)
61+
{
62+
}
63+
64+
/** Constructor. */
65+
LinearSmoothedValueAtomic (FloatType initialValue) noexcept
66+
: currentValue (initialValue)
67+
, target (initialValue)
68+
, step (0)
69+
, countdown (0)
70+
, stepsToTarget (0)
71+
{
72+
}
73+
74+
//==========================================================================
75+
/** Reset to a new sample rate and ramp length. */
76+
void reset (double sampleRate, double rampLengthInSeconds) noexcept
77+
{
78+
jassert (sampleRate > 0 && rampLengthInSeconds >= 0);
79+
stepsToTarget = (int) std::floor (rampLengthInSeconds * sampleRate);
80+
currentValue = target;
81+
countdown = 0;
82+
}
83+
84+
//==========================================================================
85+
/** Set a new target value. */
86+
void setValue (FloatType newValue) noexcept
87+
{
88+
target.store (newValue);
89+
}
90+
91+
//==========================================================================
92+
void updateTarget() noexcept
93+
{
94+
FloatType newTarget = target.load();
95+
if (newTarget != currentTarget)
96+
{
97+
currentTarget = newTarget;
98+
countdown = stepsToTarget;
99+
100+
if (countdown <= 0)
101+
currentValue = currentTarget;
102+
else
103+
step = (currentTarget - currentValue) / (FloatType) countdown;
104+
}
105+
}
106+
107+
//==========================================================================
108+
/** Compute the next value. */
109+
FloatType getNextValue() noexcept
110+
{
111+
if (countdown <= 0)
112+
return currentTarget;
113+
114+
--countdown;
115+
currentValue += step;
116+
return currentValue;
117+
}
118+
119+
120+
private:
121+
//==========================================================================
122+
std::atomic<FloatType> target;
123+
124+
FloatType currentValue;
125+
FloatType currentTarget;
126+
FloatType step;
127+
128+
int countdown;
129+
int stepsToTarget;
130+
};
131+
132+
133+
#endif // JUCE_LINEARSMOOTHEDVALUE_H_INCLUDED

Source/Processors/GenericProcessor/GenericProcessor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ enum ChannelType {HEADSTAGE_CHANNEL = 0, AUX_CHANNEL = 1, ADC_CHANNEL = 2, EVENT
3737
#include "../Channel/Channel.h"
3838
#include "../../CoreServices.h"
3939
#include "../PluginManager/PluginClass.h"
40+
#include "../../Processors/Dsp/LinearSmoothedValueAtomic.h"
4041

4142
#include <time.h>
4243
#include <stdio.h>

open-ephys.jucer

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,8 @@
292292
file="Source/Processors/PlaceholderProcessor/PlaceholderProcessor.h"/>
293293
</GROUP>
294294
<GROUP id="{9F37E2FD-6871-8370-4C11-5C97DF132390}" name="Dsp">
295+
<FILE id="mwFwwT" name="LinearSmoothedValueAtomic.h" compile="0" resource="0"
296+
file="Source/Processors/Dsp/LinearSmoothedValueAtomic.h"/>
295297
<FILE id="qWmKwI" name="Bessel.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Bessel.cpp"/>
296298
<FILE id="bRbpDP" name="Bessel.h" compile="0" resource="0" file="Source/Processors/Dsp/Bessel.h"/>
297299
<FILE id="olRf2q" name="Biquad.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Biquad.cpp"/>

0 commit comments

Comments
 (0)