diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index 2db986c5351a9a85601b27513d2968153817bd2b..62ff8476efe4ab5849a4891217b336837e5e9749 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -21,7 +21,7 @@ ifeq ($(CONFIG),Debug) CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O3 -export-dynamic -g -pg -std=c++0x CXXFLAGS += $(CFLAGS) - LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L/usr/local/include -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5 + LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L/usr/local/include -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5 -lhdf5_cpp LDDEPS := RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules TARGET := open-ephys @@ -42,7 +42,7 @@ ifeq ($(CONFIG),Release) CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -export-dynamic -g -pg -std=c++0x CXXFLAGS += $(CFLAGS) - LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5 + LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5 -lhdf5_cpp LDDEPS := RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules TARGET := open-ephys-release @@ -73,6 +73,10 @@ OBJECTS := \ $(OBJDIR)/AudioComponent_521bd9c9.o \ $(OBJDIR)/SpikeSortBoxes_e42a3d04.o \ $(OBJDIR)/SpikeSorter_b8ed216c.o \ + $(OBJDIR)/HDF5FileFormat_5dfd9ead.o \ + $(OBJDIR)/OriginalRecording_b4d9221b.o \ + $(OBJDIR)/RecordEngine_80ecff22.o \ + $(OBJDIR)/HDF5Recording_8016ea1.o \ $(OBJDIR)/SerialInput_855a46b1.o \ $(OBJDIR)/FileReader_18023b0e.o \ $(OBJDIR)/ChannelMappingNode_d9219b9c.o \ @@ -308,6 +312,26 @@ $(OBJDIR)/SpikeSorter_b8ed216c.o: ../../Source/Processors/SpikeSorter.cpp @echo "Compiling SpikeSorter.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/HDF5FileFormat_5dfd9ead.o: ../../Source/Processors/HDF5FileFormat.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling HDF5FileFormat.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/OriginalRecording_b4d9221b.o: ../../Source/Processors/OriginalRecording.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling OriginalRecording.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/RecordEngine_80ecff22.o: ../../Source/Processors/RecordEngine.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling RecordEngine.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/HDF5Recording_8016ea1.o: ../../Source/Processors/HDF5Recording.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling HDF5Recording.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/SerialInput_855a46b1.o: ../../Source/Processors/SerialInput.cpp -@mkdir -p $(OBJDIR) @echo "Compiling SerialInput.cpp" diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj index 53047b91eea1de9fbcac27d6176b81f53de1a5d2..1e1c0c5813c9a721665a2a84495a511a90d4f872 100644 --- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj @@ -43,6 +43,10 @@ 0AE243437B40602D35435C32 = {isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; }; A33C92B3D445EBC6C35E7ABA = {isa = PBXBuildFile; fileRef = 813CB9DFF788D612A0750FBF; }; 51CE31A091584E6CD064C72B = {isa = PBXBuildFile; fileRef = E08826E22402792833879355; }; + 5B382D77C53D97FE3E35DE40 = {isa = PBXBuildFile; fileRef = BD8DA51AC4A1B20D6366A217; }; + 000A90A8BEF748F5E9DA669A = {isa = PBXBuildFile; fileRef = A7EBB338AA821C4682173A92; }; + A1C35BD441B62D7A85B992DA = {isa = PBXBuildFile; fileRef = 736A9CDCA901E4DCBAB8FAF3; }; + 2AD581FF8BC72A69DB20E66F = {isa = PBXBuildFile; fileRef = 53F07F49B7B778C4000A8E1E; }; B89453078EB0A8107F39EDF3 = {isa = PBXBuildFile; fileRef = 86688D712937F3D08918C68B; }; F25EC78DCCC9CCEE805AE011 = {isa = PBXBuildFile; fileRef = 9215DC26F511C58DEE009209; }; EA6A1BDDF81818D516B93DD6 = {isa = PBXBuildFile; fileRef = 5654BDD4FBFF01AC3F17FA0D; }; @@ -522,6 +526,7 @@ 5343D594AA7D444A7C6AD924 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; }; 5379FC603780F30A2F05FE78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; }; 53C8A2696FE4389E4AB4441C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Slider.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp"; sourceTree = "SOURCE_ROOT"; }; + 53F07F49B7B778C4000A8E1E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HDF5Recording.cpp; path = ../../Source/Processors/HDF5Recording.cpp; sourceTree = "SOURCE_ROOT"; }; 54339ADDCB6F8E9E7721A986 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; 5522973FA48A13C6BED293FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGenerator.cpp; path = ../../Source/Processors/SignalGenerator.cpp; sourceTree = "SOURCE_ROOT"; }; 555D34D0CD8776EE5996CC3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessorGraph.cpp; path = ../../Source/Processors/ProcessorGraph.cpp; sourceTree = "SOURCE_ROOT"; }; @@ -666,6 +671,7 @@ 72C33BA70B9EE82E39F1EC6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MP3AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; 72FCE41894123FC5DB01566B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_win32.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h"; sourceTree = "SOURCE_ROOT"; }; 7346D1276C3289FD68C8592B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 736A9CDCA901E4DCBAB8FAF3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordEngine.cpp; path = ../../Source/Processors/RecordEngine.cpp; sourceTree = "SOURCE_ROOT"; }; 7387114E34496F4606550863 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; 73ACB7A051EDE5F676E35FFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PerformanceCounter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp"; sourceTree = "SOURCE_ROOT"; }; 73C69D948D33899821536025 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; }; @@ -845,6 +851,7 @@ 9731D54410B06C1000370316 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; }; 97431963DB8D535DEDA9AD47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; 97C4F046D88561EEE245BE99 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-05.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-05.png"; sourceTree = "SOURCE_ROOT"; }; + 981137AA9BBA8C88F12309E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HDF5FileFormat.h; path = ../../Source/Processors/HDF5FileFormat.h; sourceTree = "SOURCE_ROOT"; }; 982E1A954C316920557F029C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; 9845DA251B15F22B355FC618 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; }; 984BC60C0AFF3EDED692FA01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericEditor.h; path = ../../Source/Processors/Editors/GenericEditor.h; sourceTree = "SOURCE_ROOT"; }; @@ -917,6 +924,7 @@ A769611E9CBFC127AF5AFB0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; }; A7875D5F8D2A632C99791002 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; }; A7D4C9E3ED3763847C087F46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/SpikeDisplayCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; + A7EBB338AA821C4682173A92 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OriginalRecording.cpp; path = ../../Source/Processors/OriginalRecording.cpp; sourceTree = "SOURCE_ROOT"; }; A7FE538FF09AC8A58DE8F1BD = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-02.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-02.png"; sourceTree = "SOURCE_ROOT"; }; A8B4D80D55E48F50809DC5E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; A8FCE8FB1D47A14A8C65C35E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPosition.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h"; sourceTree = "SOURCE_ROOT"; }; @@ -934,6 +942,7 @@ ABA3FCD5D762336535D56D94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; }; AC116E6590D49AB2EF19CB9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLImage.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp"; sourceTree = "SOURCE_ROOT"; }; AC2CFF4DA5CE431FCC628BA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChebyshevI.cpp; path = ../../Source/Dsp/ChebyshevI.cpp; sourceTree = "SOURCE_ROOT"; }; + AC54477CA9DA5FE827F3CB02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HDF5Recording.h; path = ../../Source/Processors/HDF5Recording.h; sourceTree = "SOURCE_ROOT"; }; ACA28D2B1FECD2C57F0250A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; }; ACAE4A2D65AAC6A36DA9DBCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; ACCACAE59079FDECF799BE8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConnectedChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1035,6 +1044,7 @@ BCBBF8764A2101CD0E91DB5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; }; BD1D02C70CCE095217581A5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; BD59A961F87AB628777894DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + BD8DA51AC4A1B20D6366A217 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HDF5FileFormat.cpp; path = ../../Source/Processors/HDF5FileFormat.cpp; sourceTree = "SOURCE_ROOT"; }; BDFF189EC742274DD2629196 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectangleList.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp"; sourceTree = "SOURCE_ROOT"; }; BE506F381B90833512348968 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; }; BEC4B69320BE492526794DFB = {isa = PBXFileReference; lastKnownFileType = image.png; name = wifi.png; path = ../../Resources/Images/Icons/wifi.png; sourceTree = "SOURCE_ROOT"; }; @@ -1176,6 +1186,7 @@ DBCA7E2FFCFD1354DD19DDD6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; }; DBED17FBB262C4DACEEDA9B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardState.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp"; sourceTree = "SOURCE_ROOT"; }; DBF1FD9272546EE4C7DD517A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC142E23FA36B913A8560841 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OriginalRecording.h; path = ../../Source/Processors/OriginalRecording.h; sourceTree = "SOURCE_ROOT"; }; DC200873B263C55E82B5384D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; DCA17BBB4FC31AAE9DC34DE9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; DCF6696CA1463CD8557E1FFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V1.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1231,7 +1242,7 @@ E817F0471AF514FD075B5DB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SerialInput.h; path = ../../Source/Processors/SerialInput.h; sourceTree = "SOURCE_ROOT"; }; E835BEB3C42E4B241804BE13 = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-light-serialized"; path = "../../Resources/Fonts/cpmono-light-serialized"; sourceTree = "SOURCE_ROOT"; }; E8480C4ED7F9579F6172F7B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Common.h; path = ../../Source/Dsp/Common.h; sourceTree = "SOURCE_ROOT"; }; - 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"; }; + E8FC70A6B665B9C1C7477680 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordEngine.h; path = ../../Source/Processors/RecordEngine.h; sourceTree = "SOURCE_ROOT"; }; E90FCB43DA2FF766597DA75E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Documentation.cpp; path = ../../Source/Dsp/Documentation.cpp; sourceTree = "SOURCE_ROOT"; }; E91923510CB2280C3A3B9E9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; }; E91A272EF06892937CB4B9CE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1248,45 +1259,46 @@ EAB6A66678B122C578B16445 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; }; EAC262A83CD2BEA14542AE89 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; }; EAC7A64301F0BF2C5E33A1F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; - EAEA49B9394D802B79CA8164 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; }; - 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"; }; EC780F52ABBD7317A5CE2F33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevI.h; path = ../../Source/Dsp/ChebyshevI.h; sourceTree = "SOURCE_ROOT"; }; ECA6FDB1366BE7EC30F1539B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceNode.cpp; path = ../../Source/Processors/SourceNode.cpp; sourceTree = "SOURCE_ROOT"; }; + F5A00ACFA3D76168F22F1205 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 99E1BC08B886CFDD2CCFD462 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; }; + 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"; }; + EAEA49B9394D802B79CA8164 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; }; + 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"; }; + EBD8622EAEF10558809888B7 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; }; + EC95A2CF4B33EA37DA5FC1AC = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; }; + ECB5A75A81B90327F58CBD9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000datablock.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"; sourceTree = "SOURCE_ROOT"; }; 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"; }; ECCE033FF2ACE42188FA4A7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; }; ECE3BE71EB6B9CF1CE869BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; ED86166920362E9D2BE2CB26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 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"; }; EDA209B0E7D124EA581023AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; EDAC82BD742A54182E8DF2FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; EE0336B43A39FD585DF638EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; EE2C669B127D00C86B1B8CA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; }; EE4DD055D31F7D9DC718DBD8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; }; EEA51B7EF1CF19028C6672E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + EEFC66D2DF5FD66B4D83B22F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; EF059B26886B32000BCF8CFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; EF3F9AA8D70E1D4D55F13182 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; }; EF4A6E0E1232071252ACCD7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; 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"; }; EF7B66764093D950724EFE70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; }; - F09FD6D9CA4997216ADBF54F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = "SOURCE_ROOT"; }; - F0F3834D46EA8FC8ADB206DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; - F17DF27524262A21A3EC932D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; - F1A3975235880CAC1D5757F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; - F230A4C0186379F9EB0B0F74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = "SOURCE_ROOT"; }; - F28414731D9EE1F75D7B7043 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; - F5A00ACFA3D76168F22F1205 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 99E1BC08B886CFDD2CCFD462 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; }; - EBD8622EAEF10558809888B7 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; }; - EC95A2CF4B33EA37DA5FC1AC = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; }; - ECB5A75A81B90327F58CBD9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000datablock.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"; sourceTree = "SOURCE_ROOT"; }; - 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"; }; - EEFC66D2DF5FD66B4D83B22F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; EF8488936B3D3E9178C9099C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PulsePalOutput.h; path = ../../Source/Processors/PulsePalOutput.h; sourceTree = "SOURCE_ROOT"; }; EFC21F3CD0EB87D67E044E06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F09FD6D9CA4997216ADBF54F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = "SOURCE_ROOT"; }; F0CA3600E09054D7DB3B0067 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SmoothedFilter.h; path = ../../Source/Dsp/SmoothedFilter.h; sourceTree = "SOURCE_ROOT"; }; F0D9A28C206D7A8BA7089D29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F0F3834D46EA8FC8ADB206DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; F1099BFF0BC1656A23D62E84 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; }; F10FB240E10A5742CE366A91 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; }; + F17DF27524262A21A3EC932D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F1A3975235880CAC1D5757F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; F1DBAE92084D9D90234AC436 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + F230A4C0186379F9EB0B0F74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = "SOURCE_ROOT"; }; + F28414731D9EE1F75D7B7043 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; F2A500BA3500C4A9D5792A54 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; }; F2EDB88302B8A9356F43B834 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; }; F2F11D7C596DAE5579610CCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1573,6 +1585,14 @@ 77D3770CCBB3EED01A854329, E08826E22402792833879355, 63F87A626F56E94A02542174, + BD8DA51AC4A1B20D6366A217, + 981137AA9BBA8C88F12309E3, + A7EBB338AA821C4682173A92, + DC142E23FA36B913A8560841, + 736A9CDCA901E4DCBAB8FAF3, + E8FC70A6B665B9C1C7477680, + 53F07F49B7B778C4000A8E1E, + AC54477CA9DA5FE827F3CB02, 86688D712937F3D08918C68B, E817F0471AF514FD075B5DB7, 9215DC26F511C58DEE009209, @@ -2785,6 +2805,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; + OTHER_LDFLAGS = "-lhdf5"; SDKROOT_ppc = macosx10.5; }; name = Debug; }; 7A6F9B742B69F66DC3E29FA8 = {isa = XCBuildConfiguration; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -2806,6 +2827,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; + OTHER_LDFLAGS = "-lhdf5"; SDKROOT_ppc = macosx10.5; }; name = Release; }; C8018C9A4DA633CA60663294 = {isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -2870,6 +2892,10 @@ 0AE243437B40602D35435C32, A33C92B3D445EBC6C35E7ABA, 51CE31A091584E6CD064C72B, + 5B382D77C53D97FE3E35DE40, + 000A90A8BEF748F5E9DA669A, + A1C35BD441B62D7A85B992DA, + 2AD581FF8BC72A69DB20E66F, B89453078EB0A8107F39EDF3, F25EC78DCCC9CCEE805AE011, EA6A1BDDF81818D516B93DD6, diff --git a/Builds/VisualStudio2012/copydlls.cmd b/Builds/VisualStudio2012/copydlls.cmd new file mode 100644 index 0000000000000000000000000000000000000000..384df0803ba9a0476bffa5b9fedbe96d5f61e88e --- /dev/null +++ b/Builds/VisualStudio2012/copydlls.cmd @@ -0,0 +1,10 @@ +@echo off +copy %2\okFrontPanel.dll %3 +copy %1\hdf5.dll %3 +copy %1\hdf5_cpp.dll %3 +copy %1\szip.dll %3 +copy %1\zlib.dll %3 + + + +copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Debug64\bin \ No newline at end of file diff --git a/Builds/VisualStudio2012/open-ephys.sln b/Builds/VisualStudio2012/open-ephys.sln index 470d172ea1d241cd434561b98343dda06702cf04..61074c0e04aebb4f1d48dd95b47ccd0a86ed9f09 100644 --- a/Builds/VisualStudio2012/open-ephys.sln +++ b/Builds/VisualStudio2012/open-ephys.sln @@ -1,31 +1,21 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30723.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "open-ephys", "open-ephys.vcxproj", "{9C924D66-7DEC-1AEF-B375-DB8666BFB909}" +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2012 +Project("{5A05F353-1D63-394C-DFB0-981BB2309002}") = "open-ephys", "open-ephys.vcxproj", "{9C924D66-7DEC-1AEF-B375-DB8666BFB909}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Debug64|Win32 = Debug64|Win32 - Debug64|x64 = Debug64|x64 Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - Release64|Win32 = Release64|Win32 + Debug64|x64 = Debug64|x64 Release64|x64 = Release64|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|Win32.ActiveCfg = Debug|Win32 {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|Win32.Build.0 = Debug|Win32 - {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|x64.ActiveCfg = Debug|Win32 - {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|Win32.ActiveCfg = Debug64|x64 - {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.ActiveCfg = Debug64|x64 - {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.Build.0 = Debug64|x64 {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.ActiveCfg = Release|Win32 {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.Build.0 = Release|Win32 - {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|x64.ActiveCfg = Release|Win32 - {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|Win32.ActiveCfg = Release64|x64 + {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.ActiveCfg = Debug64|x64 + {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.Build.0 = Debug64|x64 {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|x64.ActiveCfg = Release64|x64 {9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|x64.Build.0 = Release64|x64 EndGlobalSection diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj index 916ed2f2d4dc85713c1adfe83e0e4d8397af2c98..14ed7842273bd6474165b7952f7e1e28b2ef49a5 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj +++ b/Builds/VisualStudio2012/open-ephys.vcxproj @@ -1,5 +1,6 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +<?xml version="1.0" encoding="utf-8"?> + +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> <Configuration>Debug</Configuration> @@ -22,7 +23,7 @@ <ProjectGuid>{9C924D66-7DEC-1AEF-B375-DB8666BFB909}</ProjectGuid> <PlatformToolset>v110</PlatformToolset> </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> <UseOfMfc>false</UseOfMfc> @@ -47,10 +48,11 @@ <PlatformToolset>v110</PlatformToolset> <PlatformToolset>v110</PlatformToolset> </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings" /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/> + <ImportGroup Label="ExtensionSettings"/> <ImportGroup Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" + Label="LocalAppDataPlatform"/> </ImportGroup> <PropertyGroup Label="UserMacros"> <PlatformToolset>v110</PlatformToolset> @@ -60,20 +62,20 @@ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\bin\</OutDir> <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">open-ephys</TargetName> <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</GenerateManifest> - <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath);../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug</LibraryPath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath);../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib</LibraryPath> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\bin\</OutDir> <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">open-ephys</TargetName> <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest> - <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath);../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release</LibraryPath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath);$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release</LibraryPath> <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">.\Debug64\bin\</OutDir> <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">open-ephys</TargetName> <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">true</GenerateManifest> - <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">$(LibraryPath);../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug</LibraryPath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">$(LibraryPath);$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug</LibraryPath> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">.\Release64\bin\</OutDir> <TargetName Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">open-ephys</TargetName> <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">true</GenerateManifest> - <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">$(LibraryPath);../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release</LibraryPath> - <PlatformToolset>v120</PlatformToolset> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">$(LibraryPath);$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release</LibraryPath> + <PlatformToolset>v110</PlatformToolset> </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <Midl> @@ -81,16 +83,16 @@ <MkTypLibCompatible>true</MkTypLibCompatible> <SuppressStartupBanner>true</SuppressStartupBanner> <TargetEnvironment>Win32</TargetEnvironment> - <HeaderFileName /> + <HeaderFileName/> </Midl> <ClCompile> <Optimization>Disabled</Optimization> <DebugInformationFormat>EditAndContinue</DebugInformationFormat> - <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeTypeInfo>true</RuntimeTypeInfo> - <PrecompiledHeader /> + <PrecompiledHeader/> <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation> <ObjectFileName>$(IntDir)\</ObjectFileName> <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName> @@ -110,16 +112,16 @@ <SubSystem>Windows</SubSystem> <TargetMachine>MachineX86</TargetMachine> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> - <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <LargeAddressAware>true</LargeAddressAware> - <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> <Bscmake> <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile> </Bscmake> <PostBuildEvent> - <Command>copy ..\..\Resources\DLLs\okFrontPanel.dll .\Debug\bin</Command> + <Command>call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -128,21 +130,21 @@ <MkTypLibCompatible>true</MkTypLibCompatible> <SuppressStartupBanner>true</SuppressStartupBanner> <TargetEnvironment>Win32</TargetEnvironment> - <HeaderFileName /> + <HeaderFileName/> </Midl> <ClCompile> <Optimization>Full</Optimization> - <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeTypeInfo>true</RuntimeTypeInfo> - <PrecompiledHeader /> + <PrecompiledHeader/> <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation> <ObjectFileName>$(IntDir)\</ObjectFileName> <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName> <WarningLevel>Level4</WarningLevel> <SuppressStartupBanner>true</SuppressStartupBanner> - <MultiProcessorCompilation>false</MultiProcessorCompilation> + <MultiProcessorCompilation>true</MultiProcessorCompilation> </ClCompile> <ResourceCompile> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> @@ -157,16 +159,16 @@ <TargetMachine>MachineX86</TargetMachine> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <LargeAddressAware>true</LargeAddressAware> - <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> <Bscmake> <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile> </Bscmake> <PostBuildEvent> - <Command>copy ..\..\Resources\DLLs\okFrontPanel.dll .\Release\bin</Command> + <Command>call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'"> @@ -175,16 +177,16 @@ <MkTypLibCompatible>true</MkTypLibCompatible> <SuppressStartupBanner>true</SuppressStartupBanner> <TargetEnvironment>Win32</TargetEnvironment> - <HeaderFileName /> + <HeaderFileName/> </Midl> <ClCompile> <Optimization>Disabled</Optimization> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeTypeInfo>true</RuntimeTypeInfo> - <PrecompiledHeader /> + <PrecompiledHeader/> <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation> <ObjectFileName>$(IntDir)\</ObjectFileName> <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName> @@ -202,16 +204,16 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>$(IntDir)\open-ephys.pdb</ProgramDatabaseFile> <SubSystem>Windows</SubSystem> - <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <LargeAddressAware>true</LargeAddressAware> - <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> <Bscmake> <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile> </Bscmake> <PostBuildEvent> - <Command>copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Debug64\bin</Command> + <Command>call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release64|x64'"> @@ -220,15 +222,15 @@ <MkTypLibCompatible>true</MkTypLibCompatible> <SuppressStartupBanner>true</SuppressStartupBanner> <TargetEnvironment>Win32</TargetEnvironment> - <HeaderFileName /> + <HeaderFileName/> </Midl> <ClCompile> <Optimization>Full</Optimization> - <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeTypeInfo>true</RuntimeTypeInfo> - <PrecompiledHeader /> + <PrecompiledHeader/> <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation> <ObjectFileName>$(IntDir)\</ObjectFileName> <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName> @@ -248,133 +250,137 @@ <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <LargeAddressAware>true</LargeAddressAware> - <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> <Bscmake> <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile> </Bscmake> <PostBuildEvent> - <Command>copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Release64\bin</Command> + <Command>call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemGroup> - <ClCompile Include="..\..\Source\AccessClass.cpp" /> - <ClCompile Include="..\..\Source\Network\PracticalSocket.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Bessel.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Biquad.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Butterworth.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Cascade.cpp" /> - <ClCompile Include="..\..\Source\Dsp\ChebyshevI.cpp" /> - <ClCompile Include="..\..\Source\Dsp\ChebyshevII.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Custom.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Design.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Documentation.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Elliptic.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Filter.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Legendre.cpp" /> - <ClCompile Include="..\..\Source\Dsp\Param.cpp" /> - <ClCompile Include="..\..\Source\Dsp\PoleFilter.cpp" /> - <ClCompile Include="..\..\Source\Dsp\RBJ.cpp" /> - <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp" /> - <ClCompile Include="..\..\Source\Dsp\State.cpp" /> - <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp" /> - <ClCompile Include="..\..\Source\Processors\SpikeSortBoxes.cpp" /> - <ClCompile Include="..\..\Source\Processors\SpikeSorter.cpp" /> - <ClCompile Include="..\..\Source\Processors\SerialInput.cpp" /> - <ClCompile Include="..\..\Source\Processors\FileReader.cpp" /> - <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp" /> - <ClCompile Include="..\..\Source\Processors\ReferenceNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\PhaseDetector.cpp" /> - <ClCompile Include="..\..\Source\Processors\AudioResamplingNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\Channel.cpp" /> - <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp" /> - <ClCompile Include="..\..\Source\Processors\Serial\ofArduino.cpp" /> - <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp" /> - <ClCompile Include="..\..\Source\Processors\EventDetector.cpp" /> - <ClCompile Include="..\..\Source\Processors\FPGAOutput.cpp" /> - <ClCompile Include="..\..\Source\Processors\ArduinoOutput.cpp" /> - <ClCompile Include="..\..\Source\Processors\Parameter.cpp" /> - <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\WiFiOutput.cpp" /> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp" /> - <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp" /> - <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp" /> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.cpp" /> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp" /> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp" /> - <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp" /> - <ClCompile Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.cpp" /> - <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp" /> - <ClCompile Include="..\..\Source\Processors\AudioNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\EventNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\EcubeEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SpikeSorterEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SerialInputEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ElectrodeButtons.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\FPGAOutputEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ChannelSelector.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ParameterEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\VisualizerEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\MergerEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\ImageIcon.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\WiFiOutputEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\EventNodeEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\LfpDisplayEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SourceNodeEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SplitterEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\AudioEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\FilterEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\Editors\GenericEditor.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Thread.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\FileReaderThread.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\FPGAThread.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\DataBuffer.cpp" /> - <ClCompile Include="..\..\Source\Processors\DataThreads\DataThread.cpp" /> - <ClCompile Include="..\..\Source\Processors\RecordNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\SignalGenerator.cpp" /> - <ClCompile Include="..\..\Source\Processors\ResamplingNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\FilterNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\SourceNode.cpp" /> - <ClCompile Include="..\..\Source\Processors\GenericProcessor.cpp" /> - <ClCompile Include="..\..\Source\Processors\ProcessorGraph.cpp" /> - <ClCompile Include="..\..\Source\UI\EcubeDialogComponent.cpp" /> - <ClCompile Include="..\..\Source\UI\CustomArrowButton.cpp" /> - <ClCompile Include="..\..\Source\UI\GraphViewer.cpp" /> - <ClCompile Include="..\..\Source\UI\EditorViewportButtons.cpp" /> - <ClCompile Include="..\..\Source\UI\SignalChainManager.cpp" /> - <ClCompile Include="..\..\Source\UI\EditorViewport.cpp" /> - <ClCompile Include="..\..\Source\UI\ProcessorList.cpp" /> - <ClCompile Include="..\..\Source\UI\CustomLookAndFeel.cpp" /> - <ClCompile Include="..\..\Source\UI\InfoLabel.cpp" /> - <ClCompile Include="..\..\Source\UI\DataViewport.cpp" /> - <ClCompile Include="..\..\Source\UI\MessageCenter.cpp" /> - <ClCompile Include="..\..\Source\UI\ControlPanel.cpp" /> - <ClCompile Include="..\..\Source\UI\UIComponent.cpp" /> - <ClCompile Include="..\..\Source\MainWindow.cpp" /> - <ClCompile Include="..\..\Source\Main.cpp" /> + <ClCompile Include="..\..\Source\AccessClass.cpp"/> + <ClCompile Include="..\..\Source\Network\PracticalSocket.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Bessel.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Biquad.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Butterworth.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Cascade.cpp"/> + <ClCompile Include="..\..\Source\Dsp\ChebyshevI.cpp"/> + <ClCompile Include="..\..\Source\Dsp\ChebyshevII.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Custom.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Design.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Documentation.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Elliptic.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Filter.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Legendre.cpp"/> + <ClCompile Include="..\..\Source\Dsp\Param.cpp"/> + <ClCompile Include="..\..\Source\Dsp\PoleFilter.cpp"/> + <ClCompile Include="..\..\Source\Dsp\RBJ.cpp"/> + <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp"/> + <ClCompile Include="..\..\Source\Dsp\State.cpp"/> + <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSortBoxes.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter.cpp"/> + <ClCompile Include="..\..\Source\Processors\HDF5FileFormat.cpp"/> + <ClCompile Include="..\..\Source\Processors\OriginalRecording.cpp"/> + <ClCompile Include="..\..\Source\Processors\RecordEngine.cpp"/> + <ClCompile Include="..\..\Source\Processors\HDF5Recording.cpp"/> + <ClCompile Include="..\..\Source\Processors\SerialInput.cpp"/> + <ClCompile Include="..\..\Source\Processors\FileReader.cpp"/> + <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp"/> + <ClCompile Include="..\..\Source\Processors\ReferenceNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\PhaseDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\AudioResamplingNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Channel.cpp"/> + <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp"/> + <ClCompile Include="..\..\Source\Processors\Serial\ofArduino.cpp"/> + <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp"/> + <ClCompile Include="..\..\Source\Processors\EventDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\FPGAOutput.cpp"/> + <ClCompile Include="..\..\Source\Processors\ArduinoOutput.cpp"/> + <ClCompile Include="..\..\Source\Processors\Parameter.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\WiFiOutput.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp"/> + <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp"/> + <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\EcubeEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SpikeSorterEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SerialInputEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ElectrodeButtons.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\FPGAOutputEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ChannelSelector.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ParameterEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\VisualizerEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\MergerEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\ImageIcon.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\WiFiOutputEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\EventNodeEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\LfpDisplayEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SourceNodeEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SplitterEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\AudioEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\FilterEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\GenericEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Thread.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\FileReaderThread.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\FPGAThread.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\DataBuffer.cpp"/> + <ClCompile Include="..\..\Source\Processors\DataThreads\DataThread.cpp"/> + <ClCompile Include="..\..\Source\Processors\RecordNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\SignalGenerator.cpp"/> + <ClCompile Include="..\..\Source\Processors\ResamplingNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\FilterNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\SourceNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\GenericProcessor.cpp"/> + <ClCompile Include="..\..\Source\Processors\ProcessorGraph.cpp"/> + <ClCompile Include="..\..\Source\UI\EcubeDialogComponent.cpp"/> + <ClCompile Include="..\..\Source\UI\CustomArrowButton.cpp"/> + <ClCompile Include="..\..\Source\UI\GraphViewer.cpp"/> + <ClCompile Include="..\..\Source\UI\EditorViewportButtons.cpp"/> + <ClCompile Include="..\..\Source\UI\SignalChainManager.cpp"/> + <ClCompile Include="..\..\Source\UI\EditorViewport.cpp"/> + <ClCompile Include="..\..\Source\UI\ProcessorList.cpp"/> + <ClCompile Include="..\..\Source\UI\CustomLookAndFeel.cpp"/> + <ClCompile Include="..\..\Source\UI\InfoLabel.cpp"/> + <ClCompile Include="..\..\Source\UI\DataViewport.cpp"/> + <ClCompile Include="..\..\Source\UI\MessageCenter.cpp"/> + <ClCompile Include="..\..\Source\UI\ControlPanel.cpp"/> + <ClCompile Include="..\..\Source\UI\UIComponent.cpp"/> + <ClCompile Include="..\..\Source\MainWindow.cpp"/> + <ClCompile Include="..\..\Source\Main.cpp"/> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp"> <ExcludedFromBuild>true</ExcludedFromBuild> </ClCompile> @@ -1482,677 +1488,681 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_win32_QuickTimeMovieComponent.cpp"> <ExcludedFromBuild>true</ExcludedFromBuild> </ClCompile> - <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.cpp" /> - <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.cpp" /> + <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.cpp"/> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.cpp"/> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\Source\AccessClass.h" /> - <ClInclude Include="..\..\Source\Network\PracticalSocket.h" /> - <ClInclude Include="..\..\Source\Dsp\Bessel.h" /> - <ClInclude Include="..\..\Source\Dsp\Biquad.h" /> - <ClInclude Include="..\..\Source\Dsp\Butterworth.h" /> - <ClInclude Include="..\..\Source\Dsp\Cascade.h" /> - <ClInclude Include="..\..\Source\Dsp\ChebyshevI.h" /> - <ClInclude Include="..\..\Source\Dsp\ChebyshevII.h" /> - <ClInclude Include="..\..\Source\Dsp\Common.h" /> - <ClInclude Include="..\..\Source\Dsp\Custom.h" /> - <ClInclude Include="..\..\Source\Dsp\Design.h" /> - <ClInclude Include="..\..\Source\Dsp\Dsp.h" /> - <ClInclude Include="..\..\Source\Dsp\Elliptic.h" /> - <ClInclude Include="..\..\Source\Dsp\Filter.h" /> - <ClInclude Include="..\..\Source\Dsp\Layout.h" /> - <ClInclude Include="..\..\Source\Dsp\Legendre.h" /> - <ClInclude Include="..\..\Source\Dsp\MathSupplement.h" /> - <ClInclude Include="..\..\Source\Dsp\Params.h" /> - <ClInclude Include="..\..\Source\Dsp\PoleFilter.h" /> - <ClInclude Include="..\..\Source\Dsp\RBJ.h" /> - <ClInclude Include="..\..\Source\Dsp\RootFinder.h" /> - <ClInclude Include="..\..\Source\Dsp\SmoothedFilter.h" /> - <ClInclude Include="..\..\Source\Dsp\State.h" /> - <ClInclude Include="..\..\Source\Dsp\Types.h" /> - <ClInclude Include="..\..\Source\Dsp\Utilities.h" /> - <ClInclude Include="..\..\Source\Audio\AudioComponent.h" /> - <ClInclude Include="..\..\Source\Processors\SpikeSortBoxes.h" /> - <ClInclude Include="..\..\Source\Processors\SpikeSorter.h" /> - <ClInclude Include="..\..\Source\Processors\SerialInput.h" /> - <ClInclude Include="..\..\Source\Processors\FileReader.h" /> - <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h" /> - <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h" /> - <ClInclude Include="..\..\Source\Processors\ReferenceNode.h" /> - <ClInclude Include="..\..\Source\Processors\PhaseDetector.h" /> - <ClInclude Include="..\..\Source\Processors\AudioResamplingNode.h" /> - <ClInclude Include="..\..\Source\Processors\Channel.h" /> - <ClInclude Include="..\..\Source\Processors\Serial\PulsePal.h" /> - <ClInclude Include="..\..\Source\Processors\Serial\ofArduino.h" /> - <ClInclude Include="..\..\Source\Processors\Serial\ofConstants.h" /> - <ClInclude Include="..\..\Source\Processors\Serial\ofSerial.h" /> - <ClInclude Include="..\..\Source\Processors\EventDetector.h" /> - <ClInclude Include="..\..\Source\Processors\FPGAOutput.h" /> - <ClInclude Include="..\..\Source\Processors\ArduinoOutput.h" /> - <ClInclude Include="..\..\Source\Processors\Parameter.h" /> - <ClInclude Include="..\..\Source\Processors\SpikeDisplayNode.h" /> - <ClInclude Include="..\..\Source\Processors\WiFiOutput.h" /> - <ClInclude Include="..\..\Source\Processors\LfpDisplayNode.h" /> - <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h" /> - <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h" /> - <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h" /> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.h" /> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h" /> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h" /> - <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h" /> - <ClInclude Include="..\..\Source\Processors\Visualization\DataWindow.h" /> - <ClInclude Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.h" /> - <ClInclude Include="..\..\Source\Processors\SpikeDetector.h" /> - <ClInclude Include="..\..\Source\Processors\AudioNode.h" /> - <ClInclude Include="..\..\Source\Processors\EventNode.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\EcubeEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SpikeSorterEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SerialInputEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ElectrodeButtons.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\FPGAOutputEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ChannelSelector.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ParameterEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\VisualizerEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\MergerEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\ImageIcon.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\WiFiOutputEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\EventNodeEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\LfpDisplayEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SourceNodeEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SplitterEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\AudioEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\FilterEditor.h" /> - <ClInclude Include="..\..\Source\Processors\Editors\GenericEditor.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\EcubeThread.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\RHD2000Thread.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\FileReaderThread.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\FPGAThread.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\DataBuffer.h" /> - <ClInclude Include="..\..\Source\Processors\DataThreads\DataThread.h" /> - <ClInclude Include="..\..\Source\Processors\RecordNode.h" /> - <ClInclude Include="..\..\Source\Processors\SignalGenerator.h" /> - <ClInclude Include="..\..\Source\Processors\ResamplingNode.h" /> - <ClInclude Include="..\..\Source\Processors\FilterNode.h" /> - <ClInclude Include="..\..\Source\Processors\SourceNode.h" /> - <ClInclude Include="..\..\Source\Processors\GenericProcessor.h" /> - <ClInclude Include="..\..\Source\Processors\ProcessorGraph.h" /> - <ClInclude Include="..\..\Source\UI\EcubeDialogComponent.h" /> - <ClInclude Include="..\..\Source\UI\CustomArrowButton.h" /> - <ClInclude Include="..\..\Source\UI\GraphViewer.h" /> - <ClInclude Include="..\..\Source\UI\EditorViewportButtons.h" /> - <ClInclude Include="..\..\Source\UI\SignalChainManager.h" /> - <ClInclude Include="..\..\Source\UI\EditorViewport.h" /> - <ClInclude Include="..\..\Source\UI\ProcessorList.h" /> - <ClInclude Include="..\..\Source\UI\CustomLookAndFeel.h" /> - <ClInclude Include="..\..\Source\UI\InfoLabel.h" /> - <ClInclude Include="..\..\Source\UI\DataViewport.h" /> - <ClInclude Include="..\..\Source\UI\MessageCenter.h" /> - <ClInclude Include="..\..\Source\UI\ControlPanel.h" /> - <ClInclude Include="..\..\Source\UI\UIComponent.h" /> - <ClInclude Include="..\..\Source\MainWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiBuffer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiFile.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiKeyboardState.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessage.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessageSequence.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Decibels.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_IIRFilter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_LagrangeInterpolator.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Reverb.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_AudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_BufferingAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ChannelRemappingAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_IIRFilterAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_MixerAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_PositionableAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ReverbAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioDeviceManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiInput.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiOutput.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioTransportSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDBurner.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDReader.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReader.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReaderSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatWriter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioSubsectionReader.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_BufferingAudioFormatReader.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_MemoryMappedAudioFormatReader.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_AiffAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_CoreAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_FlacAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_LAMEEncoderAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_MP3AudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_OggVorbisAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_QuickTimeAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WavAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WindowsMediaAudioFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\sampler\juce_Sampler.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPlayHead.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessor.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorEditor.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_PluginDescription.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Common.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Headers.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_KnownPluginList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginListComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioDeviceSelectorComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnail.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailBase.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharacterFunctions.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_ASCII.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF16.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF32.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF8.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_Identifier.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_LocalisedStrings.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_NewLine.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_String.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringArray.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPairArray.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPool.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringRef.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_TextDiff.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_BigInteger.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Expression.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Range.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Atomic.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ByteOrder.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ContainerDeletePolicy.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_HeapBlock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_LeakedObjectDetector.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Memory.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_MemoryBlock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_OptionalScopedPointer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ReferenceCountedObject.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ScopedPointer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_SharedResourcePointer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Singleton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_WeakReference.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_AbstractFifo.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Array.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ArrayAllocationBase.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_DynamicObject.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ElementComparator.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_HashMap.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_LinkedListPointer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_NamedValueSet.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_OwnedArray.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_PropertySet.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ReferenceCountedArray.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ScopedValueSetter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SortedSet.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SparseSet.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Variant.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ChildProcess.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_CriticalSection.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_DynamicLibrary.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_HighResolutionTimer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_InterProcessLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Process.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ReadWriteLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedReadLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedWriteLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_SpinLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Thread.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadLocalValue.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadPool.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_TimeSliceThread.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_WaitableEvent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_PerformanceCounter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_RelativeTime.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_Time.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_DirectoryIterator.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_File.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileFilter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileInputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileOutputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileSearchPath.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_MemoryMappedFile.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_TemporaryFile.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_WildcardFileFilter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_IPAddress.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_MACAddress.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_NamedPipe.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_Socket.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_URL.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_BufferedInputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_FileInputSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryInputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryOutputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_OutputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_SubregionStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_FileLogger.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_StandardHeader.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_SystemStats.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_TargetPlatform.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlDocument.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlElement.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_Javascript.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_JSON.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPCompressorOutputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPDecompressorInputStream.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_ZipFile.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\unit_tests\juce_UnitTest.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Result.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Uuid.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_WindowsRegistry.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_android_JNIHelpers.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_BasicNativeHeaders.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_osx_ObjCHelpers.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_posix_SharedCode.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_win32_ComSmartPtr.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_BlowFish.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_Primes.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_RSAKey.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_MD5.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_SHA256.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_Value.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_ValueTree.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoableAction.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_ApplicationProperties.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_PropertiesFile.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_ApplicationBase.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_CallbackMessage.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_DeletedAtShutdown.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Initialisation.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Message.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_MultiTimer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_Timer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionBroadcaster.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_AsyncUpdater.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeBroadcaster.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ListenerList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_ConnectedChildProcess.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnection.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_osx_MessageQueue.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_ScopedXLock.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_win32_HiddenMessageWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colour.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_ColourGradient.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colours.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_FillType.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_PixelFormats.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_GraphicsContext.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsContext.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsPostScriptRenderer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_Image.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageCache.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageConvolutionKernel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageFileFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_AffineTransform.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_BorderSize.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_EdgeTable.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Line.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Path.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathIterator.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathStrokeType.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Point.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Rectangle.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_RectangleList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_Justification.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_RectanglePlacement.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_AttributedString.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_CustomTypeface.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Font.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_GlyphArrangement.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_TextLayout.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Typeface.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_DropShadowEffect.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_GlowEffect.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_ImageEffectFilter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_RenderingHelpers.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_CachedComponentImage.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Component.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ComponentListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Desktop.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ModalComponentManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_ComponentDragger.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropTarget.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_FileDragAndDropTarget.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_LassoComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseCursor.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseEvent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInputSource.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TooltipClient.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_CaretComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyboardFocusTraverser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyPress.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_ModifierKeys.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_SystemClipboard.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextEditorKeyMapper.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextInputTarget.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ComboBox.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ImageComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Label.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ListBox.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ProgressBar.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Slider.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableHeaderComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableListBox.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TextEditor.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Toolbar.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemFactory.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemPalette.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TreeView.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_AlertWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_CallOutBox.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ComponentPeer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DialogWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DocumentWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_NativeMessageBox.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ResizableWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ThreadWithProgressWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TooltipWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TopLevelWindow.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarModel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_PopupMenu.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPosition.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPositionBehaviours.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentAnimator.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBoundsConstrainer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBuilder.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentMovementWatcher.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ConcertinaPanel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_GroupComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_MultiDocumentPanel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableBorderComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableCornerComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableEdgeComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ScrollBar.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutResizerBar.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableObjectResizer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedButtonBar.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_Viewport.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ArrowButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_Button.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_DrawableButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_HyperlinkButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ImageButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ShapeButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_TextButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToggleButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToolbarButton.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_MarkerList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinate.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinatePositioner.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeParallelogram.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePoint.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePointPath.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeRectangle.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_Drawable.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableComposite.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableImage.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawablePath.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableRectangle.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableShape.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableText.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_BooleanPropertyComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ButtonPropertyComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ChoicePropertyComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyPanel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_SliderPropertyComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_TextPropertyComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V1.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V2.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V3.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsDisplayComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserListener.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooserDialogBox.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileFilter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileListComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilenameComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilePreviewComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileSearchPathListComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileTreeComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_ImagePreviewComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_WildcardFileFilter.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandID.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandInfo.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandManager.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandTarget.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_KeyPressMappingSet.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_BubbleComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_DropShadower.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Application.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Initialisation.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_MultiTouchMapper.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeDocument.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeTokeniser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniserFunctions.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\documents\juce_FileBasedDocument.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_NSViewComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_UIViewComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\lookandfeel\juce_OldSchoolLookAndFeel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_AppleRemote.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_ColourSelector.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_LiveConstantEditor.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_PreferencesPanel.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SplashScreen.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Draggable3DOrientation.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Matrix3D.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLContext.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLGraphicsContext.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLHelpers.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLImage.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLPixelFormat.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLRenderer.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLShaderProgram.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLTexture.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Quaternion.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Vector3D.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_MissingGLDefinitions.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_android.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_ios.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_linux.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_osx.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_win32.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGLExtensions.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_DirectShowComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_QuickTimeMovieComponent.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\capture\juce_CameraDevice.h" /> - <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.h" /> - <ClInclude Include="..\..\JuceLibraryCode\AppConfig.h" /> - <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h" /> - <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h" /> + <ClInclude Include="..\..\Source\AccessClass.h"/> + <ClInclude Include="..\..\Source\Network\PracticalSocket.h"/> + <ClInclude Include="..\..\Source\Dsp\Bessel.h"/> + <ClInclude Include="..\..\Source\Dsp\Biquad.h"/> + <ClInclude Include="..\..\Source\Dsp\Butterworth.h"/> + <ClInclude Include="..\..\Source\Dsp\Cascade.h"/> + <ClInclude Include="..\..\Source\Dsp\ChebyshevI.h"/> + <ClInclude Include="..\..\Source\Dsp\ChebyshevII.h"/> + <ClInclude Include="..\..\Source\Dsp\Common.h"/> + <ClInclude Include="..\..\Source\Dsp\Custom.h"/> + <ClInclude Include="..\..\Source\Dsp\Design.h"/> + <ClInclude Include="..\..\Source\Dsp\Dsp.h"/> + <ClInclude Include="..\..\Source\Dsp\Elliptic.h"/> + <ClInclude Include="..\..\Source\Dsp\Filter.h"/> + <ClInclude Include="..\..\Source\Dsp\Layout.h"/> + <ClInclude Include="..\..\Source\Dsp\Legendre.h"/> + <ClInclude Include="..\..\Source\Dsp\MathSupplement.h"/> + <ClInclude Include="..\..\Source\Dsp\Params.h"/> + <ClInclude Include="..\..\Source\Dsp\PoleFilter.h"/> + <ClInclude Include="..\..\Source\Dsp\RBJ.h"/> + <ClInclude Include="..\..\Source\Dsp\RootFinder.h"/> + <ClInclude Include="..\..\Source\Dsp\SmoothedFilter.h"/> + <ClInclude Include="..\..\Source\Dsp\State.h"/> + <ClInclude Include="..\..\Source\Dsp\Types.h"/> + <ClInclude Include="..\..\Source\Dsp\Utilities.h"/> + <ClInclude Include="..\..\Source\Audio\AudioComponent.h"/> + <ClInclude Include="..\..\Source\Processors\SpikeSortBoxes.h"/> + <ClInclude Include="..\..\Source\Processors\SpikeSorter.h"/> + <ClInclude Include="..\..\Source\Processors\HDF5FileFormat.h"/> + <ClInclude Include="..\..\Source\Processors\OriginalRecording.h"/> + <ClInclude Include="..\..\Source\Processors\RecordEngine.h"/> + <ClInclude Include="..\..\Source\Processors\HDF5Recording.h"/> + <ClInclude Include="..\..\Source\Processors\SerialInput.h"/> + <ClInclude Include="..\..\Source\Processors\FileReader.h"/> + <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h"/> + <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h"/> + <ClInclude Include="..\..\Source\Processors\ReferenceNode.h"/> + <ClInclude Include="..\..\Source\Processors\PhaseDetector.h"/> + <ClInclude Include="..\..\Source\Processors\AudioResamplingNode.h"/> + <ClInclude Include="..\..\Source\Processors\Channel.h"/> + <ClInclude Include="..\..\Source\Processors\Serial\PulsePal.h"/> + <ClInclude Include="..\..\Source\Processors\Serial\ofArduino.h"/> + <ClInclude Include="..\..\Source\Processors\Serial\ofConstants.h"/> + <ClInclude Include="..\..\Source\Processors\Serial\ofSerial.h"/> + <ClInclude Include="..\..\Source\Processors\EventDetector.h"/> + <ClInclude Include="..\..\Source\Processors\FPGAOutput.h"/> + <ClInclude Include="..\..\Source\Processors\ArduinoOutput.h"/> + <ClInclude Include="..\..\Source\Processors\Parameter.h"/> + <ClInclude Include="..\..\Source\Processors\SpikeDisplayNode.h"/> + <ClInclude Include="..\..\Source\Processors\WiFiOutput.h"/> + <ClInclude Include="..\..\Source\Processors\LfpDisplayNode.h"/> + <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h"/> + <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h"/> + <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\DataWindow.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.h"/> + <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/> + <ClInclude Include="..\..\Source\Processors\AudioNode.h"/> + <ClInclude Include="..\..\Source\Processors\EventNode.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\EcubeEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SpikeSorterEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SerialInputEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ElectrodeButtons.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\FPGAOutputEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ChannelSelector.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ParameterEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\VisualizerEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\MergerEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\ImageIcon.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\WiFiOutputEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\EventNodeEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\LfpDisplayEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SourceNodeEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SplitterEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\AudioEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\FilterEditor.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\GenericEditor.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\EcubeThread.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\RHD2000Thread.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\FileReaderThread.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\FPGAThread.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\DataBuffer.h"/> + <ClInclude Include="..\..\Source\Processors\DataThreads\DataThread.h"/> + <ClInclude Include="..\..\Source\Processors\RecordNode.h"/> + <ClInclude Include="..\..\Source\Processors\SignalGenerator.h"/> + <ClInclude Include="..\..\Source\Processors\ResamplingNode.h"/> + <ClInclude Include="..\..\Source\Processors\FilterNode.h"/> + <ClInclude Include="..\..\Source\Processors\SourceNode.h"/> + <ClInclude Include="..\..\Source\Processors\GenericProcessor.h"/> + <ClInclude Include="..\..\Source\Processors\ProcessorGraph.h"/> + <ClInclude Include="..\..\Source\UI\EcubeDialogComponent.h"/> + <ClInclude Include="..\..\Source\UI\CustomArrowButton.h"/> + <ClInclude Include="..\..\Source\UI\GraphViewer.h"/> + <ClInclude Include="..\..\Source\UI\EditorViewportButtons.h"/> + <ClInclude Include="..\..\Source\UI\SignalChainManager.h"/> + <ClInclude Include="..\..\Source\UI\EditorViewport.h"/> + <ClInclude Include="..\..\Source\UI\ProcessorList.h"/> + <ClInclude Include="..\..\Source\UI\CustomLookAndFeel.h"/> + <ClInclude Include="..\..\Source\UI\InfoLabel.h"/> + <ClInclude Include="..\..\Source\UI\DataViewport.h"/> + <ClInclude Include="..\..\Source\UI\MessageCenter.h"/> + <ClInclude Include="..\..\Source\UI\ControlPanel.h"/> + <ClInclude Include="..\..\Source\UI\UIComponent.h"/> + <ClInclude Include="..\..\Source\MainWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiBuffer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiFile.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiKeyboardState.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessage.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessageSequence.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Decibels.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_IIRFilter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_LagrangeInterpolator.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Reverb.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_AudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_BufferingAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ChannelRemappingAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_IIRFilterAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_MixerAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_PositionableAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ReverbAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioDeviceManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioTransportSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDBurner.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDReader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReaderSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatWriter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioSubsectionReader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_BufferingAudioFormatReader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_MemoryMappedAudioFormatReader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_AiffAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_CoreAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_FlacAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_LAMEEncoderAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_MP3AudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_OggVorbisAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_QuickTimeAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WavAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WindowsMediaAudioFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\sampler\juce_Sampler.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPlayHead.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessor.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorEditor.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_PluginDescription.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Common.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioDeviceSelectorComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnail.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailBase.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharacterFunctions.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_ASCII.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF16.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF32.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF8.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_Identifier.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_LocalisedStrings.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_NewLine.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_String.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringArray.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPairArray.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPool.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringRef.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_TextDiff.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_BigInteger.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Expression.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Range.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Atomic.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ByteOrder.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_HeapBlock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_LeakedObjectDetector.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Memory.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_MemoryBlock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_OptionalScopedPointer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ReferenceCountedObject.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ScopedPointer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_SharedResourcePointer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Singleton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_WeakReference.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_AbstractFifo.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Array.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ArrayAllocationBase.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_DynamicObject.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ElementComparator.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_HashMap.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_LinkedListPointer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_NamedValueSet.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_OwnedArray.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_PropertySet.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ReferenceCountedArray.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ScopedValueSetter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SortedSet.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SparseSet.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Variant.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ChildProcess.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_CriticalSection.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_DynamicLibrary.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_HighResolutionTimer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_InterProcessLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Process.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ReadWriteLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedReadLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedWriteLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_SpinLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Thread.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadLocalValue.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadPool.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_TimeSliceThread.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_WaitableEvent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_PerformanceCounter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_RelativeTime.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_Time.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_DirectoryIterator.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_File.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileFilter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileInputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileOutputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileSearchPath.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_MemoryMappedFile.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_TemporaryFile.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_WildcardFileFilter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_IPAddress.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_MACAddress.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_NamedPipe.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_Socket.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_URL.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_BufferedInputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_FileInputSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryInputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryOutputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_OutputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_SubregionStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_FileLogger.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_StandardHeader.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_SystemStats.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_TargetPlatform.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlDocument.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlElement.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_Javascript.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_JSON.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPCompressorOutputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPDecompressorInputStream.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_ZipFile.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\unit_tests\juce_UnitTest.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Result.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Uuid.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_WindowsRegistry.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_android_JNIHelpers.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_BasicNativeHeaders.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_osx_ObjCHelpers.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_posix_SharedCode.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_win32_ComSmartPtr.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_BlowFish.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_Primes.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_RSAKey.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_MD5.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_SHA256.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_Value.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_ValueTree.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoableAction.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_ApplicationProperties.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_PropertiesFile.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_ApplicationBase.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_CallbackMessage.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_DeletedAtShutdown.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Initialisation.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Message.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_MultiTimer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_Timer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_AsyncUpdater.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeBroadcaster.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ListenerList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnection.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_osx_MessageQueue.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_ScopedXLock.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_win32_HiddenMessageWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colour.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_ColourGradient.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colours.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_FillType.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_PixelFormats.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_GraphicsContext.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsContext.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsPostScriptRenderer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_Image.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageCache.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageConvolutionKernel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageFileFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_AffineTransform.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_BorderSize.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_EdgeTable.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Line.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Path.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathIterator.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathStrokeType.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Point.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Rectangle.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_RectangleList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_Justification.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_RectanglePlacement.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_AttributedString.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_CustomTypeface.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Font.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_GlyphArrangement.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_TextLayout.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Typeface.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_DropShadowEffect.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_GlowEffect.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_ImageEffectFilter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_RenderingHelpers.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Component.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ComponentListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Desktop.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropTarget.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_FileDragAndDropTarget.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_LassoComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseCursor.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseEvent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_CaretComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyboardFocusTraverser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyPress.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_ModifierKeys.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_SystemClipboard.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextEditorKeyMapper.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextInputTarget.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ComboBox.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ImageComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Label.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ListBox.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ProgressBar.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Slider.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableHeaderComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableListBox.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TextEditor.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Toolbar.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemFactory.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemPalette.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TreeView.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_AlertWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_CallOutBox.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ComponentPeer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DialogWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DocumentWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_NativeMessageBox.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ResizableWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ThreadWithProgressWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TooltipWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TopLevelWindow.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarModel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_PopupMenu.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPosition.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPositionBehaviours.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentAnimator.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBoundsConstrainer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBuilder.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentMovementWatcher.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ConcertinaPanel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_GroupComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_MultiDocumentPanel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableBorderComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableCornerComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableEdgeComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ScrollBar.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutResizerBar.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableObjectResizer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedButtonBar.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_Viewport.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ArrowButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_Button.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_DrawableButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_HyperlinkButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ImageButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ShapeButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_TextButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToggleButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToolbarButton.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_MarkerList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinate.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinatePositioner.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeParallelogram.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePoint.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePointPath.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeRectangle.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_Drawable.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawablePath.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableRectangle.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableShape.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableText.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_BooleanPropertyComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ButtonPropertyComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ChoicePropertyComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyPanel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_SliderPropertyComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_TextPropertyComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V1.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V2.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V3.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsDisplayComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserListener.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooserDialogBox.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileFilter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileListComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilenameComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilePreviewComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileSearchPathListComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileTreeComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_ImagePreviewComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_WildcardFileFilter.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandID.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandInfo.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandManager.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandTarget.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_KeyPressMappingSet.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_DropShadower.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Application.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Initialisation.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_MultiTouchMapper.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeDocument.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeTokeniser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniserFunctions.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\documents\juce_FileBasedDocument.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\lookandfeel\juce_OldSchoolLookAndFeel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_AppleRemote.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_ColourSelector.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_LiveConstantEditor.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_PreferencesPanel.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Draggable3DOrientation.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Matrix3D.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLContext.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLGraphicsContext.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLHelpers.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLImage.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLPixelFormat.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLRenderer.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLShaderProgram.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLTexture.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Quaternion.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Vector3D.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_MissingGLDefinitions.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_android.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_ios.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_linux.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_osx.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_win32.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGLExtensions.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_DirectShowComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_QuickTimeMovieComponent.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\capture\juce_CameraDevice.h"/> + <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.h"/> + <ClInclude Include="..\..\JuceLibraryCode\AppConfig.h"/> + <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/> + <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> </ItemGroup> <ItemGroup> - <None Include="..\..\Resources\Fonts\cpmono-black-serialized" /> - <None Include="..\..\Resources\Fonts\cpmono-bold-serialized" /> - <None Include="..\..\Resources\Fonts\cpmono-extralight-serialized" /> - <None Include="..\..\Resources\Fonts\cpmono-light-serialized" /> - <None Include="..\..\Resources\Fonts\cpmono-plain-serialized" /> - <None Include="..\..\Resources\Fonts\BebasNeue.otf" /> - <None Include="..\..\Resources\Fonts\cpmono_bold.otf" /> - <None Include="..\..\Resources\Fonts\cpmono_extra_light.otf" /> - <None Include="..\..\Resources\Fonts\cpmono_light.otf" /> - <None Include="..\..\Resources\Fonts\cpmono_plain.otf" /> - <None Include="..\..\Resources\Fonts\miso-bold.ttf" /> - <None Include="..\..\Resources\Fonts\miso-light.ttf" /> - <None Include="..\..\Resources\Fonts\miso-regular.ttf" /> - <None Include="..\..\Resources\Fonts\miso-serialized" /> - <None Include="..\..\Resources\Fonts\nordic.ttf" /> - <None Include="..\..\Resources\Fonts\ostrich.ttf" /> - <None Include="..\..\Resources\Fonts\silkscreen-serialized" /> - <None Include="..\..\Resources\Fonts\silkscreen.ttf" /> - <None Include="..\..\Resources\Fonts\unibody-8.otf" /> - <None Include="..\..\Resources\Images\Icons\ArduinoIcon.png" /> - <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoBlack.png" /> - <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoGray.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons-01.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons-02.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons-03.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons-04.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons-05.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-01.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-02.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-03.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-04.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-05.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-01.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-02.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-03.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-04.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-05.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-01.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-02.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-03.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-04.png" /> - <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-05.png" /> - <None Include="..\..\Resources\Images\Icons\noise_wave.png" /> - <None Include="..\..\Resources\Images\Icons\saw_wave.png" /> - <None Include="..\..\Resources\Images\Icons\sine_wave.png" /> - <None Include="..\..\Resources\Images\Icons\square_wave.png" /> - <None Include="..\..\Resources\Images\Icons\triangle_wave.png" /> - <None Include="..\..\Resources\Images\Icons\wifi.png" /> - <None Include="..\..\Resources\Images\Icons\SourceDrop.png" /> - <None Include="..\..\Resources\Images\Icons\DefaultDataSource.png" /> - <None Include="..\..\Resources\Images\Icons\FileReaderIcon.png" /> - <None Include="..\..\Resources\Images\Icons\IntanIcon.png" /> - <None Include="..\..\Resources\Images\Buttons\muteoff.png" /> - <None Include="..\..\Resources\Images\Buttons\muteon.png" /> - <None Include="..\..\Resources\Images\Buttons\MergerA-01.png" /> - <None Include="..\..\Resources\Images\Buttons\MergerA-02.png" /> - <None Include="..\..\Resources\Images\Buttons\MergerB-01.png" /> - <None Include="..\..\Resources\Images\Buttons\MergerB-02.png" /> - <None Include="..\..\Resources\Images\Buttons\PipelineA-01.png" /> - <None Include="..\..\Resources\Images\Buttons\PipelineA-02.png" /> - <None Include="..\..\Resources\Images\Buttons\PipelineB-01.png" /> - <None Include="..\..\Resources\Images\Buttons\PipelineB-02.png" /> - <None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_core\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_events\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_module_info" /> - <None Include="..\..\JuceLibraryCode\modules\juce_video\juce_module_info" /> + <None Include="..\..\Resources\Fonts\cpmono-black-serialized"/> + <None Include="..\..\Resources\Fonts\cpmono-bold-serialized"/> + <None Include="..\..\Resources\Fonts\cpmono-extralight-serialized"/> + <None Include="..\..\Resources\Fonts\cpmono-light-serialized"/> + <None Include="..\..\Resources\Fonts\cpmono-plain-serialized"/> + <None Include="..\..\Resources\Fonts\BebasNeue.otf"/> + <None Include="..\..\Resources\Fonts\cpmono_bold.otf"/> + <None Include="..\..\Resources\Fonts\cpmono_extra_light.otf"/> + <None Include="..\..\Resources\Fonts\cpmono_light.otf"/> + <None Include="..\..\Resources\Fonts\cpmono_plain.otf"/> + <None Include="..\..\Resources\Fonts\miso-bold.ttf"/> + <None Include="..\..\Resources\Fonts\miso-light.ttf"/> + <None Include="..\..\Resources\Fonts\miso-regular.ttf"/> + <None Include="..\..\Resources\Fonts\miso-serialized"/> + <None Include="..\..\Resources\Fonts\nordic.ttf"/> + <None Include="..\..\Resources\Fonts\ostrich.ttf"/> + <None Include="..\..\Resources\Fonts\silkscreen-serialized"/> + <None Include="..\..\Resources\Fonts\silkscreen.ttf"/> + <None Include="..\..\Resources\Fonts\unibody-8.otf"/> + <None Include="..\..\Resources\Images\Icons\ArduinoIcon.png"/> + <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoBlack.png"/> + <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoGray.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons-01.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons-02.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons-03.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons-04.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons-05.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-01.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-02.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-03.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-04.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-05.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-01.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-02.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-03.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-04.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-05.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-01.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-02.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-03.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-04.png"/> + <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-05.png"/> + <None Include="..\..\Resources\Images\Icons\noise_wave.png"/> + <None Include="..\..\Resources\Images\Icons\saw_wave.png"/> + <None Include="..\..\Resources\Images\Icons\sine_wave.png"/> + <None Include="..\..\Resources\Images\Icons\square_wave.png"/> + <None Include="..\..\Resources\Images\Icons\triangle_wave.png"/> + <None Include="..\..\Resources\Images\Icons\wifi.png"/> + <None Include="..\..\Resources\Images\Icons\SourceDrop.png"/> + <None Include="..\..\Resources\Images\Icons\DefaultDataSource.png"/> + <None Include="..\..\Resources\Images\Icons\FileReaderIcon.png"/> + <None Include="..\..\Resources\Images\Icons\IntanIcon.png"/> + <None Include="..\..\Resources\Images\Buttons\muteoff.png"/> + <None Include="..\..\Resources\Images\Buttons\muteon.png"/> + <None Include="..\..\Resources\Images\Buttons\MergerA-01.png"/> + <None Include="..\..\Resources\Images\Buttons\MergerA-02.png"/> + <None Include="..\..\Resources\Images\Buttons\MergerB-01.png"/> + <None Include="..\..\Resources\Images\Buttons\MergerB-02.png"/> + <None Include="..\..\Resources\Images\Buttons\PipelineA-01.png"/> + <None Include="..\..\Resources\Images\Buttons\PipelineA-02.png"/> + <None Include="..\..\Resources\Images\Buttons\PipelineB-01.png"/> + <None Include="..\..\Resources\Images\Buttons\PipelineB-02.png"/> + <None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_core\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_events\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_module_info"/> + <None Include="..\..\JuceLibraryCode\modules\juce_video\juce_module_info"/> </ItemGroup> <ItemGroup> - <ResourceCompile Include=".\resources.rc" /> + <ResourceCompile Include=".\resources.rc"/> </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets" /> -</Project> \ No newline at end of file + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/> + <ImportGroup Label="ExtensionTargets"/> +</Project> diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj.filters b/Builds/VisualStudio2012/open-ephys.vcxproj.filters index 31ec610d5dd3a7cc44a8a614abed0c54002bd3e1..458bd3a84d405b4950e03de207744c45fbb89ab5 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj.filters +++ b/Builds/VisualStudio2012/open-ephys.vcxproj.filters @@ -1,4 +1,5 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> + <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Filter Include="open-ephys"> @@ -420,6 +421,18 @@ <ClCompile Include="..\..\Source\Processors\SpikeSorter.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\HDF5FileFormat.cpp"> + <Filter>open-ephys\Source\Processors</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Processors\OriginalRecording.cpp"> + <Filter>open-ephys\Source\Processors</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Processors\RecordEngine.cpp"> + <Filter>open-ephys\Source\Processors</Filter> + </ClCompile> + <ClCompile Include="..\..\Source\Processors\HDF5Recording.cpp"> + <Filter>open-ephys\Source\Processors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\SerialInput.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> @@ -798,6 +811,12 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_linux_Midi.cpp"> <Filter>Juce Modules\juce_audio_devices\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_mac_AudioCDBurner.mm"> + <Filter>Juce Modules\juce_audio_devices\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_mac_AudioCDReader.mm"> + <Filter>Juce Modules\juce_audio_devices\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp"> <Filter>Juce Modules\juce_audio_devices\native</Filter> </ClCompile> @@ -894,6 +913,9 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp"> <Filter>Juce Modules\juce_audio_processors\format</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm"> + <Filter>Juce Modules\juce_audio_processors\format_types</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp"> <Filter>Juce Modules\juce_audio_processors\format_types</Filter> </ClCompile> @@ -1134,6 +1156,21 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_linux_Threads.cpp"> <Filter>Juce Modules\juce_core\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Files.mm"> + <Filter>Juce Modules\juce_core\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Network.mm"> + <Filter>Juce Modules\juce_core\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Strings.mm"> + <Filter>Juce Modules\juce_core\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_SystemStats.mm"> + <Filter>Juce Modules\juce_core\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Threads.mm"> + <Filter>Juce Modules\juce_core\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_posix_NamedPipe.cpp"> <Filter>Juce Modules\juce_core\native</Filter> </ClCompile> @@ -1221,9 +1258,15 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_android_Messaging.cpp"> <Filter>Juce Modules\juce_events\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_ios_MessageManager.mm"> + <Filter>Juce Modules\juce_events\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_linux_Messaging.cpp"> <Filter>Juce Modules\juce_events\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_mac_MessageManager.mm"> + <Filter>Juce Modules\juce_events\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_win32_Messaging.cpp"> <Filter>Juce Modules\juce_events\native</Filter> </ClCompile> @@ -1329,6 +1372,12 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_linux_Fonts.cpp"> <Filter>Juce Modules\juce_graphics\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"> + <Filter>Juce Modules\juce_graphics\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_Fonts.mm"> + <Filter>Juce Modules\juce_graphics\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp"> <Filter>Juce Modules\juce_graphics\native</Filter> </ClCompile> @@ -1683,6 +1732,12 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_android_Windowing.cpp"> <Filter>Juce Modules\juce_gui_basics\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_ios_UIViewComponentPeer.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_ios_Windowing.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_linux_Clipboard.cpp"> <Filter>Juce Modules\juce_gui_basics\native</Filter> </ClCompile> @@ -1692,6 +1747,21 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_linux_Windowing.cpp"> <Filter>Juce Modules\juce_gui_basics\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_FileChooser.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_MainMenu.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_MouseCursor.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_NSViewComponentPeer.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_Windowing.mm"> + <Filter>Juce Modules\juce_gui_basics\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_win32_DragAndDrop.cpp"> <Filter>Juce Modules\juce_gui_basics\native</Filter> </ClCompile> @@ -1749,15 +1819,27 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_android_WebBrowserComponent.cpp"> <Filter>Juce Modules\juce_gui_extra\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_ios_UIViewComponent.mm"> + <Filter>Juce Modules\juce_gui_extra\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_linux_SystemTrayIcon.cpp"> <Filter>Juce Modules\juce_gui_extra\native</Filter> </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_linux_WebBrowserComponent.cpp"> <Filter>Juce Modules\juce_gui_extra\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_AppleRemote.mm"> + <Filter>Juce Modules\juce_gui_extra\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_NSViewComponent.mm"> + <Filter>Juce Modules\juce_gui_extra\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_SystemTrayIcon.cpp"> <Filter>Juce Modules\juce_gui_extra\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_WebBrowserComponent.mm"> + <Filter>Juce Modules\juce_gui_extra\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_win32_ActiveXComponent.cpp"> <Filter>Juce Modules\juce_gui_extra\native</Filter> </ClCompile> @@ -1794,6 +1876,12 @@ <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_android_CameraDevice.cpp"> <Filter>Juce Modules\juce_video\native</Filter> </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_mac_CameraDevice.mm"> + <Filter>Juce Modules\juce_video\native</Filter> + </ClCompile> + <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_mac_QuickTimeMovieComponent.mm"> + <Filter>Juce Modules\juce_video\native</Filter> + </ClCompile> <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_win32_CameraDevice.cpp"> <Filter>Juce Modules\juce_video\native</Filter> </ClCompile> @@ -1934,6 +2022,18 @@ <ClInclude Include="..\..\Source\Processors\SpikeSorter.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\HDF5FileFormat.h"> + <Filter>open-ephys\Source\Processors</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Processors\OriginalRecording.h"> + <Filter>open-ephys\Source\Processors</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Processors\RecordEngine.h"> + <Filter>open-ephys\Source\Processors</Filter> + </ClInclude> + <ClInclude Include="..\..\Source\Processors\HDF5Recording.h"> + <Filter>open-ephys\Source\Processors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\SerialInput.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> @@ -3802,4 +3902,4 @@ <Filter>Juce Library Code</Filter> </ResourceCompile> </ItemGroup> -</Project> \ No newline at end of file +</Project> diff --git a/Source/Main.cpp b/Source/Main.cpp index ba1eeb994441f9d076c5b2ea14ecde17d5f5921f..33278c084ef31a25f14c8e7089cdd92932f00f6c 100644 --- a/Source/Main.cpp +++ b/Source/Main.cpp @@ -75,6 +75,7 @@ public: std::cout.rdbuf(console_out.rdbuf()); std::cerr.rdbuf(console_out.rdbuf()); SetConsoleTitle("Debug Console"); + std::cout << "Debug console..." << std::endl; } } diff --git a/Source/MainWindow.cpp b/Source/MainWindow.cpp index ace0b88ec056a01657b93a652ea1096a4e5341d9..6ed5a7bd9e0503452326532b4284d3e5c5539dd4 100644 --- a/Source/MainWindow.cpp +++ b/Source/MainWindow.cpp @@ -23,7 +23,6 @@ #include "MainWindow.h" #include <stdio.h> - //----------------------------------------------------------------------- MainWindow::MainWindow() diff --git a/Source/Processors/Channel.cpp b/Source/Processors/Channel.cpp index 9288674db5b99166810138a5663a63631d0305a6..11de6fc646b91402210848a5ef2ac374faa5906b 100644 --- a/Source/Processors/Channel.cpp +++ b/Source/Processors/Channel.cpp @@ -24,8 +24,8 @@ #include "Channel.h" -Channel::Channel(GenericProcessor* p, int n) : num(n), eventType(0), processor(p), sampleRate(44100.0), bitVolts(1.0f),type(DATA_CHANNEL),isMonitored(false), isEnabled(true), isRecording(false) - +Channel::Channel(GenericProcessor* p, int n) : num(n), eventType(0), processor(p), sampleRate(44100.0), bitVolts(1.0f), + isADCchannel(false),isEventChannel(false), isMonitored(false), isEnabled(true), isRecording(false), recordIndex(-1) { nodeId = p->getNodeId(); diff --git a/Source/Processors/Channel.h b/Source/Processors/Channel.h index eeddd29f3d8116f13c4678c80481d37d6cbee216..c502fffba3327a9bedbd99d03d7f4e53e9d69897 100644 --- a/Source/Processors/Channel.h +++ b/Source/Processors/Channel.h @@ -114,11 +114,8 @@ public: bool isMonitored; bool isEnabled; - int originalStream; - int originalChannel; - // file info (for disk writing): - String filename; - FILE* file; + // file info (for disk writing). Meaning depends on RecordEngine + int recordIndex; String name; diff --git a/Source/Processors/DataThreads/FileReaderThread.cpp b/Source/Processors/DataThreads/FileReaderThread.cpp index 804b3f80ff9883e2169564dcfb0cd1b48ec1156c..55e8098e324216fd49783b0aba8f80d5691cbb6e 100755 --- a/Source/Processors/DataThreads/FileReaderThread.cpp +++ b/Source/Processors/DataThreads/FileReaderThread.cpp @@ -133,6 +133,11 @@ bool FileReaderThread::updateBuffer() size_t numRead = fread(readBuffer, 2, bufferSize, input); + if (numRead != bufferSize) + { + std::cout << "Fewer samples read than were requested." << std::endl; + } + int chan = 0; for (int n = 0; n < bufferSize; n++) diff --git a/Source/Processors/Editors/AudioEditor.cpp b/Source/Processors/Editors/AudioEditor.cpp index a3140e0334d9df3745be414c73d8f19fdbd8522d..184c870c92cce3d5818fe86212fa959f8b40e450 100755 --- a/Source/Processors/Editors/AudioEditor.cpp +++ b/Source/Processors/Editors/AudioEditor.cpp @@ -83,7 +83,7 @@ void AudioWindowButton::setText(String text) } AudioEditor::AudioEditor(AudioNode* owner) - : AudioProcessorEditor(owner), lastValue(1.0f), acw(0), isEnabled(true) + : AudioProcessorEditor(owner), lastValue(1.0f), isEnabled(true), acw(0) { diff --git a/Source/Processors/Editors/ChannelSelector.cpp b/Source/Processors/Editors/ChannelSelector.cpp index d860838c3bcf1a4b58af5af56328ce82abed327d..935e2450fda31ff87b81d8979fc3382ef422d2d2 100755 --- a/Source/Processors/Editors/ChannelSelector.cpp +++ b/Source/Processors/Editors/ChannelSelector.cpp @@ -33,7 +33,7 @@ ChannelSelector::ChannelSelector(bool createButtons, Font& titleFont_) : eventsOnly(false), paramsToggled(true), paramsActive(true), radioStatus(false), isNotSink(createButtons), moveRight(false), moveLeft(false), offsetLR(0), offsetUD(0), desiredOffset(0), - titleFont(titleFont_), acquisitionIsActive(false) + titleFont(titleFont_), acquisitionIsActive(false), recActive(true) { // initialize buttons @@ -341,6 +341,31 @@ void ChannelSelector::activateButtons() } +void ChannelSelector::inactivateRecButtons() +{ + + recActive = false; + + for (int i = 0; i < recordButtons.size(); i++) + { + recordButtons[i]->setActive(false); + recordButtons[i]->repaint(); + } +} + +void ChannelSelector::activateRecButtons() +{ + + recActive = true; + + for (int i = 0; i < recordButtons.size(); i++) + { + recordButtons[i]->setActive(true); + recordButtons[i]->repaint(); + } + +} + void ChannelSelector::startAcquisition() { acquisitionIsActive = true; diff --git a/Source/Processors/Editors/ChannelSelector.h b/Source/Processors/Editors/ChannelSelector.h index e71ee2983a0db992fa4c024906832cab79f614d9..1917c4e673a5908a49af0c4f77449f910d8997d5 100755 --- a/Source/Processors/Editors/ChannelSelector.h +++ b/Source/Processors/Editors/ChannelSelector.h @@ -115,6 +115,12 @@ public: /** Activates all the ChannelSelectorButtons under the "param" tab.*/ void activateButtons(); + /** Inactivates all the ChannelSelectorButtons under the "rec" tab.*/ + void inactivateRecButtons(); + + /** Activates all the ChannelSelectorButtons under the "rec" tab.*/ + void activateRecButtons(); + /** Refreshes Parameter Colors on change*/ void refreshParameterColors() { @@ -160,6 +166,7 @@ private: bool paramsToggled; bool paramsActive; + bool recActive; bool radioStatus; bool isNotSink; diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp index 58b8e9d3cedf030cf7378795b32621a42dc74f3c..01091cb34d1fd9d58298132291a563493206c0a2 100755 --- a/Source/Processors/Editors/GenericEditor.cpp +++ b/Source/Processors/Editors/GenericEditor.cpp @@ -280,6 +280,18 @@ void GenericEditor::setEnabledState(bool t) isEnabled = p->enabledState(); } +void GenericEditor::startRecording() +{ + if (channelSelector != 0) + channelSelector->inactivateRecButtons(); +} + +void GenericEditor::stopRecording() +{ + if (channelSelector != 0) + channelSelector->activateRecButtons(); +} + void GenericEditor::startAcquisition() { diff --git a/Source/Processors/Editors/GenericEditor.h b/Source/Processors/Editors/GenericEditor.h index 71fdef743c10b3ef0cc2e88e1eb6365334fc836f..ed1ce7e3745b064c84b6e01c5c026b5362f1a3b6 100755 --- a/Source/Processors/Editors/GenericEditor.h +++ b/Source/Processors/Editors/GenericEditor.h @@ -108,6 +108,12 @@ public: /** Used to enable or disable an editor's processor.*/ void setEnabledState(bool); + /** Called at the start of a recording **/ + void startRecording(); + + /** Called at the end of a recording **/ + void stopRecording(); + /** Called just prior to the start of acquisition, to allow the editor to prepare.*/ virtual void startAcquisition(); diff --git a/Source/Processors/Editors/RecordControlEditor.cpp b/Source/Processors/Editors/RecordControlEditor.cpp index e97638e92e7ef4e9c97f9d67a6d9c47c78b12584..6103c046acdf2e3de72b6a963603be52cc10d77e 100644 --- a/Source/Processors/Editors/RecordControlEditor.cpp +++ b/Source/Processors/Editors/RecordControlEditor.cpp @@ -58,14 +58,6 @@ RecordControlEditor::RecordControlEditor(GenericProcessor* parentNode, bool useD channelName += i + 1; availableChans->addItem(channelName,i+2); } - - newFileToggleButton = new UtilityButton("SPLIT FILES", Font("Small Text", 13, Font::plain)); - newFileToggleButton->setRadius(3.0f); - newFileToggleButton->setBounds(35, 95, 90, 18); - newFileToggleButton->addListener(this); - newFileToggleButton->setClickingTogglesState(true); - addAndMakeVisible(newFileToggleButton); - } RecordControlEditor::~RecordControlEditor() @@ -82,18 +74,6 @@ void RecordControlEditor::comboBoxChanged(ComboBox* comboBox) 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() { @@ -110,7 +90,6 @@ void RecordControlEditor::saveCustomParameters(XmlElement* xml) info->setAttribute("Type", "RecordControlEditor"); info->setAttribute("Channel",availableChans->getSelectedId()); - info->setAttribute("FileSaveOption",newFileToggleButton->getToggleState()); } @@ -122,7 +101,6 @@ void RecordControlEditor::loadCustomParameters(XmlElement* xml) if (xmlNode->hasTagName("PARAMETERS")) { - newFileToggleButton->setToggleState(xmlNode->getBoolAttribute("FileSaveOption"), sendNotification); availableChans->setSelectedId(xmlNode->getIntAttribute("Channel"), sendNotification); } diff --git a/Source/Processors/Editors/RecordControlEditor.h b/Source/Processors/Editors/RecordControlEditor.h index 0976ac133237f0e87964658d41e651269175f39c..4b7bda5128c52f5cb44ba20b1cf7bade34c3a69b 100644 --- a/Source/Processors/Editors/RecordControlEditor.h +++ b/Source/Processors/Editors/RecordControlEditor.h @@ -43,16 +43,14 @@ public: ~RecordControlEditor(); void comboBoxChanged(ComboBox* comboBox); void updateSettings(); - void buttonEvent(Button* button); void loadCustomParameters(XmlElement*); void saveCustomParameters(XmlElement*); private: ScopedPointer<ComboBox> availableChans; ScopedPointer<Label> chanSel; - ScopedPointer<UtilityButton> newFileToggleButton; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControlEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControlEditor); }; diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp index 9b7fc3b9cb71373650e69142ef33c1318ac74290..a5b0e32352d39372381340eec146bda2b1dacd1f 100755 --- a/Source/Processors/GenericProcessor.cpp +++ b/Source/Processors/GenericProcessor.cpp @@ -412,6 +412,23 @@ void GenericProcessor::setAllChannelsToRecord() } +void GenericProcessor::setRecording(bool state) +{ + GenericEditor* ed = getEditor(); + if (state) + { + if (ed != 0) + ed->startRecording(); + startRecording(); + } + else + { + if (ed != 0) + ed->stopRecording(); + stopRecording(); + } +} + void GenericProcessor::enableEditor() { diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h index 181a26ae848798f6edd8abced3da274b5b33d1a8..17878e5e2f73a1c6aa131559ca5060912df92a6f 100755 --- a/Source/Processors/GenericProcessor.h +++ b/Source/Processors/GenericProcessor.h @@ -420,11 +420,14 @@ public: { return true; } + + /** Called when recording starts/stops **/ + void setRecording(bool state); - /** Called whenever recording has started. */ + /** Called from setRecording whenever recording has started. */ virtual void startRecording() { } - - /** Called whenever recording has stopped. */ + + /** Called from setRecording whenever recording has stopped. */ virtual void stopRecording() { } /** Informs a processor's editor that data acquisition is about to begin. */ diff --git a/Source/Processors/HDF5FileFormat.cpp b/Source/Processors/HDF5FileFormat.cpp new file mode 100644 index 0000000000000000000000000000000000000000..003bc2874db5c8deae9705e4babaaa3d18247613 --- /dev/null +++ b/Source/Processors/HDF5FileFormat.cpp @@ -0,0 +1,892 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#include <H5Cpp.h> +#include "HDF5FileFormat.h" + +#ifndef CHUNK_XSIZE +#define CHUNK_XSIZE 256 +#endif + +#ifndef EVENT_CHUNK_SIZE +#define EVENT_CHUNK_SIZE 8 +#endif + +#ifndef SPIKE_CHUNK_XSIZE +#define SPIKE_CHUNK_XSIZE 8 +#endif + +#ifndef SPIKE_CHUNK_YSIZE +#define SPIKE_CHUNK_YSIZE 40 +#endif + +#define MAX_TRANSFORM_SIZE 512 + +#define PROCESS_ERROR std::cerr << error.getCDetailMsg() << std::endl; return -1 +#define CHECK_ERROR(x) if (x) std::cerr << "Error at HDFRecording " << __LINE__ << std::endl; + +using namespace H5; + +//HDF5FileBase + +HDF5FileBase::HDF5FileBase() : opened(false), readyToOpen(false) +{ + Exception::dontPrint(); +}; + +HDF5FileBase::~HDF5FileBase() +{ + close(); +} + +bool HDF5FileBase::isOpen() const +{ + return opened; +} + +int HDF5FileBase::open() +{ + if (!readyToOpen) return -1; + if (File(getFileName()).existsAsFile()) + return open(false); + else + return open(true); + +} + +int HDF5FileBase::open(bool newfile) +{ + int accFlags,ret=0; + + if (opened) return -1; + + try + { + + if (newfile) accFlags = H5F_ACC_TRUNC; + else accFlags = H5F_ACC_RDWR; + file = new H5File(getFileName().toUTF8(),accFlags); + opened = true; + if (newfile) + { + ret = createFileStructure(); + } + + if (ret) + { + file = nullptr; + opened = false; + std::cerr << "Error creating file structure" << std::endl; + } + + + return ret; + } + catch (FileIException error) + { + PROCESS_ERROR; + } +} + +void HDF5FileBase::close() +{ + file = nullptr; + opened = false; +} + +int HDF5FileBase::setAttribute(DataTypes type, void* data, String path, String name) +{ + Group loc; + Attribute attr; + DataType H5type; + DataType origType; + + if (!opened) return -1; + try + { + loc = file->openGroup(path.toUTF8()); + + H5type = getH5Type(type); + origType = getNativeType(type); + + if (loc.attrExists(name.toUTF8())) + { + attr = loc.openAttribute(name.toUTF8()); + } + else + { + DataSpace attr_dataspace(H5S_SCALAR); + attr = loc.createAttribute(name.toUTF8(),H5type,attr_dataspace); + } + + attr.write(origType,data); + + } + catch (GroupIException error) + { + PROCESS_ERROR; + } + catch (AttributeIException error) + { + PROCESS_ERROR; + } + + return 0; +} + +int HDF5FileBase::setAttributeStr(String value, String path, String name) +{ + Group loc; + Attribute attr; + + if (!opened) return -1; + + StrType type(PredType::C_S1, value.length()); + try + { + loc = file->openGroup(path.toUTF8()); + + if (loc.attrExists(name.toUTF8())) + { + //attr = loc.openAttribute(name.toUTF8()); + return -1; //string attributes cannot change size easily, better not allow overwritting. + } + else + { + DataSpace attr_dataspace(H5S_SCALAR); + attr = loc.createAttribute(name.toUTF8(), type, attr_dataspace); + } + attr.write(type,value.toUTF8()); + + } + catch (GroupIException error) + { + PROCESS_ERROR; + } + catch (AttributeIException error) + { + PROCESS_ERROR; + } + catch (FileIException error) + { + PROCESS_ERROR; + } + + return 0; +} + +int HDF5FileBase::createGroup(String path) +{ + if (!opened) return -1; + try + { + file->createGroup(path.toUTF8()); + } + catch (FileIException error) + { + PROCESS_ERROR; + } + catch (GroupIException error) + { + PROCESS_ERROR; + } + return 0; +} + +HDF5RecordingData* HDF5FileBase::getDataSet(String path) +{ + ScopedPointer<DataSet> data; + + if (!opened) return nullptr; + + try + { + data = new DataSet(file->openDataSet(path.toUTF8())); + return new HDF5RecordingData(data.release()); + } + catch (DataSetIException error) + { + error.printError(); + return nullptr; + } + catch (FileIException error) + { + error.printError(); + return nullptr; + } + catch (DataSpaceIException error) + { + error.printError(); + return nullptr; + } +} + +HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int chunkX, String path) +{ + int chunks[3] = {chunkX, 0, 0}; + return createDataSet(type,1,&sizeX,chunks,path); +} + +HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int chunkX, String path) +{ + int size[2]; + int chunks[3] = {chunkX, 0, 0}; + size[0] = sizeX; + size[1] = sizeY; + return createDataSet(type,2,size,chunks,path); +} + +HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, String path) +{ + int size[3]; + int chunks[3] = {chunkX, 0, 0}; + size[0] = sizeX; + size[1] = sizeY; + size[2] = sizeZ; + return createDataSet(type,2,size,chunks,path); +} + +HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path) +{ + int size[3]; + int chunks[3] = {chunkX, chunkY, 0}; + size[0] = sizeX; + size[1] = sizeY; + size[2] = sizeZ; + return createDataSet(type,3,size,chunks,path); +} + +HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int dimension, int* size, int* chunking, String path) +{ + ScopedPointer<DataSet> data; + DSetCreatPropList prop; + if (!opened) return nullptr; + + //Right now this classes don't support datasets with rank > 3. + //If it's needed in the future we can extend them to be of generic rank + if ((dimension > 3) || (dimension < 1)) return nullptr; + + DataType H5type = getH5Type(type); + + hsize_t dims[3], chunk_dims[3], max_dims[3]; + + for (int i=0; i < dimension; i++) + { + dims[i] = size[i]; + if (chunking[i] > 0) + { + chunk_dims[i] = chunking[i]; + max_dims[i] = H5S_UNLIMITED; + } + else + { + chunk_dims[i] = size[i]; + max_dims[i] = size[i]; + } + } + + try + { + DataSpace dSpace(dimension,dims,max_dims); + prop.setChunk(dimension,chunk_dims); + + data = new DataSet(file->createDataSet(path.toUTF8(),H5type,dSpace,prop)); + return new HDF5RecordingData(data.release()); + } + catch (DataSetIException error) + { + error.printError(); + return nullptr; + } + catch (FileIException error) + { + error.printError(); + return nullptr; + } + catch (DataSpaceIException error) + { + error.printError(); + return nullptr; + } + + +} + +H5::DataType HDF5FileBase::getNativeType(DataTypes type) +{ + switch (type) + { + case I8: + return PredType::NATIVE_INT8; + break; + case I16: + return PredType::NATIVE_INT16; + break; + case I32: + return PredType::NATIVE_INT32; + break; + case I64: + return PredType::NATIVE_INT64; + break; + case U8: + return PredType::NATIVE_UINT8; + break; + case U16: + return PredType::NATIVE_UINT16; + break; + case U32: + return PredType::NATIVE_UINT32; + break; + case U64: + return PredType::NATIVE_UINT64; + break; + case F32: + return PredType::NATIVE_FLOAT; + break; + } + return PredType::NATIVE_INT32; +} + +H5::DataType HDF5FileBase::getH5Type(DataTypes type) +{ + switch (type) + { + case I8: + return PredType::STD_I8LE; + break; + case I16: + return PredType::STD_I16LE; + break; + case I32: + return PredType::STD_I32LE; + break; + case I64: + return PredType::STD_I64LE; + break; + case U8: + return PredType::STD_U8LE; + break; + case U16: + return PredType::STD_U16LE; + break; + case U32: + return PredType::STD_U32LE; + break; + case U64: + return PredType::STD_U64LE; + break; + case F32: + return PredType::IEEE_F32LE; + break; + } + return PredType::STD_I32LE; +} + +HDF5RecordingData::HDF5RecordingData(DataSet* data) +{ + DataSpace dSpace; + DSetCreatPropList prop; + ScopedPointer<DataSet> dataSet = data; + hsize_t dims[3], chunk[3]; + + dSpace = dataSet->getSpace(); + prop = dataSet->getCreatePlist(); + + dimension = dSpace.getSimpleExtentDims(dims); + prop.getChunk(dimension,chunk); + + this->size[0] = dims[0]; + if (dimension > 1) + this->size[1] = dims[1]; + else + this->size[1] = 1; + if (dimension > 1) + this->size[2] = dims[2]; + else + this->size[2] = 1; + + this->xChunkSize = chunk[0]; + this->xPos = dims[0]; + this->dSet = dataSet; + this->rowXPos = 0; + this->rowDataSize = 0; +} + +HDF5RecordingData::~HDF5RecordingData() +{ +} +int HDF5RecordingData::writeDataBlock(int xDataSize, HDF5FileBase::DataTypes type, void* data) +{ + return writeDataBlock(xDataSize,size[1],type,data); +} + +int HDF5RecordingData::writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::DataTypes type, void* data) +{ + hsize_t dim[3],offset[3]; + DataSpace fSpace; + DataType nativeType; + + dim[2] = size[2]; + //only modify y size if new required size is larger than what we had. + if (yDataSize > size[1]) + dim[1] = yDataSize; + else + dim[1] = size[1]; + dim[0] = xPos + xDataSize; + try + { + //First be sure that we have enough space + dSet->extend(dim); + + fSpace = dSet->getSpace(); + fSpace.getSimpleExtentDims(dim); + size[0]=dim[0]; + if (dimension > 1) + size[1]=dim[1]; + + //Create memory space + dim[0]=xDataSize; + dim[1]=yDataSize; + dim[2] = size[2]; + + DataSpace mSpace(dimension,dim); + //select where to write + offset[0]=xPos; + offset[1]=0; + offset[2]=0; + fSpace.selectHyperslab(H5S_SELECT_SET, dim, offset); + + nativeType = HDF5FileBase::getNativeType(type); + + dSet->write(data,nativeType,mSpace,fSpace); + xPos += xDataSize; + } + catch (DataSetIException error) + { + PROCESS_ERROR; + } + catch (DataSpaceIException error) + { + PROCESS_ERROR; + } + return 0; +} + +int HDF5RecordingData::prepareDataBlock(int xDataSize) +{ + hsize_t dim[3]; + DataSpace fSpace; + if (dimension > 2) return -4; //We're not going to write rows in datasets bigger than 2d. + + dim[2] = size[2]; + dim[1] = size[1]; + dim[0] = xPos + xDataSize; + try + { + dSet->extend(dim); + + fSpace = dSet->getSpace(); + fSpace.getSimpleExtentDims(dim); + size[0]=dim[0]; + } + catch (DataSetIException error) + { + PROCESS_ERROR; + } + rowXPos = xPos; + rowDataSize = xDataSize; + xPos += xDataSize; + return 0; +} + +int HDF5RecordingData::writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataTypes type, void* data) +{ + hsize_t dim[2],offset[2]; + DataSpace fSpace; + DataType nativeType; + if (dimension > 2) return -4; //We're not going to write rows in datasets bigger than 2d. + if (xDataSize != rowDataSize) return -2; + if ((yPos < 0) || (yPos >= size[1])) return -3; + + try + { + dim[0] = xDataSize; + dim[1] = 1; + DataSpace mSpace(dimension,dim); + + fSpace = dSet->getSpace(); + offset[0] = rowXPos; + offset[1] = yPos; + fSpace.selectHyperslab(H5S_SELECT_SET, dim, offset); + + nativeType = HDF5FileBase::getNativeType(type); + + + dSet->write(data,nativeType,mSpace,fSpace); + } + catch (DataSetIException error) + { + PROCESS_ERROR; + } + catch (DataSpaceIException error) + { + PROCESS_ERROR; + } + catch (FileIException error) + { + PROCESS_ERROR; + } + return 0; +} + +//KWD File + +KWDFile::KWDFile(int processorNumber, String basename) : HDF5FileBase() +{ + initFile(processorNumber, basename); +} + +KWDFile::KWDFile() : HDF5FileBase() +{ +} + +KWDFile::~KWDFile() {} + +String KWDFile::getFileName() +{ + return filename; +} + +void KWDFile::initFile(int processorNumber, String basename) +{ + if (isOpen()) return; + filename = basename + "_" + String(processorNumber) + ".raw.kwd"; + readyToOpen=true; +} + +void KWDFile::startNewRecording(int recordingNumber, int nChannels, HDF5RecordingInfo* info) +{ + this->recordingNumber = recordingNumber; + this->nChannels = nChannels; + + String recordPath = String("/recordings/")+String(recordingNumber); + CHECK_ERROR(createGroup(recordPath)); + CHECK_ERROR(setAttributeStr(info->name,recordPath,String("name"))); + CHECK_ERROR(setAttribute(U64,&(info->start_time),recordPath,String("start_time"))); + // CHECK_ERROR(setAttribute(U32,&(info->start_sample),recordPath,String("start_sample"))); + CHECK_ERROR(setAttribute(F32,&(info->sample_rate),recordPath,String("sample_rate"))); + CHECK_ERROR(setAttribute(U32,&(info->bit_depth),recordPath,String("bit_depth"))); + recdata = createDataSet(I16,0,nChannels,CHUNK_XSIZE,recordPath+"/data"); + if (!recdata.get()) + std::cerr << "Error creating data set" << std::endl; + curChan = nChannels; +} + +void KWDFile::stopRecording() +{ + //ScopedPointer does the deletion and destructors the closings + recdata = nullptr; +} + +int KWDFile::createFileStructure() +{ + const uint16 ver = 2; + if (createGroup("/recordings")) return -1; + if (setAttribute(U16,(void*)&ver,"/","kwik_version")) return -1; + return 0; +} + +void KWDFile::writeBlockData(int16* data, int nSamples) +{ + CHECK_ERROR(recdata->writeDataBlock(nSamples,I16,data)); +} + +void KWDFile::writeRowData(int16* data, int nSamples) +{ + if (curChan >= nChannels) + { + CHECK_ERROR(recdata->prepareDataBlock(nSamples)); + curChan=0; + } + CHECK_ERROR(recdata->writeDataRow(curChan,nSamples,I16,data)); + curChan++; +} + +//KWIK File + +KWIKFile::KWIKFile(String basename) : HDF5FileBase() +{ + initFile(basename); +} + +KWIKFile::KWIKFile() : HDF5FileBase() +{ + +} + +KWIKFile::~KWIKFile() {} + +String KWIKFile::getFileName() +{ + return filename; +} + +void KWIKFile::initFile(String basename) +{ + if (isOpen()) return; + filename = basename + ".kwik"; + readyToOpen=true; +} + +int KWIKFile::createFileStructure() +{ + const uint16 ver = 2; + if (createGroup("/recordings")) return -1; + if (createGroup("/event_types")) return -1; + for (int i=0; i < eventNames.size(); i++) + { + ScopedPointer<HDF5RecordingData> dSet; + String path = "/event_types/" + eventNames[i]; + if (createGroup(path)) return -1; + path += "/events"; + if (createGroup(path)) return -1; + dSet = createDataSet(U64,0,EVENT_CHUNK_SIZE,path + "/time_samples"); + if (!dSet) return -1; + dSet = createDataSet(U16,0,EVENT_CHUNK_SIZE,path + "/recording"); + if (!dSet) return -1; + path += "/user_data"; + if (createGroup(path)) return -1; + dSet = createDataSet(U8,0,EVENT_CHUNK_SIZE,path + "/eventID"); + if (!dSet) return -1; + dSet = createDataSet(U8,0,EVENT_CHUNK_SIZE,path + "/nodeID"); + if (!dSet) return -1; + dSet = createDataSet(U8,0,EVENT_CHUNK_SIZE,path + "/event_channel"); + if (!dSet) return -1; + } + if (setAttribute(U16,(void*)&ver,"/","kwik_version")) return -1; + return 0; +} + +void KWIKFile::startNewRecording(int recordingNumber, HDF5RecordingInfo* info) +{ + this->recordingNumber = recordingNumber; + kwdIndex=0; + String recordPath = String("/recordings/")+String(recordingNumber); + CHECK_ERROR(createGroup(recordPath)); + CHECK_ERROR(setAttributeStr(info->name,recordPath,String("name"))); + CHECK_ERROR(setAttribute(U64,&(info->start_time),recordPath,String("start_time"))); + // CHECK_ERROR(setAttribute(U32,&(info->start_sample),recordPath,String("start_sample"))); + CHECK_ERROR(setAttribute(F32,&(info->sample_rate),recordPath,String("sample_rate"))); + CHECK_ERROR(setAttribute(U32,&(info->bit_depth),recordPath,String("bit_depth"))); + CHECK_ERROR(createGroup(recordPath + "/raw")); + CHECK_ERROR(createGroup(recordPath + "/raw/hdf5_paths")); + + for (int i = 0; i < eventNames.size(); i++) + { + HDF5RecordingData* dSet; + String path = "/event_types/" + eventNames[i] + "/events"; + dSet = getDataSet(path + "/time_samples"); + if (!dSet) + std::cerr << "Error loading event timestamps dataset for type " << i << std::endl; + timeStamps.add(dSet); + dSet = getDataSet(path + "/recording"); + if (!dSet) + std::cerr << "Error loading event recordings dataset for type " << i << std::endl; + recordings.add(dSet); + dSet = getDataSet(path + "/user_data/eventID"); + if (!dSet) + std::cerr << "Error loading event ID dataset for type " << i << std::endl; + eventID.add(dSet); + dSet = getDataSet(path + "/user_data/nodeID"); + if (!dSet) + std::cerr << "Error loading event node ID dataset for type " << i << std::endl; + nodeID.add(dSet); + dSet = getDataSet(path + "/user_data/event_channel"); + if (!dSet) + std::cerr << "Error loading event channel dataset for type " << i << std::endl; + channelID.add(dSet); + } +} + +void KWIKFile::stopRecording() +{ + timeStamps.clear(); + recordings.clear(); + eventID.clear(); + nodeID.clear(); + channelID.clear(); +} + +void KWIKFile::writeEvent(int type, uint8 id, uint8 processor, uint8 channel, uint64 timestamp) +{ + if (type > eventNames.size() || type < 0) + { + std::cerr << "HDF5::writeEvent Invalid event type " << type << std::endl; + return; + } + CHECK_ERROR(timeStamps[type]->writeDataBlock(1,U64,×tamp)); + CHECK_ERROR(recordings[type]->writeDataBlock(1,I32,&recordingNumber)); + CHECK_ERROR(eventID[type]->writeDataBlock(1,U8,&id)); + CHECK_ERROR(nodeID[type]->writeDataBlock(1,U8,&processor)); + CHECK_ERROR(channelID[type]->writeDataBlock(1,U8,&channel)); +} + +void KWIKFile::addKwdFile(String filename) +{ + CHECK_ERROR(setAttributeStr(filename + "/recordings/" + String(recordingNumber),"/recordings/" + String(recordingNumber) + + "/raw/hdf5_paths",String(kwdIndex))); + kwdIndex++; +} + +void KWIKFile::addEventType(String name) +{ + eventNames.add(name); +} + +//KWX File + +KWXFile::KWXFile(String basename) : HDF5FileBase() +{ + initFile(basename); + numElectrodes=0; + transformVector = new int16[MAX_TRANSFORM_SIZE]; +} + +KWXFile::KWXFile() : HDF5FileBase() +{ + numElectrodes=0; + transformVector = new int16[MAX_TRANSFORM_SIZE]; +} + +KWXFile::~KWXFile() +{ + delete transformVector; +} + +String KWXFile::getFileName() +{ + return filename; +} + +void KWXFile::initFile(String basename) +{ + if (isOpen()) return; + filename = basename + ".kwx"; + readyToOpen=true; +} + +int KWXFile::createFileStructure() +{ + const uint16 ver = 2; + if (createGroup("/channel_groups")) return -1; + if (setAttribute(U16,(void*)&ver,"/","kwik_version")) return -1; + for (int i=0; i < channelArray.size(); i++) + { + int res = createChannelGroup(i); + if (res) return -1; + } + return 0; +} + +void KWXFile::addChannelGroup(int nChannels) +{ + channelArray.add(nChannels); + numElectrodes++; +} + +int KWXFile::createChannelGroup(int index) +{ + ScopedPointer<HDF5RecordingData> dSet; + int nChannels = channelArray[index]; + String path("/channel_groups/"+String(index)); + CHECK_ERROR(createGroup(path)); + dSet = createDataSet(I16,0,0,nChannels,SPIKE_CHUNK_XSIZE,SPIKE_CHUNK_YSIZE,path+"/waveforms_filtered"); + if (!dSet) return -1; + dSet = createDataSet(U64,0,SPIKE_CHUNK_XSIZE,path+"/time_samples"); + if (!dSet) return -1; + dSet = createDataSet(U16,0,SPIKE_CHUNK_XSIZE,path+"/recordings"); + if (!dSet) return -1; + return 0; +} + +void KWXFile::startNewRecording(int recordingNumber) +{ + HDF5RecordingData* dSet; + String path; + this->recordingNumber = recordingNumber; + + for (int i=0; i < channelArray.size(); i++) + { + path = "/channel_groups/"+String(i); + dSet=getDataSet(path+"/waveforms_filtered"); + if (!dSet) + std::cerr << "Error loading spikes dataset for group " << i << std::endl; + spikeArray.add(dSet); + dSet=getDataSet(path+"/time_samples"); + if (!dSet) + std::cerr << "Error loading spike timestamp dataset for group " << i << std::endl; + timeStamps.add(dSet); + dSet=getDataSet(path+"/recordings"); + if (!dSet) + std::cerr << "Error loading spike recordings dataset for group " << i << std::endl; + recordingArray.add(dSet); + } +} + +void KWXFile::stopRecording() +{ + spikeArray.clear(); + timeStamps.clear(); + recordingArray.clear(); +} + +void KWXFile::resetChannels() +{ + stopRecording(); //Just in case + channelArray.clear(); +} + +void KWXFile::writeSpike(int groupIndex, int nSamples, const uint16* data, uint64 timestamp) +{ + if ((groupIndex < 0) || (groupIndex >= numElectrodes)) + { + std::cerr << "HDF5::writeSpike Electrode index out of bounds " << groupIndex << std::endl; + return; + } + int nChans= channelArray[groupIndex]; + int16* dst=transformVector; + + //Given the way we store spike data, we need to transpose it to store in + //N x NSAMPLES x NCHANNELS as well as convert from u16 to i16 + for (int i = 0; i < nSamples; i++) + { + for (int j = 0; j < nChans; j++) + { + *(dst++) = *(data+j*nSamples+i)-32768; + } + } + + CHECK_ERROR(spikeArray[groupIndex]->writeDataBlock(1,nSamples,I16,transformVector)); + CHECK_ERROR(recordingArray[groupIndex]->writeDataBlock(1,I32,&recordingNumber)); + CHECK_ERROR(timeStamps[groupIndex]->writeDataBlock(1,U64,×tamp)); +} diff --git a/Source/Processors/HDF5FileFormat.h b/Source/Processors/HDF5FileFormat.h new file mode 100644 index 0000000000000000000000000000000000000000..d2f8116c5fbc5ed5a4e18dc16053e56d1341b061 --- /dev/null +++ b/Source/Processors/HDF5FileFormat.h @@ -0,0 +1,201 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#ifndef HDF5FILEFORMAT_H_INCLUDED +#define HDF5FILEFORMAT_H_INCLUDED + +#include "../../JuceLibraryCode/JuceHeader.h" + +class HDF5RecordingData; +namespace H5 +{ +class DataSet; +class H5File; +class DataType; +} + +struct HDF5RecordingInfo +{ + String name; + int64 start_time; + uint32 start_sample; + float sample_rate; + uint32 bit_depth; +}; + +class HDF5FileBase +{ +public: + HDF5FileBase(); + ~HDF5FileBase(); + + int open(); + void close(); + virtual String getFileName() = 0; + bool isOpen() const; + typedef enum DataTypes { U8, U16, U32, U64, I8, I16, I32, I64, F32} DataTypes; + + static H5::DataType getNativeType(DataTypes type); + static H5::DataType getH5Type(DataTypes type); + +protected: + + virtual int createFileStructure() = 0; + + int setAttribute(DataTypes type, void* data, String path, String name); + int setAttributeStr(String value, String path, String name); + int createGroup(String path); + + HDF5RecordingData* getDataSet(String path); + + //aliases for createDataSet + HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int chunkX, String path); + HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int chunkX, String path); + HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, String path); + HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path); + + bool readyToOpen; + +private: + //create an extendable dataset + HDF5RecordingData* createDataSet(DataTypes type, int dimension, int* size, int* chunking, String path); + int open(bool newfile); + ScopedPointer<H5::H5File> file; + bool opened; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(HDF5FileBase); +}; + +class HDF5RecordingData +{ +public: + HDF5RecordingData(H5::DataSet* data); + ~HDF5RecordingData(); + + int writeDataBlock(int xDataSize, HDF5FileBase::DataTypes type, void* data); + int writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::DataTypes type, void* data); + + int prepareDataBlock(int xDataSize); + int writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataTypes type, void* data); + +private: + int xPos; + int xChunkSize; + int size[3]; + int dimension; + int rowXPos; + int rowDataSize; + ScopedPointer<H5::DataSet> dSet; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(HDF5RecordingData); +}; + +class KWDFile : public HDF5FileBase +{ +public: + KWDFile(int processorNumber, String basename); + KWDFile(); + ~KWDFile(); + void initFile(int processorNumber, String basename); + void startNewRecording(int recordingNumber, int nChannels, HDF5RecordingInfo* info); + void stopRecording(); + void writeBlockData(int16* data, int nSamples); + void writeRowData(int16* data, int nSamples); + String getFileName(); + +protected: + int createFileStructure(); + +private: + int recordingNumber; + int nChannels; + int curChan; + String filename; + ScopedPointer<HDF5RecordingData> recdata; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(KWDFile); +}; + +class KWIKFile : public HDF5FileBase +{ +public: + KWIKFile(String basename); + KWIKFile(); + ~KWIKFile(); + void initFile(String basename); + void startNewRecording(int recordingNumber, HDF5RecordingInfo* info); + void stopRecording(); + void writeEvent(int type, uint8 id, uint8 processor, uint8 channel, uint64 timestamp); + void addKwdFile(String filename); + void addEventType(String name); + String getFileName(); + +protected: + int createFileStructure(); + +private: + int recordingNumber; + String filename; + OwnedArray<HDF5RecordingData> timeStamps; + OwnedArray<HDF5RecordingData> recordings; + OwnedArray<HDF5RecordingData> eventID; + OwnedArray<HDF5RecordingData> nodeID; + OwnedArray<HDF5RecordingData> channelID; + Array<String> eventNames; + int kwdIndex; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(KWIKFile); +}; + +class KWXFile : public HDF5FileBase +{ +public: + KWXFile(String basename); + KWXFile(); + ~KWXFile(); + void initFile(String basename); + void startNewRecording(int recordingNumber); + void stopRecording(); + void addChannelGroup(int nChannels); + void resetChannels(); + void writeSpike(int groupIndex, int nSamples, const uint16* data, uint64 timestamp); + String getFileName(); + +protected: + int createFileStructure(); + +private: + int createChannelGroup(int index); + int recordingNumber; + String filename; + OwnedArray<HDF5RecordingData> spikeArray; + OwnedArray<HDF5RecordingData> recordingArray; + OwnedArray<HDF5RecordingData> timeStamps; + Array<int> channelArray; + int numElectrodes; + int16* transformVector; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(KWXFile); +}; + +#endif // HDF5FILEFORMAT_H_INCLUDED diff --git a/Source/Processors/HDF5Recording.cpp b/Source/Processors/HDF5Recording.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f9b89c5d98af6406e4c49930b5555a35fae75c29 --- /dev/null +++ b/Source/Processors/HDF5Recording.cpp @@ -0,0 +1,171 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#include "HDF5Recording.h" +#define MAX_BUFFER_SIZE 10000 + +HDF5Recording::HDF5Recording() : processorIndex(-1) +{ + timestamp = 0; + scaledBuffer = new float[MAX_BUFFER_SIZE]; + intBuffer = new int16[MAX_BUFFER_SIZE]; +} + +HDF5Recording::~HDF5Recording() +{ + delete scaledBuffer; + delete intBuffer; +} + +void HDF5Recording::updateTimeStamp(int64 timestamp) +{ + this->timestamp = timestamp; +} + +void HDF5Recording::registerProcessor(GenericProcessor* proc) +{ + HDF5RecordingInfo* info = new HDF5RecordingInfo(); + info->sample_rate = proc->getSampleRate(); + info->bit_depth = 16; + infoArray.add(info); + fileArray.add(new KWDFile()); + activeChannelCount.add(0); + processorIndex++; +} + +void HDF5Recording::resetChannels() +{ + processorIndex = -1; + fileArray.clear(); + activeChannelCount.clear(); + processorMap.clear(); + infoArray.clear(); + if (spikesFile) + spikesFile->resetChannels(); +} + +void HDF5Recording::addChannel(int index, Channel* chan) +{ + processorMap.add(processorIndex); +} + +void HDF5Recording::openFiles(File rootFolder, int experimentNumber, int recordingNumber) +{ + String basepath = rootFolder.getFullPathName() + rootFolder.separatorString + "experiment" + String(experimentNumber); + //KWIK file + mainFile->initFile(basepath); + mainFile->open(); + + //KWX file + spikesFile->initFile(basepath); + spikesFile->open(); + spikesFile->startNewRecording(recordingNumber); + + //Let's just put the first processor (usually the source node) on the KWIK for now + infoArray[0]->name = String("Open-Ephys Recording #") + String(recordingNumber); + infoArray[0]->start_time = timestamp; + infoArray[0]->start_sample = 0; + mainFile->startNewRecording(recordingNumber,infoArray[0]); + + //KWD files + for (int i = 0; i < processorMap.size(); i++) + { + int index = processorMap[i]; + if (getChannel(i)->getRecordState()) + { + if (!fileArray[index]->isOpen()) + { + fileArray[index]->initFile(getChannel(i)->nodeId,basepath); + fileArray[index]->open(); + } + activeChannelCount.set(index,activeChannelCount[index]+1); + } + } + for (int i = 0; i < fileArray.size(); i++) + { + if (fileArray[i]->isOpen()) + { + File f(fileArray[i]->getFileName()); + mainFile->addKwdFile(f.getFileName()); + + infoArray[i]->name = String("Open-Ephys Recording #") + String(recordingNumber); + infoArray[i]->start_time = timestamp; + infoArray[i]->start_sample = 0; + fileArray[i]->startNewRecording(recordingNumber,activeChannelCount[i],infoArray[i]); + } + } +} + +void HDF5Recording::closeFiles() +{ + mainFile->stopRecording(); + mainFile->close(); + spikesFile->stopRecording(); + spikesFile->close(); + for (int i = 0; i < fileArray.size(); i++) + { + fileArray[i]->stopRecording(); + fileArray[i]->close(); + activeChannelCount.set(i,0); + } +} + +void HDF5Recording::writeData(AudioSampleBuffer& buffer, int nSamples) +{ + int index; + for (int i = 0; i < buffer.getNumChannels(); i++) + { + if (getChannel(i)->getRecordState()) + { + double multFactor = 1/(float(0x7fff) * getChannel(i)->bitVolts); + int index = processorMap[getChannel(i)->recordIndex]; + FloatVectorOperations::copyWithMultiply(scaledBuffer,buffer.getReadPointer(i,0),multFactor,nSamples); + AudioDataConverters::convertFloatToInt16LE(scaledBuffer,intBuffer,nSamples); + fileArray[index]->writeRowData(intBuffer,nSamples); + } + } +} + +void HDF5Recording::writeEvent(int eventType, MidiMessage& event, int samplePosition) +{ + const uint8* dataptr = event.getRawData(); + //right now only written events are TTL, so type = 0 + mainFile->writeEvent(0,*(dataptr+2),*(dataptr+1),*(dataptr+3),timestamp+samplePosition); +} + +void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec) +{ + spikesFile->addChannelGroup(elec->numChannels); +} +void HDF5Recording::writeSpike(const SpikeObject& spike, int electrodeIndex) +{ + spikesFile->writeSpike(electrodeIndex,spike.nSamples,spike.data,spike.timestamp); +} + +void HDF5Recording::startAcquisition() +{ + mainFile = new KWIKFile(); + mainFile->addEventType("TTL"); + spikesFile = new KWXFile(); +} + diff --git a/Source/Processors/HDF5Recording.h b/Source/Processors/HDF5Recording.h new file mode 100644 index 0000000000000000000000000000000000000000..525c3ca6b047c43468f86e6c4a3604339384e795 --- /dev/null +++ b/Source/Processors/HDF5Recording.h @@ -0,0 +1,65 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#ifndef HDF5RECORDING_H_INCLUDED +#define HDF5RECORDING_H_INCLUDED + +#include "RecordEngine.h" +#include "HDF5FileFormat.h" + +class HDF5Recording : public RecordEngine +{ +public: + HDF5Recording(); + ~HDF5Recording(); + void openFiles(File rootFolder, int experimentNumber, int recordingNumber); + void closeFiles(); + void writeData(AudioSampleBuffer& buffer, int nSamples); + void writeEvent(int eventType, MidiMessage& event, int samplePosition); + void addChannel(int index, Channel* chan); + void addSpikeElectrode(int index, SpikeRecordInfo* elec); + void writeSpike(const SpikeObject& spike, int electrodeIndex); + void registerProcessor(GenericProcessor* processor); + void resetChannels(); + void updateTimeStamp(int64 timestamp); + void startAcquisition(); + +private: + + int processorIndex; + + Array<int> processorMap; + Array<int> activeChannelCount; + OwnedArray<KWDFile> fileArray; + OwnedArray<HDF5RecordingInfo> infoArray; + ScopedPointer<KWIKFile> mainFile; + ScopedPointer<KWXFile> spikesFile; + float* scaledBuffer; + int16* intBuffer; + int64 timestamp; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(HDF5Recording); +}; + + +#endif // HDF5RECORDING_H_INCLUDED diff --git a/Source/Processors/OriginalRecording.cpp b/Source/Processors/OriginalRecording.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c858c793894aeaef6c337f4fdf5429ba3ba5b93f --- /dev/null +++ b/Source/Processors/OriginalRecording.cpp @@ -0,0 +1,538 @@ +/* +------------------------------------------------------------------ + +This file is part of the Open Ephys GUI +Copyright (C) 2013 Florian Franzen + +------------------------------------------------------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +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 for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "OriginalRecording.h" +#include "../Audio/AudioComponent.h" + +OriginalRecording::OriginalRecording() : separateFiles(true), eventFile(nullptr), + recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0) +{ + continuousDataIntegerBuffer = new int16[10000]; + continuousDataFloatBuffer = new float[10000]; + + recordMarker = new char[10]; + for (int i = 0; i < 9; i++) + { + recordMarker[i] = i; + } + recordMarker[9] = 255; + + zeroBuffer.clear(); +} + +OriginalRecording::~OriginalRecording() +{ + //Cleanup just in case + for (int i=0; i < fileArray.size(); i++) + { + if (fileArray[i] != nullptr) fclose(fileArray[i]); + } + for (int i=0; i < spikeFileArray.size(); i++) + { + if (spikeFileArray[i] != nullptr) fclose(spikeFileArray[i]); + } + delete continuousDataFloatBuffer; + delete continuousDataIntegerBuffer; + delete recordMarker; +} + +void OriginalRecording::addChannel(int index, Channel* chan) +{ + //Just populate the file array with null so we can address it by index afterwards + fileArray.add(nullptr); +} + +void OriginalRecording::addSpikeElectrode(int index, SpikeRecordInfo* elec) +{ + spikeFileArray.add(nullptr); +} + +void OriginalRecording::resetChannels() +{ + fileArray.clear(); + spikeFileArray.clear(); +} + +void OriginalRecording::openFiles(File rootFolder, int experimentNumber, int recordingNumber) +{ + this->recordingNumber = recordingNumber; + this->experimentNumber = experimentNumber; + openFile(rootFolder,nullptr); + for (int i = 0; i < fileArray.size(); i++) + { + if (getChannel(i)->getRecordState()) + { + openFile(rootFolder,getChannel(i)); + } + } + for (int i = 0; i < spikeFileArray.size(); i++) + { + openSpikeFile(rootFolder,getSpikeElectrode(i)); + } + blockIndex = 0; +} + +void OriginalRecording::openFile(File rootFolder, Channel* ch) +{ + FILE* chFile; + bool isEvent; + String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString); + + std::cout << "OPENING FILE: " << fullPath << std::endl; + + isEvent = (ch == nullptr) ? true : false; + if (isEvent) + fullPath += "experiment" + String(experimentNumber) + "_all_channels.events"; + else + fullPath += getFileName(ch); + + File f = File(fullPath); + + bool fileExists = f.exists(); + + diskWriteLock.enter(); + + chFile = fopen(fullPath.toUTF8(), "ab"); + + if (!fileExists) + { + // create and write header + std::cout << "Writing header." << std::endl; + String header = generateHeader(ch); + //std::cout << header << std::endl; + std::cout << "File ID: " << chFile << ", number of bytes: " << header.getNumBytesAsUTF8() << std::endl; + + + fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), chFile); + + std::cout << "Wrote header." << std::endl; + + std::cout << "Block index: " << blockIndex << std::endl; + + } + else + { + std::cout << "File already exists, just opening." << std::endl; + } + + diskWriteLock.exit(); + + if (isEvent) + eventFile = chFile; + else + fileArray.set(ch->recordIndex,chFile); + +} + +void OriginalRecording::openSpikeFile(File rootFolder, SpikeRecordInfo* elec) +{ + + FILE* spFile; + String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString); + fullPath += "experiment" + String(experimentNumber) + "_"; + fullPath += elec->name.removeCharacters(" "); + fullPath += ".spikes"; + + std::cout << "OPENING FILE: " << fullPath << std::endl; + + File f = File(fullPath); + + bool fileExists = f.exists(); + + diskWriteLock.enter(); + + spFile = fopen(fullPath.toUTF8(),"ab"); + + if (!fileExists) + { + String header = generateSpikeHeader(elec); + fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), spFile); + } + diskWriteLock.exit(); + spikeFileArray.set(elec->recordIndex,spFile); + +} + +String OriginalRecording::getFileName(Channel* ch) +{ + String filename; + + filename += "experiment" + String(experimentNumber) + "_"; + filename += ch->nodeId; + filename += "_"; + filename += ch->name; + + if (separateFiles) + { + filename += "_"; + filename += recordingNumber; + } + filename += ".continuous"; + + return filename; +} + +String OriginalRecording::generateHeader(Channel* ch) +{ + + String header = "header.format = 'Open Ephys Data Format'; \n"; + + header += "header.version = 0.2;"; + header += "header.header_bytes = "; + header += String(HEADER_SIZE); + header += ";\n"; + + if (ch == nullptr) + { + header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, one uint8 event channel, and one uint16 recordingNumber'; \n"; + + } + else + { + header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample count (N), 1 uint16 recordingNumber, N 16-bit samples, and one 10-byte record marker (0 1 2 3 4 5 6 7 8 255)'; \n"; + } + + + header += "header.date_created = '"; + header += generateDateString(); + header += "';\n"; + + header += "header.channel = '"; + header += (ch != nullptr) ? ch->name : "Events"; + header += "';\n"; + + if (ch == nullptr) + { + + header += "header.channelType = 'Event';\n"; + } + else + { + header += "header.channelType = 'Continuous';\n"; + } + + header += "header.sampleRate = "; + // all channels need to have the same sample rate under the current scheme + header += String(getChannel(0)->sampleRate); + header += ";\n"; + header += "header.blockLength = "; + header += BLOCK_LENGTH; + header += ";\n"; + header += "header.bufferSize = "; + header += getAudioComponent()->getBufferSize(); + header += ";\n"; + header += "header.bitVolts = "; + header += (ch != nullptr) ? String(ch->bitVolts) : "1"; + header += ";\n"; + + header = header.paddedRight(' ', HEADER_SIZE); + + //std::cout << header << std::endl; + + return header; + +} + +String OriginalRecording::generateSpikeHeader(SpikeRecordInfo* elec) +{ + String header = "header.format = 'Open Ephys Data Format'; \n"; + header += "header.version = 0.2;"; + header += "header.header_bytes = "; + header += String(HEADER_SIZE); + header += ";\n"; + + header += "header.description = 'Each record contains 1 uint8 eventType, 1 uint64 timestamp, 1 uint16 electrodeID, 1 uint16 numChannels (n), 1 uint16 numSamples (m), n*m uint16 samples, n uint16 channelGains, n uint16 thresholds, and 1 uint16 recordingNumber'; \n"; + + header += "header.date_created = '"; + header += generateDateString(); + header += "';\n"; + + header += "header.electrode = '"; + header += elec->name; + header += "';\n"; + + header += "header.num_channels = "; + header += elec->numChannels; + header += ";\n"; + + header += "header.sampleRate = "; + header += String(elec->sampleRate); + header += ";\n"; + + header = header.paddedRight(' ', HEADER_SIZE); + + //std::cout << header << std::endl; + + return header; +} + +void OriginalRecording::writeEvent(int eventType, MidiMessage& event, int samplePosition) +{ + // find file and write samples to disk + // std::cout << "Received event!" << std::endl; + + if (eventFile == nullptr) + return; + + const uint8* dataptr = event.getRawData(); + + + uint64 samplePos = (uint64) samplePosition; + + int64 eventTimestamp = timestamp + samplePos; // add the sample position to the buffer timestamp + + diskWriteLock.enter(); + + fwrite(&eventTimestamp, // ptr + 8, // size of each element + 1, // count + eventFile); // ptr to FILE object + + fwrite(&samplePos, // ptr + 2, // size of each element + 1, // count + eventFile); // ptr to FILE object + + // write 1st four bytes of event (type, nodeId, eventId, eventChannel) + fwrite(dataptr, 1, 4, eventFile); + + // write recording number + fwrite(&recordingNumber, // ptr + 2, // size of each element + 1, // count + eventFile); // ptr to FILE object + + diskWriteLock.exit(); +} + +void OriginalRecording::writeData(AudioSampleBuffer& buffer, int nSamples) +{ + int samplesWritten = 0; + + while (samplesWritten < nSamples) // there are still unwritten samples in the buffer + { + + int numSamplesToWrite = nSamples - samplesWritten; // samples remaining in the buffer + + if (blockIndex + numSamplesToWrite < BLOCK_LENGTH) // we still have space in this block + { + for (int i = 0; i < buffer.getNumChannels(); i++) + { + + if (getChannel(i)->getRecordState()) + { + // write buffer to disk! + writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), + numSamplesToWrite, + i); + + + } + } + + // update our variables + samplesWritten += numSamplesToWrite; + timestamp += numSamplesToWrite; + blockIndex += numSamplesToWrite; + + } + else // there's not enough space left in this block for all remaining samples + { + + numSamplesToWrite = BLOCK_LENGTH - blockIndex; + + for (int i = 0; i < buffer.getNumChannels(); i++) + { + + if (getChannel(i)->getRecordState()) + { + // write buffer to disk! + writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), + numSamplesToWrite, + i); + + //std::cout << "Record channel " << i << std::endl; + } + } + + // update our variables + samplesWritten += numSamplesToWrite; + timestamp += numSamplesToWrite; + blockIndex = 0; // back to the beginning of the block + + } + } +} + +void OriginalRecording::writeContinuousBuffer(const float* data, int nSamples, int channel) +{ + // check to see if the file exists + if (fileArray[channel] == nullptr) + return; + + // scale the data back into the range of int16 + float scaleFactor = float(0x7fff) * getChannel(channel)->bitVolts; + for (int n = 0; n < nSamples; n++) + { + *(continuousDataFloatBuffer+n) = *(data+n) / scaleFactor; + } + AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples); + + if (blockIndex == 0) + { + writeTimestampAndSampleCount(fileArray[channel]); + } + + diskWriteLock.enter(); + + size_t count = fwrite(continuousDataIntegerBuffer, // ptr + 2, // size of each element + nSamples, // count + fileArray[channel]); // ptr to FILE object + + jassert(count == nSamples); // make sure all the data was written + + diskWriteLock.exit(); + + if (blockIndex + nSamples == BLOCK_LENGTH) + { + writeRecordMarker(fileArray[channel]); + } +} + +void OriginalRecording::writeTimestampAndSampleCount(FILE* file) +{ + diskWriteLock.enter(); + + uint16 samps = BLOCK_LENGTH; + + fwrite(×tamp, // ptr + 8, // size of each element + 1, // count + file); // ptr to FILE object + + fwrite(&samps, // ptr + 2, // size of each element + 1, // count + file); // ptr to FILE object + + fwrite(&recordingNumber, // ptr + 2, // size of each element + 1, // count + file); // ptr to FILE object + + diskWriteLock.exit(); +} + +void OriginalRecording::writeRecordMarker(FILE* file) +{ + // write a 10-byte marker indicating the end of a record + + diskWriteLock.enter(); + fwrite(recordMarker, // ptr + 1, // size of each element + 10, // count + file); // ptr to FILE object + + diskWriteLock.exit(); +} + +void OriginalRecording::closeFiles() +{ + for (int i = 0; i < fileArray.size(); i++) + { + if (fileArray[i] != nullptr) + { + if (blockIndex < BLOCK_LENGTH) + { + // fill out the rest of the current buffer + writeContinuousBuffer(zeroBuffer.getReadPointer(0), BLOCK_LENGTH - blockIndex, i); + diskWriteLock.enter(); + fclose(fileArray[i]); + fileArray.set(i,nullptr); + diskWriteLock.exit(); + } + } + } + for (int i = 0; i < spikeFileArray.size(); i++) + { + if (spikeFileArray[i] != nullptr) + { + diskWriteLock.enter(); + fclose(spikeFileArray[i]); + spikeFileArray.set(i,nullptr); + diskWriteLock.exit(); + } + } + if (eventFile != nullptr) + { + diskWriteLock.enter(); + fclose(eventFile); + eventFile = nullptr; + diskWriteLock.exit(); + } + blockIndex = 0; +} + +void OriginalRecording::updateTimeStamp(int64 timestamp) +{ + this->timestamp = timestamp; +} + +void OriginalRecording::writeSpike(const SpikeObject& spike, int electrodeIndex) +{ + uint8_t spikeBuffer[MAX_SPIKE_BUFFER_LEN]; + + if (spikeFileArray[electrodeIndex] == nullptr) + return; + + packSpike(&spike, spikeBuffer, MAX_SPIKE_BUFFER_LEN); + + int totalBytes = spike.nSamples * spike.nChannels * 2 + // account for samples + spike.nChannels * 4 + // acount for threshold and gain + 15; // 15 bytes in every SpikeObject + + + // format: + // 1 byte of event type (always = 4 for spikes) + // 8 bytes for 64-bit timestamp + // 2 bytes for 16-bit electrode ID + // 2 bytes for 16-bit number of channels (n) + // 2 bytes for 16-bit number of samples (m) + // 2*n*m bytes for 16-bit samples + // 2*n bytes for 16-bit gains + // 2*n bytes for 16-bit thresholds + + // const MessageManagerLock mmLock; + + diskWriteLock.enter(); + + fwrite(spikeBuffer, 1, totalBytes, spikeFileArray[electrodeIndex]); + + fwrite(&recordingNumber, // ptr + 2, // size of each element + 1, // count + spikeFileArray[electrodeIndex]); // ptr to FILE object + + diskWriteLock.exit(); +} \ No newline at end of file diff --git a/Source/Processors/OriginalRecording.h b/Source/Processors/OriginalRecording.h new file mode 100644 index 0000000000000000000000000000000000000000..99c6f0a716965fd712e3037ccb9d254663130008 --- /dev/null +++ b/Source/Processors/OriginalRecording.h @@ -0,0 +1,91 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#ifndef ORIGINALRECORDING_H_INCLUDED +#define ORIGINALRECORDING_H_INCLUDED + +#include "../../JuceLibraryCode/JuceHeader.h" + +#include "RecordEngine.h" +#include <stdio.h> + +#define HEADER_SIZE 1024 +#define BLOCK_LENGTH 1024 + +class OriginalRecording : public RecordEngine +{ +public: + OriginalRecording(); + ~OriginalRecording(); + + void openFiles(File rootFolder, int experimentNumber, int recordingNumber); + void closeFiles(); + void writeData(AudioSampleBuffer& buffer, int nSamples); + void writeEvent(int eventType, MidiMessage& event, int samplePosition); + void addChannel(int index, Channel* chan); + void resetChannels(); + void updateTimeStamp(int64 timestamp); + void addSpikeElectrode(int index, SpikeRecordInfo* elec); + void writeSpike(const SpikeObject& spike, int electrodeIndex); + +private: + String getFileName(Channel* ch); + void openFile(File rootFolder, Channel* ch); + String generateHeader(Channel* ch); + void writeContinuousBuffer(const float* data, int nSamples, int channel); + void writeTimestampAndSampleCount(FILE* file); + void writeRecordMarker(FILE* file); + + void openSpikeFile(File rootFolder, SpikeRecordInfo* elec); + String generateSpikeHeader(SpikeRecordInfo* elec); + + bool separateFiles; + int blockIndex; + int recordingNumber; + int experimentNumber; + + /** Holds data that has been converted from float to int16 before + saving. + */ + int16* continuousDataIntegerBuffer; + + /** Holds data that has been converted from float to int16 before + saving. + */ + float* continuousDataFloatBuffer; + + /** Used to indicate the end of each record */ + char* recordMarker; + + AudioSampleBuffer zeroBuffer; + int64 timestamp; + + FILE* eventFile; + Array<FILE*> fileArray; + Array<FILE*> spikeFileArray; + CriticalSection diskWriteLock; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(OriginalRecording); +}; + +#endif // ORIGINALRECORDING_H_INCLUDED diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp index b57ee2d7946530ef29ec103f91ecdcd7875a59c2..332429f776c414d30d35894affb9a1c9a5245541 100644 --- a/Source/Processors/ProcessorGraph.cpp +++ b/Source/Processors/ProcessorGraph.cpp @@ -98,7 +98,6 @@ void ProcessorGraph::createDefaultNodes() addNode(recn, RECORD_NODE_ID); addNode(an, AUDIO_NODE_ID); addNode(arn, RESAMPLING_NODE_ID); - } void ProcessorGraph::updatePointers() @@ -436,6 +435,7 @@ void ProcessorGraph::connectProcessorToAudioAndRecordNodes(GenericProcessor* sou if (source == nullptr) return; + getRecordNode()->registerProcessor(source); for (int chan = 0; chan < source->getNumOutputs(); chan++) { @@ -782,11 +782,7 @@ void ProcessorGraph::setRecordState(bool isRecording) { GenericProcessor* p = (GenericProcessor*) node->getProcessor(); - if (isRecording) - p->startRecording(); - else - p->stopRecording(); - + p->setRecording(isRecording); } } diff --git a/Source/Processors/RecordEngine.cpp b/Source/Processors/RecordEngine.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6a9496bc6588c229ecf4bd1fa41c9021e4e57c10 --- /dev/null +++ b/Source/Processors/RecordEngine.cpp @@ -0,0 +1,57 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#include "RecordEngine.h" +#include "RecordNode.h" +#include "ProcessorGraph.h" + +RecordEngine::RecordEngine() {} + +RecordEngine::~RecordEngine() {} + +void RecordEngine::resetChannels() {} + +void RecordEngine::registerProcessor(GenericProcessor* processor) {} + +Channel* RecordEngine::getChannel(int index) +{ + return getProcessorGraph()->getRecordNode()->getDataChannel(index); +} + +String RecordEngine::generateDateString() +{ + return getProcessorGraph()->getRecordNode()->generateDateString(); +} + +SpikeRecordInfo* RecordEngine::getSpikeElectrode(int index) +{ + return getProcessorGraph()->getRecordNode()->getSpikeElectrode(index); +} + +void RecordEngine::updateTimeStamp(int64 timestamp) {} + +void RecordEngine::registerSpikeSource(GenericProcessor* processor) {} + +void RecordEngine::startAcquisition() {} + +void RecordEngine::directoryChanged() {} \ No newline at end of file diff --git a/Source/Processors/RecordEngine.h b/Source/Processors/RecordEngine.h new file mode 100644 index 0000000000000000000000000000000000000000..ec677a13a9aaae13861182837f3758c1be6e6048 --- /dev/null +++ b/Source/Processors/RecordEngine.h @@ -0,0 +1,143 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Florian Franzen + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#ifndef RECORDENGINE_H_INCLUDED +#define RECORDENGINE_H_INCLUDED + +#include "../../JuceLibraryCode/JuceHeader.h" +#include "Channel.h" +#include "GenericProcessor.h" +#include "Visualization/SpikeObject.h" + +struct SpikeRecordInfo +{ + String name; + int numChannels; + int sampleRate; + + int recordIndex; +}; + +class RecordNode; + +class RecordEngine : public AccessClass +{ +public: + RecordEngine(); + ~RecordEngine(); + /** All the public methods are called by RecordNode: + When acquisition starts (in the specified order): + 1-resetChannels + 2-registerProcessor, addChannel, registerSpikeSource, addspikeelectrode + 3-startAcquisition + When recording starts (in the specified order): + 1-directoryChanged (if needed) + 2-openFiles + During recording: + writeData, writeEvent, writeSpike, updateTimeStamp + When recording stops: + closeFiles + */ + + /** Called when recording starts to open all needed files + */ + virtual void openFiles(File rootFolder, int experimentNumber, int recordingNumber) = 0; + + /** Called when recording stops to close all files + and do all the necessary cleanups + */ + virtual void closeFiles() = 0; + + /** Write continuous data. + This method gets the full data buffer, it must query getRecordState for + each registered channel to determine which channels to actually write to disk + */ + virtual void writeData(AudioSampleBuffer& buffer, int nSamples) = 0; + + /** Write a single event to disk. + */ + virtual void writeEvent(int eventType, MidiMessage& event, int samplePosition) = 0; + + /** Called when acquisition starts once for each processor that might record continuous data + */ + virtual void registerProcessor(GenericProcessor* processor); + + /** Called after registerProcessor, once for each output + channel of the processor + */ + virtual void addChannel(int index, Channel* chan) = 0; + + /** Called when acquisition starts once for each processor that might record spikes + */ + virtual void registerSpikeSource(GenericProcessor* processor); + + /** Called after registerSpikesource, once for each channel group + */ + virtual void addSpikeElectrode(int index, SpikeRecordInfo* elec) = 0; + + /** Write a spike to disk + */ + virtual void writeSpike(const SpikeObject& spike, int electrodeIndex) = 0; + + /** Called when a new acquisition starts, to clean all channel data + before registering the processors + */ + virtual void resetChannels(); + + /** Called every time a new timestamp event is received + */ + virtual void updateTimeStamp(int64 timestamp); + + /** Called after all channels and spike groups have been registered, + just before acquisition starts + */ + virtual void startAcquisition(); + + /** Called when the recording directory changes during an acquisition + */ + virtual void directoryChanged(); + +protected: + /** Functions to access RecordNode arrays and utilities + */ + + /** Gets the specified channel from the channel array stored in RecordNode + */ + Channel* getChannel(int index); + + /** Gets the specified channel group info structure from the array stored in RecordNode + */ + SpikeRecordInfo* getSpikeElectrode(int index); + + /** Generate a Matlab-compatible datestring + */ + String generateDateString(); + +private: + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordEngine); +}; + + + +#endif // RECORDENGINE_H_INCLUDED diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp index ac5efeb50095417cd632b4e5917c3ab718bd2ebb..249475f1ce0e2f0e8f9f9b20e8a1f4e71eeb3ae4 100755 --- a/Source/Processors/RecordNode.cpp +++ b/Source/Processors/RecordNode.cpp @@ -1,23 +1,23 @@ /* - ------------------------------------------------------------------ +------------------------------------------------------------------ - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys +This file is part of the Open Ephys GUI +Copyright (C) 2013 Open Ephys - ------------------------------------------------------------------ +------------------------------------------------------------------ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. - 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 for more details. +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 for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -26,22 +26,22 @@ #include "../UI/EditorViewport.h" #include "../UI/ControlPanel.h" +#define EVERY_ENGINE for(int eng = 0; eng < engineArray.size(); eng++) engineArray[eng] + + + #include "Channel.h" RecordNode::RecordNode() : GenericProcessor("Record Node"), - newDirectoryNeeded(true), zeroBuffer(1, 50000), timestamp(0), - appendTrialNum(false), trialNum(0) + newDirectoryNeeded(true), timestamp(0) { isProcessing = false; isRecording = false; allFilesOpened = false; - blockIndex = 0; signalFilesShouldClose = false; - continuousDataIntegerBuffer = new int16[10000]; - continuousDataFloatBuffer = new float[10000]; signalFilesShouldClose = false; settings.numInputs = 2048; @@ -49,21 +49,17 @@ RecordNode::RecordNode() eventChannel = new Channel(this, 0); eventChannel->setType(EVENT_CHANNEL); + recordingNumber = 0; - recordMarker = new char[10]; - for (int i = 0; i < 9; i++) - { - recordMarker[i] = i; - } - recordMarker[9] = 255; - recordingNumber = 0; + spikeElectrodeIndex = 0; + + experimentNumber = 0; + hasRecorded = false; // 128 inputs, 0 outputs setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128); - zeroBuffer.clear(); - } @@ -118,11 +114,13 @@ void RecordNode::resetConnections() //std::cout << "Resetting connections" << std::endl; nextAvailableChannel = 0; wasConnected = false; + spikeElectrodeIndex = 0; channelPointers.clear(); eventChannelPointers.clear(); + spikeElectrodePointers.clear(); - + EVERY_ENGINE->resetChannels(); } @@ -188,29 +186,14 @@ void RecordNode::addInputChannel(GenericProcessor* sourceNode, int chan) int channelIndex = getNextChannel(false); - setPlayConfigDetails(channelIndex+1,0,44100.0,128); - channelPointers.add(sourceNode->channels[chan]); + setPlayConfigDetails(channelIndex+1,0,44100.0,128); // std::cout << channelIndex << std::endl; - updateFileName(channelPointers[channelIndex]); - - - - //if (channelPointers[channelIndex]->isRecording) - // std::cout << " This channel will be recorded." << std::endl; - //else - // std::cout << " This channel will NOT be recorded." << std::endl; - - //std::cout << "adding channel " << getNextChannel(false) << std::endl; - - //std::pair<int, Channel> newPair (getNextChannel(false), newChannel); - - //std::cout << "adding channel " << getNextChannel(false) << std::endl; - - //continuouschannelPointers.insert(newPair); + channelPointers[channelIndex]->recordIndex = channelIndex; + EVERY_ENGINE->addChannel(channelIndex,channelPointers[channelIndex]); } else @@ -270,31 +253,14 @@ void RecordNode::appendTrialNumber(bool t) appendTrialNum = t; } + void RecordNode::createNewDirectory() { std::cout << "Creating new directory." << std::endl; rootFolder = File(dataDirectory.getFullPathName() + File::separator + generateDirectoryName()); - - updateFileName(eventChannel); - - for (int i = 0; i < channelPointers.size(); i++) - { - updateFileName(channelPointers[i]); - } - newDirectoryNeeded = false; - trialNum = 0; - -} - -void RecordNode::createNewFiles() -{ - for (int i = 0; i < channelPointers.size(); i++) - { - updateFileName(channelPointers[i]); - } } @@ -383,12 +349,15 @@ void RecordNode::setParameter(int parameterIndex, float newValue) { isRecording = true; + hasRecorded = true; // std::cout << "START RECORDING." << std::endl; if (newDirectoryNeeded) { createNewDirectory(); recordingNumber = 0; + experimentNumber = 1; + EVERY_ENGINE->directoryChanged(); } else { @@ -402,23 +371,7 @@ void RecordNode::setParameter(int parameterIndex, float newValue) getEditorViewport()->saveState(File(settingsFileName)); } - createNewFiles(); - - openFile(eventChannel); - - blockIndex = 0; // reset index - - - // create / open necessary files - for (int i = 0; i < channelPointers.size(); i++) - { - // std::cout << "Checking channel " << i << std::endl; - - if (channelPointers[i]->getRecordState()) - { - openFile(channelPointers[i]); - } - } + EVERY_ENGINE->openFiles(rootFolder, experimentNumber, recordingNumber); allFilesOpened = true; @@ -449,189 +402,47 @@ void RecordNode::setParameter(int parameterIndex, float newValue) std::cout << "Toggling channel " << currentChannel << std::endl; + if (isRecording) + { + //Toggling channels while recording isn't allowed. Code shouldn't reach here. + //In case it does, display an error and exit. + sendActionMessage("Toggling record channels while recording is not allowed"); + std::cout << "ERROR: Wrong code section reached\n Toggling record channels while recording is not allowed." << std::endl; + return; + } + if (newValue == 0.0f) { channelPointers[currentChannel]->setRecordState(false); - - if (isRecording) - { - - if (blockIndex < BLOCK_LENGTH) - { - // fill out the rest of the current buffer - writeContinuousBuffer(zeroBuffer.getReadPointer(0), BLOCK_LENGTH - blockIndex, currentChannel); - } - - closeFile(channelPointers[currentChannel]); - } - } else { channelPointers[currentChannel]->setRecordState(true); - - if (isRecording) - { - - openFile(channelPointers[currentChannel]); - - if (blockIndex > 0) - { - writeTimestampAndSampleCount(channelPointers[currentChannel]->file); - // fill up the first data block up to sample count - writeContinuousBuffer(zeroBuffer.getReadPointer(0), blockIndex, currentChannel); - } - - } } } } } -void RecordNode::openFile(Channel* ch) -{ - std::cout << "OPENING FILE: " << ch->filename << std::endl; - - File f = File(ch->filename); - FILE* chFile; - - bool fileExists = f.exists(); - - diskWriteLock.enter(); - - chFile = fopen(ch->filename.toUTF8(), "ab"); - - if (!fileExists) - { - // create and write header - std::cout << "Writing header." << std::endl; - String header = generateHeader(ch); - //std::cout << header << std::endl; - std::cout << "File ID: " << chFile << ", number of bytes: " << header.getNumBytesAsUTF8() << std::endl; - - - fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), chFile); - - std::cout << "Wrote header." << std::endl; - - std::cout << "Block index: " << blockIndex << std::endl; - - } - else - { - std::cout << "File already exists, just opening." << std::endl; - } - - diskWriteLock.exit(); - - //To avoid a race condition resulting on data written before the header, - //do not assign the channel pointer until the header has been written - ch->file = chFile; - - -} - -void RecordNode::closeFile(Channel* ch) -{ - - diskWriteLock.enter(); - - std::cout << "CLOSING FILE: " << ch->filename << std::endl; - if (ch->file != NULL) - fclose(ch->file); - - diskWriteLock.exit(); -} - -String RecordNode::generateHeader(Channel* ch) -{ - - String header = "header.format = 'Open Ephys Data Format'; \n"; - - header += "header.version = 0.2;"; - header += "header.header_bytes = "; - header += String(HEADER_SIZE); - header += ";\n"; - - if (ch->getType() == EVENT_CHANNEL) - { - header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, one uint8 event channel, and one uint16 recordingNumber'; \n"; - - } - else - { - header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample count (N), 1 uint16 recordingNumber, N 16-bit samples, and one 10-byte record marker (0 1 2 3 4 5 6 7 8 255)'; \n"; - } - - - header += "header.date_created = '"; - header += generateDateString(); - header += "';\n"; - - header += "header.channel = '"; - header += ch->name; - header += "';\n"; - - if (ch->getType() == EVENT_CHANNEL) - { - - header += "header.channelType = 'Event';\n"; - } - else - { - header += "header.channelType = 'Continuous';\n"; - } - - header += "header.sampleRate = "; - // all channels need to have the same sample rate under the current scheme - header += String(channelPointers[0]->sampleRate); - header += ";\n"; - header += "header.blockLength = "; - header += BLOCK_LENGTH; - header += ";\n"; - header += "header.bufferSize = "; - header += getAudioComponent()->getBufferSize(); - header += ";\n"; - header += "header.bitVolts = "; - header += String(ch->bitVolts); - header += ";\n"; - - header = header.paddedRight(' ', HEADER_SIZE); - - //std::cout << header << std::endl; - - return header; - -} - void RecordNode::closeAllFiles() { if (allFilesOpened) { - for (int i = 0; i < channelPointers.size(); i++) - { - if (channelPointers[i]->getRecordState()) - { - - if (blockIndex < BLOCK_LENGTH) - { - // fill out the rest of the current buffer - writeContinuousBuffer(zeroBuffer.getReadPointer(0), BLOCK_LENGTH - blockIndex, i); - } - - closeFile(channelPointers[i]); - } - } - - closeFile(eventChannel); - blockIndex = 0; // back to the beginning of the block + EVERY_ENGINE->closeFiles(); allFilesOpened = false; } } bool RecordNode::enable() { + if (hasRecorded) + { + hasRecorded = false; + experimentNumber++; + } + //When starting a recording, if a new directory is needed it gets rewritten. Else is incremented by one. + recordingNumber = -1; + EVERY_ENGINE->startAcquisition(); isProcessing = true; return true; } @@ -655,132 +466,15 @@ float RecordNode::getFreeSpace() return 1.0f - float(dataDirectory.getBytesFreeOnVolume())/float(dataDirectory.getVolumeTotalSize()); } -void RecordNode::writeContinuousBuffer(const float* data, int nSamples, int channel) -{ - - // check to see if the file exists - if (channelPointers[channel]->file == NULL) - return; - - // scale the data back into the range of int16 - float scaleFactor = float(0x7fff) * channelPointers[channel]->bitVolts; - for (int n = 0; n < nSamples; n++) - { - *(continuousDataFloatBuffer+n) = *(data+n) / scaleFactor; - } - AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples); - - if (blockIndex == 0) - { - writeTimestampAndSampleCount(channelPointers[channel]->file); - } - - diskWriteLock.enter(); - - size_t count = fwrite(continuousDataIntegerBuffer, // ptr - 2, // size of each element - nSamples, // count - channelPointers[channel]->file); // ptr to FILE object - - jassert(count == nSamples); // make sure all the data was written - - diskWriteLock.exit(); - - if (blockIndex + nSamples == BLOCK_LENGTH) - { - writeRecordMarker(channelPointers[channel]->file); - } - -} - -void RecordNode::writeTimestampAndSampleCount(FILE* file) -{ - - - diskWriteLock.enter(); - - uint16 samps = BLOCK_LENGTH; - - fwrite(×tamp, // ptr - 8, // size of each element - 1, // count - file); // ptr to FILE object - - fwrite(&samps, // ptr - 2, // size of each element - 1, // count - file); // ptr to FILE object - - fwrite(&recordingNumber, // ptr - 2, // size of each element - 1, // count - file); // ptr to FILE object - - diskWriteLock.exit(); - -} - -void RecordNode::writeRecordMarker(FILE* file) -{ - // write a 10-byte marker indicating the end of a record - - diskWriteLock.enter(); - fwrite(recordMarker, // ptr - 1, // size of each element - 10, // count - file); // ptr to FILE object - - diskWriteLock.exit(); - -} - -void RecordNode::writeEventBuffer(MidiMessage& event, int samplePosition) //, int node, int channel) -{ - // find file and write samples to disk - // std::cout << "Received event!" << std::endl; - - if (eventChannel->file == NULL) - return; - - const uint8* dataptr = event.getRawData(); - - if (event.getNoteNumber() > 0) // processor ID > 0 - { - uint64 samplePos = (uint64) samplePosition; - - int64 eventTimestamp = timestamp + samplePos; // add the sample position to the buffer timestamp - - diskWriteLock.enter(); - - fwrite(&eventTimestamp, // ptr - 8, // size of each element - 1, // count - eventChannel->file); // ptr to FILE object - - fwrite(&samplePos, // ptr - 2, // size of each element - 1, // count - eventChannel->file); // ptr to FILE object - - // write 1st four bytes of event (type, nodeId, eventId, eventChannel) - fwrite(dataptr, 1, 4, eventChannel->file); - - // write recording number - fwrite(&recordingNumber, // ptr - 2, // size of each element - 1, // count - eventChannel->file); // ptr to FILE object - - diskWriteLock.exit(); - } - -} void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePosition) { if (eventType == TTL) { - writeEventBuffer(event, samplePosition); + if (event.getNoteNumber() > 0) // processor ID > 0 + { + EVERY_ENGINE->writeEvent(eventType, event, samplePosition); + } } else if (eventType == TIMESTAMP) { @@ -797,6 +491,7 @@ void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePositi // (int) *(dataptr + 4) << std::endl; memcpy(×tamp, dataptr + 4, 8); // remember to skip first four bytes + EVERY_ENGINE->updateTimeStamp(timestamp); } } @@ -806,81 +501,16 @@ void RecordNode::process(AudioSampleBuffer& buffer, int& nSamples) { - // TERMINOLOGY: - // buffer -- incoming data stored in AudioSampleBuffer (nSamples long) - // block -- 1024-sample sequence for disk writing (BLOCK_LENGTH long) - // samplesWritten -- number of samples written from the current buffer - // blockIndex -- index within the current block (used outside this function) - // numSamplesToWrite -- number of unwritten samples from the buffer - - // CONSTRAINTS: - // samplesWritten must equal nSamples by the end of the process() method - if (isRecording && allFilesOpened) { // FIRST: cycle through events -- extract the TTLs and the timestamps checkForEvents(events); - // SECOND: cycle through buffer channels - int samplesWritten = 0; - + // SECOND: write channel data if (channelPointers.size() > 0) { - - while (samplesWritten < nSamples) // there are still unwritten samples in the buffer - { - - int numSamplesToWrite = nSamples - samplesWritten; // samples remaining in the buffer - - if (blockIndex + numSamplesToWrite < BLOCK_LENGTH) // we still have space in this block - { - - for (int i = 0; i < buffer.getNumChannels(); i++) - { - - if (channelPointers[i]->getRecordState()) - { - // write buffer to disk! - writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), - numSamplesToWrite, - i); - - } - } - - // update our variables - samplesWritten += numSamplesToWrite; - timestamp += numSamplesToWrite; - blockIndex += numSamplesToWrite; - - } - else // there's not enough space left in this block for all remaining samples - { - - numSamplesToWrite = BLOCK_LENGTH - blockIndex; - - for (int i = 0; i < buffer.getNumChannels(); i++) - { - - if (channelPointers[i]->getRecordState()) - { - // write buffer to disk! - writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), - numSamplesToWrite, - i); - - //std::cout << "Record channel " << i << std::endl; - } - } - - // update our variables - samplesWritten += numSamplesToWrite; - timestamp += numSamplesToWrite; - blockIndex = 0; // back to the beginning of the block - - } - } + EVERY_ENGINE->writeData(buffer,nSamples); } // std::cout << nSamples << " " << samplesWritten << " " << blockIndex << std::endl; @@ -898,3 +528,46 @@ void RecordNode::process(AudioSampleBuffer& buffer, } } + +void RecordNode::registerProcessor(GenericProcessor* sourceNode) +{ + EVERY_ENGINE->registerProcessor(sourceNode); +} + +Channel* RecordNode::getDataChannel(int index) +{ + return channelPointers[index]; +} + +void RecordNode::registerRecordEngine(RecordEngine* engine) +{ + engineArray.add(engine); +} + +void RecordNode::registerSpikeSource(GenericProcessor* processor) +{ + EVERY_ENGINE->registerSpikeSource(processor); +} + +int RecordNode::addSpikeElectrode(SpikeRecordInfo* elec) +{ + elec->recordIndex=spikeElectrodeIndex; + spikeElectrodePointers.add(elec); + EVERY_ENGINE->addSpikeElectrode(spikeElectrodeIndex,elec); + return spikeElectrodeIndex++; +} + +void RecordNode::writeSpike(SpikeObject& spike, int electrodeIndex) +{ + EVERY_ENGINE->writeSpike(spike,electrodeIndex); +} + +SpikeRecordInfo* RecordNode::getSpikeElectrode(int index) +{ + return spikeElectrodePointers[index]; +} + +void RecordNode::clearRecordEngines() +{ + engineArray.clear(); +} diff --git a/Source/Processors/RecordNode.h b/Source/Processors/RecordNode.h index 5748690290ea80974ff543e7b743fb67d5ba59a9..ab8b3c7a39715bb81d54682b69fd3f3ef5a87a2d 100755 --- a/Source/Processors/RecordNode.h +++ b/Source/Processors/RecordNode.h @@ -23,8 +23,6 @@ #ifndef __RECORDNODE_H_FB9B1CA7__ #define __RECORDNODE_H_FB9B1CA7__ - - #include "../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> #include <map> @@ -32,6 +30,9 @@ #include "GenericProcessor.h" #include "Channel.h" +#include "RecordEngine.h" + + #define HEADER_SIZE 1024 #define BLOCK_LENGTH 1024 @@ -71,6 +72,11 @@ public: */ void setParameter(int parameterIndex, float newValue); + /** Called by the processor graph for each processor that could record data + */ + void registerProcessor(GenericProcessor* sourceNode); + /** Called by the processor graph for each recordable channel + */ void addInputChannel(GenericProcessor* sourceNode, int chan); bool enable(); @@ -82,6 +88,10 @@ public: /** update channel name */ void updateChannelName(int channelIndex, String newname); + /** Get channel stored in channelPointers array + */ + Channel* getDataChannel(int index); + /** Called by the ControlPanel to determine the amount of space left in the current dataDirectory. */ @@ -109,21 +119,36 @@ public: */ 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() { return rootFolder; } + /** Adds a Record Engine to use + */ + void registerRecordEngine(RecordEngine* engine); + + /** Clears the list of active Record Engines + */ + void clearRecordEngines(); + + /** Must be called by a spike recording source on the "enable" method + */ + void registerSpikeSource(GenericProcessor* processor); + + /** Registers an electrode group for spike recording + Must be called by a spike recording source on the "enable" method + after the call to registerSpikeSource + */ + int addSpikeElectrode(SpikeRecordInfo* elec); + + /** Called by a spike recording source to write a spike to file + */ + void writeSpike(SpikeObject& spike, int electrodeIndex); + + SpikeRecordInfo* getSpikeElectrode(int index); + /** Signals when to create a new data directory when recording starts.*/ bool newDirectoryNeeded; @@ -133,12 +158,6 @@ public: /** Generate a Matlab-compatible datestring */ String generateDateString(); - CriticalSection* getLock() - { - return &diskWriteLock; - } - - private: /** Keep the RecordNode informed of acquisition and record states. @@ -154,25 +173,11 @@ private: */ File rootFolder; - /** Holds data that has been converted from float to int16 before - saving. - */ - int16* continuousDataIntegerBuffer; - - /** Holds data that has been converted from float to int16 before - saving. - */ - float* continuousDataFloatBuffer; - - AudioSampleBuffer zeroBuffer; /** Integer timestamp saved for each buffer. */ int64 timestamp; - /** Integer to keep track of the number samples written in each block */ - int blockIndex; - /** Integer to keep track of number of recording sessions in the same file */ uint16 recordingNumber; @@ -180,12 +185,6 @@ private: */ Time timer; - /** Opens a single file */ - void openFile(Channel* ch); - - /** Closes a single file */ - void closeFile(Channel* ch); - /** Closes all open files after recording has finished. */ void closeAllFiles(); @@ -196,16 +195,17 @@ private: /** Pointers to all event channels */ Array<Channel*> eventChannelPointers; - /** Generates a header for a given channel */ - String generateHeader(Channel* ch); + OwnedArray<SpikeRecordInfo> spikeElectrodePointers; + + int spikeElectrodeIndex; + + int experimentNumber; + bool hasRecorded; /** Generates a default directory name, based on the current date and time */ String generateDirectoryName(); - /** Generate filename for a given channel */ - void updateFileName(Channel* ch); - /** Cycle through the event buffer, looking for data to save */ void handleEvent(int eventType, MidiMessage& event, int samplePos); @@ -234,6 +234,10 @@ private: bool appendTrialNum; int trialNum; + /**RecordEngines loaded**/ + OwnedArray<RecordEngine> engineArray; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordNode); }; diff --git a/Source/Processors/SpikeDisplayNode.cpp b/Source/Processors/SpikeDisplayNode.cpp index acad76c45a52e01186c98a093ee21bfd7d7bbecd..6de204f29a1f19fdd831b20a323727375b141d5a 100755 --- a/Source/Processors/SpikeDisplayNode.cpp +++ b/Source/Processors/SpikeDisplayNode.cpp @@ -30,15 +30,11 @@ SpikeDisplayNode::SpikeDisplayNode() - : GenericProcessor("Spike Viewer"), displayBufferSize(5), redrawRequested(false), isRecording(false), - signalFilesShouldClose(false) + : GenericProcessor("Spike Viewer"), displayBufferSize(5), redrawRequested(false), + isRecording(false) { - spikeBuffer = new uint8_t[MAX_SPIKE_BUFFER_LEN]; // MAX_SPIKE_BUFFER_LEN defined in SpikeObject.h - - recordingNumber = -1; - } SpikeDisplayNode::~SpikeDisplayNode() @@ -60,7 +56,6 @@ void SpikeDisplayNode::updateSettings() //std::cout << "Setting num inputs on SpikeDisplayNode to " << getNumInputs() << std::endl; electrodes.clear(); - for (int i = 0; i < eventChannels.size(); i++) { if ((eventChannels[i]->eventType < 999) && (eventChannels[i]->eventType > SPIKE_BASE_CODE)) @@ -79,12 +74,10 @@ void SpikeDisplayNode::updateSettings() } electrodes.add(elec); + } } - recordNode = getProcessorGraph()->getRecordNode(); - diskWriteLock = recordNode->getLock(); - } // void SpikeDisplayNode::updateVisualizer() @@ -96,6 +89,18 @@ bool SpikeDisplayNode::enable() { std::cout << "SpikeDisplayNode::enable()" << std::endl; SpikeDisplayEditor* editor = (SpikeDisplayEditor*) getEditor(); + + getProcessorGraph()->getRecordNode()->registerSpikeSource(this); + for (int i = 0; i < electrodes.size(); i ++) + { + Electrode& elec = electrodes.getReference(i); + SpikeRecordInfo *recElec = new SpikeRecordInfo(); + recElec->name = elec.name; + recElec->numChannels = elec.numChannels; + recElec->sampleRate = settings.sampleRate; + elec.recordIndex = getProcessorGraph()->getRecordNode()->addSpikeElectrode(recElec); + } + editor->enable(); return true; @@ -175,28 +180,12 @@ void SpikeDisplayNode::setParameter(int param, float val) if (param == 0) // stop recording { isRecording = false; - signalFilesShouldClose = true; } else if (param == 1) // start recording { isRecording = true; - dataDirectory = recordNode->getDataDirectory(); - - if (dataDirectory.getFullPathName().length() == 0) - { - // temporary fix in case nothing is returned by the record node. - dataDirectory = File::getSpecialLocation(File::userHomeDirectory); - } - - baseDirectory = dataDirectory.getFullPathName(); - - for (int i = 0; i < getNumElectrodes(); i++) - { - openFile(i); - } - } else if (param == 2) // redraw { @@ -213,16 +202,6 @@ void SpikeDisplayNode::process(AudioSampleBuffer& buffer, MidiBuffer& events, in checkForEvents(events); // automatically calls 'handleEvent - if (signalFilesShouldClose) - { - for (int i = 0; i < getNumElectrodes(); i++) - { - closeFile(i); - } - - signalFilesShouldClose = false; - } - if (redrawRequested) { // update incoming thresholds @@ -304,7 +283,7 @@ void SpikeDisplayNode::handleEvent(int eventType, MidiMessage& event, int sample // save spike if (isRecording) { - writeSpike(newSpike, electrodeNum); + getProcessorGraph()->getRecordNode()->writeSpike(newSpike,e.recordIndex); } } @@ -333,139 +312,3 @@ bool SpikeDisplayNode::checkThreshold(int chan, float thresh, SpikeObject& s) return false; } - -void SpikeDisplayNode::openFile(int i) -{ - - String filename = baseDirectory; - filename += File::separator; - filename += getNameForElectrode(i).removeCharacters(" "); - filename += ".spikes"; - - std::cout << "OPENING FILE: " << filename << std::endl; - - File fileToUse = File(filename); - - diskWriteLock->enter(); - //const MessageManagerLock mmLock; - - Electrode& e = electrodes.getReference(i); - - FILE* file; - - if (!fileToUse.exists()) - { - // open it and write header - - if (i == 0) - { - recordingNumber = 0; - } - - file = fopen(filename.toUTF8(), "ab"); - String header = generateHeader(i); - fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), file); - - } - else - { - // append it - if (i == 0) - { - recordingNumber++; - } - - file = fopen(filename.toUTF8(), "ab"); - } - - diskWriteLock->exit(); - - e.file = file; -} - -void SpikeDisplayNode::closeFile(int i) -{ - - Electrode& e = electrodes.getReference(i); - - std::cout << "CLOSING FILE for " << e.name << std::endl; - - diskWriteLock->enter(); - - if (e.file != NULL) - { - fclose(e.file); - } - - diskWriteLock->exit(); - -} - -void SpikeDisplayNode::writeSpike(const SpikeObject& s, int i) -{ - - packSpike(&s, spikeBuffer, MAX_SPIKE_BUFFER_LEN); - - int totalBytes = s.nSamples * s.nChannels * 2 + // account for samples - s.nChannels * 4 + // acount for threshold and gain - 15; // 15 bytes in every SpikeObject - - - // format: - // 1 byte of event type (always = 4 for spikes) - // 8 bytes for 64-bit timestamp - // 2 bytes for 16-bit electrode ID - // 2 bytes for 16-bit number of channels (n) - // 2 bytes for 16-bit number of samples (m) - // 2*n*m bytes for 16-bit samples - // 2*n bytes for 16-bit gains - // 2*n bytes for 16-bit thresholds - - // const MessageManagerLock mmLock; - - diskWriteLock->enter(); - - fwrite(spikeBuffer, 1, totalBytes, electrodes[i].file); - - fwrite(&recordingNumber, // ptr - 2, // size of each element - 1, // count - electrodes[i].file); // ptr to FILE object - - diskWriteLock->exit(); - - -} - -String SpikeDisplayNode::generateHeader(int electrodeNum) -{ - String header = "header.format = 'Open Ephys Data Format'; \n"; - header += "header.version = 0.2;"; - header += "header.header_bytes = "; - header += String(HEADER_SIZE); - header += ";\n"; - - header += "header.description = 'Each record contains 1 uint8 eventType, 1 uint64 timestamp, 1 uint16 electrodeID, 1 uint16 numChannels (n), 1 uint16 numSamples (m), n*m uint16 samples, n uint16 channelGains, n uint16 thresholds, and 1 uint16 recordingNumber'; \n"; - - header += "header.date_created = '"; - header += recordNode->generateDateString(); - header += "';\n"; - - header += "header.electrode = '"; - header += electrodes[electrodeNum].name; - header += "';\n"; - - header += "header.num_channels = "; - header += electrodes[electrodeNum].numChannels; - header += ";\n"; - - header += "header.sampleRate = "; - header += String(settings.sampleRate); - header += ";\n"; - - header = header.paddedRight(' ', HEADER_SIZE); - - //std::cout << header << std::endl; - - return header; -} \ No newline at end of file diff --git a/Source/Processors/SpikeDisplayNode.h b/Source/Processors/SpikeDisplayNode.h index cbd08ce92b51b858b2662286e46806c1a6251b06..159dc69fddd75c33a280b7b2333f187743a49ce1 100755 --- a/Source/Processors/SpikeDisplayNode.h +++ b/Source/Processors/SpikeDisplayNode.h @@ -95,7 +95,7 @@ private: SpikePlot* spikePlot; - FILE* file; + int recordIndex; }; @@ -104,24 +104,18 @@ private: int displayBufferSize; bool redrawRequested; - // methods for recording: - void openFile(int index); - void closeFile(int index); - void writeSpike(const SpikeObject& s, int index); - String generateHeader(int index); - // members for recording bool isRecording; - bool signalFilesShouldClose; - RecordNode* recordNode; - String baseDirectory; - File dataDirectory; - uint8_t* spikeBuffer; - SpikeObject currentSpike; + // bool signalFilesShouldClose; + // RecordNode* recordNode; + // String baseDirectory; + // File dataDirectory; + // uint8_t* spikeBuffer; + // SpikeObject currentSpike; - uint16 recordingNumber; + // uint16 recordingNumber; - CriticalSection* diskWriteLock; +// CriticalSection* diskWriteLock; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpikeDisplayNode); diff --git a/Source/Processors/Utilities/RecordControl.cpp b/Source/Processors/Utilities/RecordControl.cpp index 8a440fd09f126569ae0ce5d3a63e6181b62129cf..b3ca5b019e3f32dc6a7252f140ed5f01a241a1ba 100644 --- a/Source/Processors/Utilities/RecordControl.cpp +++ b/Source/Processors/Utilities/RecordControl.cpp @@ -28,7 +28,7 @@ RecordControl::RecordControl() : GenericProcessor("Record Control"), - createNewFilesOnTrigger(false), triggerChannel(0), recordNode(0) + triggerChannel(0), recordNode(0) { } @@ -50,21 +50,6 @@ void RecordControl::setParameter(int parameterIndex, float newValue) { updateTriggerChannel((int) newValue); } - else - { - - if (newValue == 0.0) - { - createNewFilesOnTrigger = false; - - - } - else - { - createNewFilesOnTrigger = true; - } - //recordNode->appendTrialNumber(createNewFilesOnTrigger); - } } void RecordControl::updateTriggerChannel(int newChannel) @@ -77,7 +62,7 @@ bool RecordControl::enable() if (recordNode == 0) recordNode = getProcessorGraph()->getRecordNode(); - recordNode->appendTrialNumber(createNewFilesOnTrigger); + //recordNode->appendTrialNumber(createNewFilesOnTrigger); return true; } @@ -108,10 +93,6 @@ 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 594c8d04acb2eb421c592da49f0278de3f89d072..abd7b8a9c33d39133dc56b4161dc70f6ec8e4251 100644 --- a/Source/Processors/Utilities/RecordControl.h +++ b/Source/Processors/Utilities/RecordControl.h @@ -49,8 +49,6 @@ public: void handleEvent(int eventType, MidiMessage& event, int); bool enable(); - bool createNewFilesOnTrigger; - bool isUtility() { return true; diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp index 5034b7d898d4ce13e6aa1bb32ba98e905cb78881..b1ec75f41b235c3cddf3f2765515e0656e03077e 100755 --- a/Source/UI/ControlPanel.cpp +++ b/Source/UI/ControlPanel.cpp @@ -1,23 +1,23 @@ /* - ------------------------------------------------------------------ +------------------------------------------------------------------ - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys +This file is part of the Open Ephys GUI +Copyright (C) 2013 Open Ephys - ------------------------------------------------------------------ +------------------------------------------------------------------ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. - 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 for more details. +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 for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -25,33 +25,35 @@ #include "UIComponent.h" #include <stdio.h> #include <math.h> +#include "../Processors/OriginalRecording.h" +#include "../Processors/HDF5Recording.h" PlayButton::PlayButton() - : DrawableButton("PlayButton", DrawableButton::ImageFitted) + : DrawableButton("PlayButton", DrawableButton::ImageFitted) { - DrawablePath normal, over, down; + DrawablePath normal, over, down; - Path p; - p.addTriangle(0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f); - normal.setPath(p); - normal.setFill(Colours::lightgrey); - normal.setStrokeThickness(0.0f); + Path p; + p.addTriangle(0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f); + normal.setPath(p); + normal.setFill(Colours::lightgrey); + normal.setStrokeThickness(0.0f); - over.setPath(p); - over.setFill(Colours::black); - over.setStrokeFill(Colours::black); - over.setStrokeThickness(5.0f); + over.setPath(p); + over.setFill(Colours::black); + over.setStrokeFill(Colours::black); + over.setStrokeThickness(5.0f); - down.setPath(p); - down.setFill(Colours::pink); - down.setStrokeFill(Colours::pink); - down.setStrokeThickness(5.0f); + down.setPath(p); + down.setFill(Colours::pink); + down.setStrokeFill(Colours::pink); + down.setStrokeThickness(5.0f); - setImages(&normal, &over, &over); - // setBackgroundColours(Colours::darkgrey, Colours::yellow); - setClickingTogglesState(true); - setTooltip("Start/stop acquisition"); + setImages(&normal, &over, &over); + // setBackgroundColours(Colours::darkgrey, Colours::yellow); + setClickingTogglesState(true); + setTooltip("Start/stop acquisition"); } @@ -61,26 +63,26 @@ PlayButton::~PlayButton() } RecordButton::RecordButton() - : DrawableButton("RecordButton", DrawableButton::ImageFitted) + : DrawableButton("RecordButton", DrawableButton::ImageFitted) { - DrawablePath normal, over, down; + DrawablePath normal, over, down; - Path p; - p.addEllipse(0.0,0.0,20.0,20.0); - normal.setPath(p); - normal.setFill(Colours::lightgrey); - normal.setStrokeThickness(0.0f); + Path p; + p.addEllipse(0.0,0.0,20.0,20.0); + normal.setPath(p); + normal.setFill(Colours::lightgrey); + normal.setStrokeThickness(0.0f); - over.setPath(p); - over.setFill(Colours::black); - over.setStrokeFill(Colours::black); - over.setStrokeThickness(5.0f); + over.setPath(p); + over.setFill(Colours::black); + over.setStrokeFill(Colours::black); + over.setStrokeThickness(5.0f); - setImages(&normal, &over, &over); - //setBackgroundColours(Colours::darkgrey, Colours::red); - setClickingTogglesState(true); - setTooltip("Start/stop writing to disk"); + setImages(&normal, &over, &over); + //setBackgroundColours(Colours::darkgrey, Colours::red); + setClickingTogglesState(true); + setTooltip("Start/stop writing to disk"); } RecordButton::~RecordButton() @@ -91,14 +93,14 @@ RecordButton::~RecordButton() CPUMeter::CPUMeter() : Label("CPU Meter","0.0"), cpu(0.0f), lastCpu(0.0f) { - font = Font("Small Text", 12, Font::plain); + font = Font("Small Text", 12, Font::plain); - // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); - // Typeface::Ptr typeface = new CustomTypeface(mis); - // font = Font(typeface); - // font.setHeight(12); + // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); + // Typeface::Ptr typeface = new CustomTypeface(mis); + // font = Font(typeface); + // font.setHeight(12); - setTooltip("CPU usage"); + setTooltip("CPU usage"); } CPUMeter::~CPUMeter() @@ -107,22 +109,22 @@ CPUMeter::~CPUMeter() void CPUMeter::updateCPU(float usage) { - lastCpu = cpu; - cpu = usage; + lastCpu = cpu; + cpu = usage; } void CPUMeter::paint(Graphics& g) { - g.fillAll(Colours::grey); + g.fillAll(Colours::grey); - g.setColour(Colours::yellow); - g.fillRect(0.0f,0.0f,getWidth()*cpu,float(getHeight())); + g.setColour(Colours::yellow); + g.fillRect(0.0f,0.0f,getWidth()*cpu,float(getHeight())); - g.setColour(Colours::black); - g.drawRect(0,0,getWidth(),getHeight(),1); + g.setColour(Colours::black); + g.drawRect(0,0,getWidth(),getHeight(),1); - g.setFont(font); - g.drawSingleLineText("CPU",65,12); + g.setFont(font); + g.drawSingleLineText("CPU",65,12); } @@ -131,14 +133,14 @@ DiskSpaceMeter::DiskSpaceMeter() { - font = Font("Small Text", 12, Font::plain); + font = Font("Small Text", 12, Font::plain); - // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); - // Typeface::Ptr typeface = new CustomTypeface(mis); - // font = Font(typeface); - // font.setHeight(12); + // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); + // Typeface::Ptr typeface = new CustomTypeface(mis); + // font = Font(typeface); + // font.setHeight(12); - setTooltip("Disk space available"); + setTooltip("Disk space available"); } @@ -148,38 +150,38 @@ DiskSpaceMeter::~DiskSpaceMeter() void DiskSpaceMeter::updateDiskSpace(float percent) { - diskFree = percent; + diskFree = percent; } void DiskSpaceMeter::paint(Graphics& g) { - g.fillAll(Colours::grey); + g.fillAll(Colours::grey); - g.setColour(Colours::lightgrey); - if (diskFree > 0) - g.fillRect(0.0f,0.0f,getWidth()*diskFree,float(getHeight())); + g.setColour(Colours::lightgrey); + if (diskFree > 0) + g.fillRect(0.0f,0.0f,getWidth()*diskFree,float(getHeight())); - g.setColour(Colours::black); - g.drawRect(0,0,getWidth(),getHeight(),1); + g.setColour(Colours::black); + g.drawRect(0,0,getWidth(),getHeight(),1); - g.setFont(font); - g.drawSingleLineText("DF",75,12); + g.setFont(font); + g.drawSingleLineText("DF",75,12); } Clock::Clock() : isRunning(false), isRecording(false) { - clockFont = Font("Default Light", 30, Font::plain); + clockFont = Font("Default Light", 30, Font::plain); - // MemoryInputStream mis(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false); - // Typeface::Ptr typeface = new CustomTypeface(mis); - // clockFont = Font(typeface); - // clockFont.setHeight(30); + // MemoryInputStream mis(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false); + // Typeface::Ptr typeface = new CustomTypeface(mis); + // clockFont = Font(typeface); + // clockFont.setHeight(30); - totalTime = 0; - totalRecordTime = 0; + totalTime = 0; + totalRecordTime = 0; } @@ -190,117 +192,117 @@ Clock::~Clock() void Clock::paint(Graphics& g) { - if (isRecording) - { - g.fillAll(Colour(255,0,0)); - } - else - { - g.fillAll(Colour(58,58,58)); - } + if (isRecording) + { + g.fillAll(Colour(255,0,0)); + } + else + { + g.fillAll(Colour(58,58,58)); + } - drawTime(g); + drawTime(g); } void Clock::drawTime(Graphics& g) { - if (isRunning) - { - int64 now = Time::currentTimeMillis(); - int64 diff = now - lastTime; - totalTime += diff; + if (isRunning) + { + int64 now = Time::currentTimeMillis(); + int64 diff = now - lastTime; + totalTime += diff; - if (isRecording) - { - totalRecordTime += diff; - } + if (isRecording) + { + totalRecordTime += diff; + } - lastTime = Time::currentTimeMillis(); - } + lastTime = Time::currentTimeMillis(); + } - int m; - int s; + int m; + int s; - if (isRecording) - { - g.setColour(Colours::black); - m = floor(totalRecordTime/60000.0); - s = floor((totalRecordTime - m*60000.0)/1000.0); + if (isRecording) + { + g.setColour(Colours::black); + m = floor(totalRecordTime/60000.0); + s = floor((totalRecordTime - m*60000.0)/1000.0); - } - else - { + } + else + { - if (isRunning) - g.setColour(Colours::yellow); - else - g.setColour(Colours::white); + if (isRunning) + g.setColour(Colours::yellow); + else + g.setColour(Colours::white); - m = floor(totalTime/60000.0); - s = floor((totalTime - m*60000.0)/1000.0); - } + m = floor(totalTime/60000.0); + s = floor((totalTime - m*60000.0)/1000.0); + } - String timeString = ""; + String timeString = ""; - timeString += m; - timeString += " min "; - timeString += s; - timeString += " s"; + timeString += m; + timeString += " min "; + timeString += s; + timeString += " s"; - g.setFont(clockFont); - //g.setFont(30); - g.drawText(timeString, 0, 0, getWidth(), getHeight(), Justification::left, false); + g.setFont(clockFont); + //g.setFont(30); + g.drawText(timeString, 0, 0, getWidth(), getHeight(), Justification::left, false); } void Clock::start() { - if (!isRunning) - { - isRunning = true; - lastTime = Time::currentTimeMillis(); - } + if (!isRunning) + { + isRunning = true; + lastTime = Time::currentTimeMillis(); + } } void Clock::resetRecordTime() { - totalRecordTime = 0; + totalRecordTime = 0; } void Clock::startRecording() { - if (!isRecording) - { - isRecording = true; - start(); - } + if (!isRecording) + { + isRecording = true; + start(); + } } void Clock::stop() { - if (isRunning) - { - isRunning = false; - isRecording = false; - } + if (isRunning) + { + isRunning = false; + isRecording = false; + } } void Clock::stopRecording() { - if (isRecording) - { - isRecording = false; - } + if (isRecording) + { + isRecording = false; + } } ControlPanelButton::ControlPanelButton(ControlPanel* cp_) : cp(cp_) { - open = false; + open = false; - setTooltip("Show/hide recording options"); + setTooltip("Show/hide recording options"); } ControlPanelButton::~ControlPanelButton() @@ -310,150 +312,156 @@ ControlPanelButton::~ControlPanelButton() void ControlPanelButton::paint(Graphics& g) { - //g.fillAll(Colour(58,58,58)); + //g.fillAll(Colour(58,58,58)); - g.setColour(Colours::white); + g.setColour(Colours::white); - Path p; + Path p; - float h = getHeight(); - float w = getWidth(); + float h = getHeight(); + float w = getWidth(); - if (open) - { - p.addTriangle(0.5f*w, 0.8f*h, - 0.2f*w, 0.2f*h, - 0.8f*w, 0.2f*h); - } - else - { - p.addTriangle(0.8f*w, 0.8f*h, - 0.2f*w, 0.5f*h, - 0.8f*w, 0.2f*h); - } + if (open) + { + p.addTriangle(0.5f*w, 0.8f*h, + 0.2f*w, 0.2f*h, + 0.8f*w, 0.2f*h); + } + else + { + p.addTriangle(0.8f*w, 0.8f*h, + 0.2f*w, 0.5f*h, + 0.8f*w, 0.2f*h); + } - PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded); + PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded); - g.strokePath(p, pst); + g.strokePath(p, pst); } void ControlPanelButton::mouseDown(const MouseEvent& e) { - open = !open; - cp->openState(open); - repaint(); + open = !open; + cp->openState(open); + repaint(); } void ControlPanelButton::toggleState() { - open = !open; - repaint(); + open = !open; + repaint(); } void ControlPanelButton::setState(bool b) { - open = b; - repaint(); + open = b; + repaint(); } ControlPanel::ControlPanel(ProcessorGraph* graph_, AudioComponent* audio_) - : graph(graph_), audio(audio_), initialize(true), open(false) + : graph(graph_), audio(audio_), initialize(true), open(false) { - if (1) - { + if (1) + { - font = Font("Paragraph", 13, Font::plain); + font = Font("Paragraph", 13, Font::plain); - // MemoryInputStream mis(BinaryData::misoserialized, BinaryData::misoserializedSize, false); - // Typeface::Ptr typeface = new CustomTypeface(mis); - // font = Font(typeface); - // font.setHeight(15); - } + // MemoryInputStream mis(BinaryData::misoserialized, BinaryData::misoserializedSize, false); + // Typeface::Ptr typeface = new CustomTypeface(mis); + // font = Font(typeface); + // font.setHeight(15); + } - audioEditor = (AudioEditor*) graph->getAudioNode()->createEditor(); - addAndMakeVisible(audioEditor); + audioEditor = (AudioEditor*) graph->getAudioNode()->createEditor(); + addAndMakeVisible(audioEditor); - playButton = new PlayButton(); - playButton->addListener(this); - addAndMakeVisible(playButton); + playButton = new PlayButton(); + playButton->addListener(this); + addAndMakeVisible(playButton); - recordButton = new RecordButton(); - recordButton->addListener(this); - addAndMakeVisible(recordButton); + recordButton = new RecordButton(); + recordButton->addListener(this); + addAndMakeVisible(recordButton); - masterClock = new Clock(); - addAndMakeVisible(masterClock); + masterClock = new Clock(); + addAndMakeVisible(masterClock); - cpuMeter = new CPUMeter(); - addAndMakeVisible(cpuMeter); + cpuMeter = new CPUMeter(); + addAndMakeVisible(cpuMeter); - diskMeter = new DiskSpaceMeter(); - addAndMakeVisible(diskMeter); + diskMeter = new DiskSpaceMeter(); + addAndMakeVisible(diskMeter); - cpb = new ControlPanelButton(this); - addAndMakeVisible(cpb); + cpb = new ControlPanelButton(this); + addAndMakeVisible(cpb); - newDirectoryButton = new UtilityButton("+", Font("Small Text", 15, Font::plain)); - newDirectoryButton->setEnabledState(false); - newDirectoryButton->addListener(this); - newDirectoryButton->setTooltip("Start a new data directory"); - addChildComponent(newDirectoryButton); + recordSelector = new ComboBox(); + recordSelector->addListener(this); + recordSelector->addItem("OpenEphys",1); + recordSelector->addItem("HDF5",2); + addChildComponent(recordSelector); + newDirectoryButton = new UtilityButton("+", Font("Small Text", 15, Font::plain)); + newDirectoryButton->setEnabledState(false); + newDirectoryButton->addListener(this); + newDirectoryButton->setTooltip("Start a new data directory"); + addChildComponent(newDirectoryButton); - File executable = File::getSpecialLocation(File::currentExecutableFile); + + File executable = File::getSpecialLocation(File::currentExecutableFile); #if defined(__APPLE__) - const String executableDirectory = - executable.getParentDirectory().getParentDirectory().getParentDirectory().getParentDirectory().getFullPathName(); + const String executableDirectory = + executable.getParentDirectory().getParentDirectory().getParentDirectory().getParentDirectory().getFullPathName(); #else - const String executableDirectory = executable.getParentDirectory().getFullPathName(); + const String executableDirectory = executable.getParentDirectory().getFullPathName(); #endif - filenameComponent = new FilenameComponent("folder selector", - executableDirectory, - true, - true, - true, - "*", - "", - ""); - addChildComponent(filenameComponent); + filenameComponent = new FilenameComponent("folder selector", + executableDirectory, + true, + true, + true, + "*", + "", + ""); + addChildComponent(filenameComponent); - prependText = new Label("Prepend",""); - prependText->setEditable(true); - prependText->addListener(this); - prependText->setColour(Label::backgroundColourId, Colours::lightgrey); - prependText->setTooltip("Prepend to name of data directory"); + prependText = new Label("Prepend",""); + prependText->setEditable(true); + prependText->addListener(this); + prependText->setColour(Label::backgroundColourId, Colours::lightgrey); + prependText->setTooltip("Prepend to name of data directory"); - addChildComponent(prependText); + addChildComponent(prependText); - dateText = new Label("Date","YYYY-MM-DD_HH-MM-SS"); - dateText->setColour(Label::backgroundColourId, Colours::lightgrey); - dateText->setColour(Label::textColourId, Colours::grey); - addChildComponent(dateText); + dateText = new Label("Date","YYYY-MM-DD_HH-MM-SS"); + dateText->setColour(Label::backgroundColourId, Colours::lightgrey); + dateText->setColour(Label::textColourId, Colours::grey); + addChildComponent(dateText); - appendText = new Label("Append",""); - appendText->setEditable(true); - appendText->addListener(this); - appendText->setColour(Label::backgroundColourId, Colours::lightgrey); - addChildComponent(appendText); - appendText->setTooltip("Append to name of data directory"); + appendText = new Label("Append",""); + appendText->setEditable(true); + appendText->addListener(this); + appendText->setColour(Label::backgroundColourId, Colours::lightgrey); + addChildComponent(appendText); + appendText->setTooltip("Append to name of data directory"); - //diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); - //diskMeter->repaint(); - //refreshMeters(); - startTimer(10); + //diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); + //diskMeter->repaint(); + //refreshMeters(); + startTimer(10); - setWantsKeyboardFocus(true); + setWantsKeyboardFocus(true); - backgroundColour = Colour(58,58,58); + backgroundColour = Colour(58,58,58); } @@ -465,336 +473,376 @@ ControlPanel::~ControlPanel() void ControlPanel::setRecordState(bool t) { - //MessageManager* mm = MessageManager::getInstance(); + //MessageManager* mm = MessageManager::getInstance(); - recordButton->setToggleState(t, sendNotification); + recordButton->setToggleState(t, sendNotification); } void ControlPanel::updateChildComponents() { - filenameComponent->addListener(getProcessorGraph()->getRecordNode()); - getProcessorGraph()->getRecordNode()->filenameComponentChanged(filenameComponent); + filenameComponent->addListener(getProcessorGraph()->getRecordNode()); + getProcessorGraph()->getRecordNode()->filenameComponentChanged(filenameComponent); + recordSelector->setSelectedId(1,sendNotificationSync); } void ControlPanel::createPaths() { - int w = getWidth() - 325; - if (w > 150) - w = 150; + /* int w = getWidth() - 325; + if (w > 150) + w = 150;*/ + + int w = getWidth() - 435; + if (w > 40) + w = 40; - int h1 = getHeight()-32; - int h2 = getHeight(); - int indent = 5; + int h1 = getHeight()-32; + int h2 = getHeight(); + int indent = 5; - p1.clear(); - p1.startNewSubPath(0, h1); - p1.lineTo(w, h1); - p1.lineTo(w + indent, h1 + indent); - p1.lineTo(w + indent, h2 - indent); - p1.lineTo(w + indent*2, h2); - p1.lineTo(0, h2); - p1.closeSubPath(); + p1.clear(); + p1.startNewSubPath(0, h1); + p1.lineTo(w, h1); + p1.lineTo(w + indent, h1 + indent); + p1.lineTo(w + indent, h2 - indent); + p1.lineTo(w + indent*2, h2); + p1.lineTo(0, h2); + p1.closeSubPath(); - p2.clear(); - p2.startNewSubPath(getWidth(), h2-indent); - p2.lineTo(getWidth(), h2); - p2.lineTo(getWidth()-indent, h2); - p2.closeSubPath(); + p2.clear(); + p2.startNewSubPath(getWidth(), h2-indent); + p2.lineTo(getWidth(), h2); + p2.lineTo(getWidth()-indent, h2); + p2.closeSubPath(); } void ControlPanel::paint(Graphics& g) { - g.setColour(backgroundColour); - g.fillRect(0,0,getWidth(),getHeight()); + g.setColour(backgroundColour); + g.fillRect(0,0,getWidth(),getHeight()); - if (open) - { - createPaths(); - g.setColour(Colours::black); - g.fillPath(p1); - g.fillPath(p2); - } + if (open) + { + createPaths(); + g.setColour(Colours::black); + g.fillPath(p1); + g.fillPath(p2); + } } void ControlPanel::resized() { - int w = getWidth(); - int h = 32; //getHeight(); - - if (playButton != 0) - { - if (w > 330) - playButton->setBounds(w-h*10,5,h-5,h-10); - \ - else - playButton->setBounds(5,5,h-5,h-10); - \ - } - - if (recordButton != 0) - { - if (w > 330) - recordButton->setBounds(w-h*9,5,h-5,h-10); - else - recordButton->setBounds(5+h,5,h-5,h-10); - } - - if (masterClock != 0) - { - if (w > 330) - masterClock->setBounds(w-h*7-15,0,h*7-15,h); - else - masterClock->setBounds(5+h*2+15,0,h*7-15,h); - } - - int offset1 = 750 - getWidth(); - if (offset1 > h) - offset1 = h; - - int offset2 = 570 - getWidth(); - if (offset2 > h) - offset2 = h; - - if (cpuMeter != 0) - { - - if (getWidth() < 750 && getWidth() >= 570) - cpuMeter->setBounds(8,h/4+offset1,h*3,h/2); - else if (getWidth() < 570) - cpuMeter->setBounds(8,h/4+offset1+offset2,h*3,h/2); - else - cpuMeter->setBounds(8,h/4,h*3,h/2); - } - - if (diskMeter != 0) - { - if (getWidth() < 750 && getWidth() >= 570) - diskMeter->setBounds(16+h*3,h/4+offset1,h*3,h/2); - else if (getWidth() < 570) - diskMeter->setBounds(16+h*3,h/4+offset1+offset2,h*3,h/2); - else - diskMeter->setBounds(16+h*3,h/4,h*3,h/2); - - } - - if (audioEditor != 0) - { - if (getWidth() < 750 && getWidth() >= 570) - audioEditor->setBounds(w-526,0,h*8,h); - else if (getWidth() < 570) - audioEditor->setBounds(8,0+offset2,h*8,h); - else - audioEditor->setBounds(h*7,0,h*8,h); - } - - - if (cpb != 0) - { - if (open) - cpb->setBounds(w-28,getHeight()-5-h*2+10,h-10,h-10); - else - cpb->setBounds(w-28,getHeight()-5-h+10,h-10,h-10); - } - - createPaths(); - - if (open) - { - int topBound = getHeight()-h+10-5; - - filenameComponent->setBounds(165, topBound, w-500, h-10); - filenameComponent->setVisible(true); - - newDirectoryButton->setBounds(w-h+4, topBound, h-10, h-10); - newDirectoryButton->setVisible(true); - - prependText->setBounds(165+w-490, topBound, 50, h-10); - prependText->setVisible(true); - - dateText->setBounds(165+w-435, topBound, 175, h-10); - dateText->setVisible(true); - - appendText->setBounds(165+w-255, topBound, 50, h-10); - appendText->setVisible(true); - - } - else - { - filenameComponent->setVisible(false); - newDirectoryButton->setVisible(false); - prependText->setVisible(false); - dateText->setVisible(false); - appendText->setVisible(false); - } - - repaint(); + int w = getWidth(); + int h = 32; //getHeight(); + + if (playButton != 0) + { + if (w > 330) + playButton->setBounds(w-h*10,5,h-5,h-10); + \ + else + playButton->setBounds(5,5,h-5,h-10); + \ + } + + if (recordButton != 0) + { + if (w > 330) + recordButton->setBounds(w-h*9,5,h-5,h-10); + else + recordButton->setBounds(5+h,5,h-5,h-10); + } + + if (masterClock != 0) + { + if (w > 330) + masterClock->setBounds(w-h*7-15,0,h*7-15,h); + else + masterClock->setBounds(5+h*2+15,0,h*7-15,h); + } + + int offset1 = 750 - getWidth(); + if (offset1 > h) + offset1 = h; + + int offset2 = 570 - getWidth(); + if (offset2 > h) + offset2 = h; + + if (cpuMeter != 0) + { + + if (getWidth() < 750 && getWidth() >= 570) + cpuMeter->setBounds(8,h/4+offset1,h*3,h/2); + else if (getWidth() < 570) + cpuMeter->setBounds(8,h/4+offset1+offset2,h*3,h/2); + else + cpuMeter->setBounds(8,h/4,h*3,h/2); + } + + if (diskMeter != 0) + { + if (getWidth() < 750 && getWidth() >= 570) + diskMeter->setBounds(16+h*3,h/4+offset1,h*3,h/2); + else if (getWidth() < 570) + diskMeter->setBounds(16+h*3,h/4+offset1+offset2,h*3,h/2); + else + diskMeter->setBounds(16+h*3,h/4,h*3,h/2); + + } + + if (audioEditor != 0) + { + if (getWidth() < 750 && getWidth() >= 570) + audioEditor->setBounds(w-526,0,h*8,h); + else if (getWidth() < 570) + audioEditor->setBounds(8,0+offset2,h*8,h); + else + audioEditor->setBounds(h*7,0,h*8,h); + } + + + if (cpb != 0) + { + if (open) + cpb->setBounds(w-28,getHeight()-5-h*2+10,h-10,h-10); + else + cpb->setBounds(w-28,getHeight()-5-h+10,h-10,h-10); + } + + createPaths(); + + if (open) + { + int topBound = getHeight()-h+10-5; + + recordSelector->setBounds((w - 435) > 40 ? 55 : w-430, topBound, 100, h-10); + recordSelector->setVisible(true); + + filenameComponent->setBounds(165, topBound, w-500, h-10); + filenameComponent->setVisible(true); + + newDirectoryButton->setBounds(w-h+4, topBound, h-10, h-10); + newDirectoryButton->setVisible(true); + + prependText->setBounds(165+w-490, topBound, 50, h-10); + prependText->setVisible(true); + + dateText->setBounds(165+w-435, topBound, 175, h-10); + dateText->setVisible(true); + + appendText->setBounds(165+w-255, topBound, 50, h-10); + appendText->setVisible(true); + + } + else + { + filenameComponent->setVisible(false); + newDirectoryButton->setVisible(false); + prependText->setVisible(false); + dateText->setVisible(false); + appendText->setVisible(false); + recordSelector->setVisible(false); + } + + repaint(); } void ControlPanel::openState(bool os) { - open = os; + open = os; - cpb->setState(os); + cpb->setState(os); - getUIComponent()->childComponentChanged(); + getUIComponent()->childComponentChanged(); } void ControlPanel::labelTextChanged(Label* label) { - graph->getRecordNode()->newDirectoryNeeded = true; - newDirectoryButton->setEnabledState(false); - masterClock->resetRecordTime(); + graph->getRecordNode()->newDirectoryNeeded = true; + newDirectoryButton->setEnabledState(false); + masterClock->resetRecordTime(); - dateText->setColour(Label::textColourId, Colours::grey); + dateText->setColour(Label::textColourId, Colours::grey); } void ControlPanel::startRecording() { - masterClock->startRecording(); // turn on recording - backgroundColour = Colour(255,0,0); - prependText->setEditable(false); - appendText->setEditable(false); - dateText->setColour(Label::textColourId, Colours::black); + masterClock->startRecording(); // turn on recording + backgroundColour = Colour(255,0,0); + prependText->setEditable(false); + appendText->setEditable(false); + dateText->setColour(Label::textColourId, Colours::black); - graph->setRecordState(true); + graph->setRecordState(true); - repaint(); + repaint(); } void ControlPanel::stopRecording() { - graph->setRecordState(false); // turn off recording in processor graph + graph->setRecordState(false); // turn off recording in processor graph - masterClock->stopRecording(); - newDirectoryButton->setEnabledState(true); - backgroundColour = Colour(58,58,58); + masterClock->stopRecording(); + newDirectoryButton->setEnabledState(true); + backgroundColour = Colour(58,58,58); - prependText->setEditable(true); - appendText->setEditable(true); + prependText->setEditable(true); + appendText->setEditable(true); - recordButton->setToggleState(false, dontSendNotification); + recordButton->setToggleState(false, dontSendNotification); - repaint(); + repaint(); } void ControlPanel::buttonClicked(Button* button) { - if (button == newDirectoryButton && newDirectoryButton->getEnabledState()) - { - graph->getRecordNode()->newDirectoryNeeded = true; - newDirectoryButton->setEnabledState(false); - masterClock->resetRecordTime(); - - dateText->setColour(Label::textColourId, Colours::grey); - - return; - - } - - if (button == playButton) - { - if (playButton->getToggleState()) - { - - if (graph->enableProcessors()) // start the processor graph - { - audio->beginCallbacks(); - masterClock->start(); - audioEditor->disable(); - - stopTimer(); - startTimer(250); // refresh every 250 ms - - } - } - else - { - - if (recordButton->getToggleState()) - { - stopRecording(); - } - - audio->endCallbacks(); - graph->disableProcessors(); - refreshMeters(); - masterClock->stop(); - stopTimer(); - startTimer(60000); // back to refresh every minute - audioEditor->enable(); - - } - - return; - } - - if (button == recordButton) - { - if (recordButton->getToggleState()) - { - if (playButton->getToggleState()) - { - startRecording(); - } - else - { - if (graph->enableProcessors()) // start the processor graph - { - audio->beginCallbacks(); - masterClock->start(); - audioEditor->disable(); - - stopTimer(); - startTimer(250); // refresh every 250 ms - - startRecording(); - - playButton->setToggleState(true, dontSendNotification); - - } - } - } - else - { - stopRecording(); - } - } - + if (button == newDirectoryButton && newDirectoryButton->getEnabledState()) + { + graph->getRecordNode()->newDirectoryNeeded = true; + newDirectoryButton->setEnabledState(false); + masterClock->resetRecordTime(); + + dateText->setColour(Label::textColourId, Colours::grey); + + return; + + } + + if (button == playButton) + { + if (playButton->getToggleState()) + { + + if (graph->enableProcessors()) // start the processor graph + { + audio->beginCallbacks(); + masterClock->start(); + audioEditor->disable(); + + stopTimer(); + startTimer(250); // refresh every 250 ms + + } + recordSelector->setEnabled(false); + } + else + { + + if (recordButton->getToggleState()) + { + stopRecording(); + } + + audio->endCallbacks(); + graph->disableProcessors(); + refreshMeters(); + masterClock->stop(); + stopTimer(); + startTimer(60000); // back to refresh every minute + audioEditor->enable(); + recordSelector->setEnabled(true); + + } + + return; + } + + if (button == recordButton) + { + if (recordButton->getToggleState()) + { + if (playButton->getToggleState()) + { + startRecording(); + } + else + { + if (graph->enableProcessors()) // start the processor graph + { + audio->beginCallbacks(); + masterClock->start(); + audioEditor->disable(); + + stopTimer(); + startTimer(250); // refresh every 250 ms + + startRecording(); + + playButton->setToggleState(true, dontSendNotification); + + } + recordSelector->setEnabled(false); + } + } + else + { + stopRecording(); + } + } + +} + +void ControlPanel::comboBoxChanged(ComboBox* combo) +{ + RecordEngine* re; + getProcessorGraph()->getRecordNode()->clearRecordEngines(); + switch (combo->getSelectedId()) + { + case 1: + re = static_cast<RecordEngine*>(new OriginalRecording()); + break; + case 2: + re = static_cast<RecordEngine*>(new HDF5Recording()); + break; + default: + std::cout << "Engine ComboBox: Bad ID" << std::endl; + combo->setSelectedId(1,dontSendNotification); + re = static_cast<RecordEngine*>(new OriginalRecording()); + break; + } + re->setUIComponent(getUIComponent()); + getProcessorGraph()->getRecordNode()->registerRecordEngine(re); + + graph->getRecordNode()->newDirectoryNeeded = true; + newDirectoryButton->setEnabledState(false); + masterClock->resetRecordTime(); + + dateText->setColour(Label::textColourId, Colours::grey); } void ControlPanel::disableCallbacks() { - std::cout << "Control panel received signal to disable callbacks." << std::endl; - - if (audio->callbacksAreActive()) - { - std::cout << "Stopping audio." << std::endl; - audio->endCallbacks(); - std::cout << "Disabling processors." << std::endl; - graph->disableProcessors(); - std::cout << "Updating control panel." << std::endl; - refreshMeters(); - stopTimer(); - startTimer(60000); // back to refresh every 10 seconds + std::cout << "Control panel received signal to disable callbacks." << std::endl; - } + if (audio->callbacksAreActive()) + { + std::cout << "Stopping audio." << std::endl; + audio->endCallbacks(); + std::cout << "Disabling processors." << std::endl; + graph->disableProcessors(); + std::cout << "Updating control panel." << std::endl; + refreshMeters(); + stopTimer(); + startTimer(60000); // back to refresh every 10 seconds - playButton->setToggleState(false, dontSendNotification); - recordButton->setToggleState(false, dontSendNotification); - masterClock->stopRecording(); - masterClock->stop(); + } + playButton->setToggleState(false, dontSendNotification); + recordButton->setToggleState(false, dontSendNotification); + recordSelector->setEnabled(true); + masterClock->stopRecording(); + masterClock->stop(); } @@ -815,128 +863,130 @@ void ControlPanel::disableCallbacks() void ControlPanel::timerCallback() { - //std::cout << "Message Received." << std::endl; - refreshMeters(); + //std::cout << "Message Received." << std::endl; + refreshMeters(); } void ControlPanel::refreshMeters() { - if (playButton->getToggleState()) - { - cpuMeter->updateCPU(audio->deviceManager.getCpuUsage()); - } - else - { - cpuMeter->updateCPU(0.0f); - } + if (playButton->getToggleState()) + { + cpuMeter->updateCPU(audio->deviceManager.getCpuUsage()); + } + else + { + cpuMeter->updateCPU(0.0f); + } - cpuMeter->repaint(); + cpuMeter->repaint(); - masterClock->repaint(); + masterClock->repaint(); - diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); - diskMeter->repaint(); + diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); + diskMeter->repaint(); - if (initialize) - { - stopTimer(); - startTimer(60000); // check for disk updates every minute - initialize = false; - } + if (initialize) + { + stopTimer(); + startTimer(60000); // check for disk updates every minute + initialize = false; + } } bool ControlPanel::keyPressed(const KeyPress& key) { - std::cout << "Control panel received" << key.getKeyCode() << std::endl; + std::cout << "Control panel received" << key.getKeyCode() << std::endl; - return false; + return false; } void ControlPanel::toggleState() { - open = !open; + open = !open; - cpb->toggleState(); - getUIComponent()->childComponentChanged(); + cpb->toggleState(); + getUIComponent()->childComponentChanged(); } String ControlPanel::getTextToAppend() { - String t = appendText->getText(); + String t = appendText->getText(); - if (t.length() > 0) - { - return "_" + t; - } - else - { - return t; - } + if (t.length() > 0) + { + return "_" + t; + } + else + { + return t; + } } String ControlPanel::getTextToPrepend() { - String t = prependText->getText(); + String t = prependText->getText(); - if (t.length() > 0) - { - return t + "_"; - } - else - { - return t; - } + if (t.length() > 0) + { + return t + "_"; + } + else + { + return t; + } } void ControlPanel::setDateText(String t) { - dateText->setText(t, dontSendNotification); + dateText->setText(t, dontSendNotification); } void ControlPanel::saveStateToXml(XmlElement* xml) { - XmlElement* controlPanelState = xml->createNewChildElement("CONTROLPANEL"); - controlPanelState->setAttribute("isOpen",open); - controlPanelState->setAttribute("prependText",prependText->getText()); - controlPanelState->setAttribute("appendText",appendText->getText()); + XmlElement* controlPanelState = xml->createNewChildElement("CONTROLPANEL"); + controlPanelState->setAttribute("isOpen",open); + controlPanelState->setAttribute("prependText",prependText->getText()); + controlPanelState->setAttribute("appendText",appendText->getText()); + controlPanelState->setAttribute("recordEngine",recordSelector->getSelectedId()); - audioEditor->saveStateToXml(xml); + audioEditor->saveStateToXml(xml); } void ControlPanel::loadStateFromXml(XmlElement* xml) { - forEachXmlChildElement(*xml, xmlNode) - { - if (xmlNode->hasTagName("CONTROLPANEL")) - { + forEachXmlChildElement(*xml, xmlNode) + { + if (xmlNode->hasTagName("CONTROLPANEL")) + { - appendText->setText(xmlNode->getStringAttribute("appendText", ""), dontSendNotification); - prependText->setText(xmlNode->getStringAttribute("prependText", ""), dontSendNotification); + appendText->setText(xmlNode->getStringAttribute("appendText", ""), dontSendNotification); + prependText->setText(xmlNode->getStringAttribute("prependText", ""), dontSendNotification); + recordSelector->setSelectedId(xmlNode->getIntAttribute("recordEngine",1), sendNotificationSync); - bool isOpen = xmlNode->getBoolAttribute("isOpen"); - openState(isOpen); + bool isOpen = xmlNode->getBoolAttribute("isOpen"); + openState(isOpen); - } - } + } + } - audioEditor->loadStateFromXml(xml); + audioEditor->loadStateFromXml(xml); } StringArray ControlPanel::getRecentlyUsedFilenames() { - return filenameComponent->getRecentlyUsedFilenames(); + return filenameComponent->getRecentlyUsedFilenames(); } void ControlPanel::setRecentlyUsedFilenames(const StringArray& filenames) { - filenameComponent->setRecentlyUsedFilenames(filenames); + filenameComponent->setRecentlyUsedFilenames(filenames); } \ No newline at end of file diff --git a/Source/UI/ControlPanel.h b/Source/UI/ControlPanel.h index 2e623282d7742f1a6255c25fedc2f4fa58c3ec5f..3632c3a711c476f5bcb634bf3514691f8c23f5e7 100755 --- a/Source/UI/ControlPanel.h +++ b/Source/UI/ControlPanel.h @@ -277,7 +277,8 @@ class ControlPanel : public Component, public Button::Listener, public Timer, public AccessClass, - public Label::Listener + public Label::Listener, + public ComboBox::Listener { public: @@ -352,6 +353,8 @@ private: ScopedPointer<UtilityButton> newDirectoryButton; ScopedPointer<ControlPanelButton> cpb; + ScopedPointer<ComboBox> recordSelector; + ScopedPointer<Label> prependText; ScopedPointer<Label> dateText; ScopedPointer<Label> appendText; @@ -366,6 +369,8 @@ private: void buttonClicked(Button* button); + void comboBoxChanged(ComboBox* combo); + bool initialize; /** Adds the RecordNode as a listener of the FilenameComponent diff --git a/open-ephys.jucer b/open-ephys.jucer index ce7c632944877ae23e88f6370ddc31a107157b3f..9794666263e6902be9299f472e636cc48d2b8544 100644 --- a/open-ephys.jucer +++ b/open-ephys.jucer @@ -12,7 +12,7 @@ includeBinaryInAppConfig="1"> <EXPORTFORMATS> <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK" - extraLinkerFlags="" objCExtraSuffix="fea2mT" externalLibraries=""> + extraLinkerFlags="-lhdf5" objCExtraSuffix="fea2mT"> <CONFIGURATIONS> <CONFIGURATION name="Debug" isDebug="1" optimisation="3" targetName="open-ephys" osxSDK="default" osxCompatibility="default" osxArchitecture="default"/> @@ -37,7 +37,7 @@ <MODULEPATH id="juce_audio_basics" path="JuceLibraryCode/modules"/> </MODULEPATHS> </XCODE_MAC> - <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" extraLinkerFlags="-pg -ldl -lXext -lGLU -lhdf5" + <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" extraLinkerFlags="-pg -ldl -lXext -lGLU -lhdf5 -lhdf5_cpp" extraCompilerFlags="-export-dynamic -g -pg -std=c++0x"> <CONFIGURATIONS> <CONFIGURATION name="Debug" isDebug="1" optimisation="3" targetName="open-ephys" @@ -64,24 +64,28 @@ </MODULEPATHS> </LINUX_MAKE> <VS2012 targetFolder="Builds/VisualStudio2012" libraryType="1" extraDefs="NOMINMAX" - externalLibraries="setupapi.lib opengl32.lib glu32.lib"> + externalLibraries="setupapi.lib opengl32.lib glu32.lib szip.lib zlib.lib hdf5.lib hdf5_cpp.lib"> <CONFIGURATIONS> <CONFIGURATION name="Debug" winWarningLevel="4" generateManifest="1" winArchitecture="32-bit" isDebug="1" optimisation="1" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Debug\bin" - headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x86 ../../Resources/Google Protocols/vsprojects/Debug" - postbuildCommand="copy ..\..\Resources\DLLs\okFrontPanel.dll .\Debug\bin"/> + headerPath="$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include ../../Resources/Google Protocols/src " + libraryPath="../../Resources/ZeroMQ/lib_x86 ../../Resources/Google Protocols/vsprojects/Debug $(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib" + postbuildCommand="call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)""/> <CONFIGURATION name="Release" winWarningLevel="4" generateManifest="1" winArchitecture="32-bit" isDebug="0" optimisation="3" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Release\bin" - headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x86 ../../Resources/Google Protocols/vsprojects/Release" - postbuildCommand="copy ..\..\Resources\DLLs\okFrontPanel.dll .\Release\bin"/> + headerPath="$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include ../../Resources/Google Protocols/src" + libraryPath="$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib ../../Resources/ZeroMQ/lib_x86 ../../Resources/Google Protocols/vsprojects/Release" + postbuildCommand="call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)""/> <CONFIGURATION name="Debug64" winWarningLevel="2" generateManifest="1" winArchitecture="x64" isDebug="1" optimisation="1" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Debug64\bin" - headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x64 ../../Resources/Google Protocols/vsprojects/x64/Debug" - postbuildCommand="copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Debug64\bin"/> + headerPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include ../../Resources/Google Protocols/src" + libraryPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib ../../Resources/ZeroMQ/lib_x64 ../../Resources/Google Protocols/vsprojects/x64/Debug" + postbuildCommand="call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)""/> <CONFIGURATION name="Release64" winWarningLevel="2" generateManifest="1" winArchitecture="x64" isDebug="0" optimisation="3" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Release64\bin" - headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x64 ../../Resources/Google Protocols/vsprojects/x64/Release" - postbuildCommand="copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Release64\bin"/> + headerPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include ../../Resources/Google Protocols/src" + libraryPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib ../../Resources/ZeroMQ/lib_x64 ../../Resources/Google Protocols/vsprojects/x64/Release" + postbuildCommand="call "$(SolutionDir)\copydlls.cmd" "$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin" "$(SolutionDir)\..\..\Resources\DLLs" "$(OutDir)""/> </CONFIGURATIONS> <MODULEPATHS> <MODULEPATH id="juce_video" path="JuceLibraryCode/modules"/> @@ -286,6 +290,20 @@ file="Source/Processors/SpikeSortBoxes.h"/> <FILE id="LfiaEP" name="SpikeSorter.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter.cpp"/> <FILE id="OeZ3tb" name="SpikeSorter.h" compile="0" resource="0" file="Source/Processors/SpikeSorter.h"/> + <FILE id="GP1WNZ" name="HDF5FileFormat.cpp" compile="1" resource="0" + file="Source/Processors/HDF5FileFormat.cpp"/> + <FILE id="ggxZWd" name="HDF5FileFormat.h" compile="0" resource="0" + file="Source/Processors/HDF5FileFormat.h"/> + <FILE id="TJ0Hmt" name="OriginalRecording.cpp" compile="1" resource="0" + file="Source/Processors/OriginalRecording.cpp"/> + <FILE id="z11idO" name="OriginalRecording.h" compile="0" resource="0" + file="Source/Processors/OriginalRecording.h"/> + <FILE id="ikbpX1" name="RecordEngine.cpp" compile="1" resource="0" + file="Source/Processors/RecordEngine.cpp"/> + <FILE id="uqGmrZ" name="RecordEngine.h" compile="0" resource="0" file="Source/Processors/RecordEngine.h"/> + <FILE id="eUtNHW" name="HDF5Recording.cpp" compile="1" resource="0" + file="Source/Processors/HDF5Recording.cpp"/> + <FILE id="dXX5ds" name="HDF5Recording.h" compile="0" resource="0" file="Source/Processors/HDF5Recording.h"/> <FILE id="Yj1umv" name="SerialInput.cpp" compile="1" resource="0" file="Source/Processors/SerialInput.cpp"/> <FILE id="TSsuVv" name="SerialInput.h" compile="0" resource="0" file="Source/Processors/SerialInput.h"/> <FILE id="M6nCIs" name="FileReader.cpp" compile="1" resource="0" file="Source/Processors/FileReader.cpp"/>