Skip to content

Commit 4343fc8

Browse files
committed
First iteration of recording in its own thread
1 parent b804f83 commit 4343fc8

25 files changed

Lines changed: 1125 additions & 353 deletions

Builds/Linux/Makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ OBJECTS := \
106106
$(OBJDIR)/ParameterEditor_112258eb.o \
107107
$(OBJDIR)/Parameter_b3e5ac9e.o \
108108
$(OBJDIR)/ProcessorGraph_8c3a250a.o \
109+
$(OBJDIR)/DataQueue_d6cc297a.o \
110+
$(OBJDIR)/RecordThread_fb797372.o \
109111
$(OBJDIR)/EngineConfigWindow_4fd44ceb.o \
110112
$(OBJDIR)/OriginalRecording_d6dc3293.o \
111113
$(OBJDIR)/RecordEngine_97ef83aa.o \
@@ -442,6 +444,16 @@ $(OBJDIR)/ProcessorGraph_8c3a250a.o: ../../Source/Processors/ProcessorGraph/Proc
442444
@echo "Compiling ProcessorGraph.cpp"
443445
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
444446

447+
$(OBJDIR)/DataQueue_d6cc297a.o: ../../Source/Processors/RecordNode/DataQueue.cpp
448+
-@mkdir -p $(OBJDIR)
449+
@echo "Compiling DataQueue.cpp"
450+
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
451+
452+
$(OBJDIR)/RecordThread_fb797372.o: ../../Source/Processors/RecordNode/RecordThread.cpp
453+
-@mkdir -p $(OBJDIR)
454+
@echo "Compiling RecordThread.cpp"
455+
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
456+
445457
$(OBJDIR)/EngineConfigWindow_4fd44ceb.o: ../../Source/Processors/RecordNode/EngineConfigWindow.cpp
446458
-@mkdir -p $(OBJDIR)
447459
@echo "Compiling EngineConfigWindow.cpp"

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

Lines changed: 23 additions & 9 deletions
Large diffs are not rendered by default.

Builds/VisualStudio2012/open-ephys.vcxproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@
310310
<ClCompile Include="..\..\Source\Processors\Parameter\ParameterEditor.cpp"/>
311311
<ClCompile Include="..\..\Source\Processors\Parameter\Parameter.cpp"/>
312312
<ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp"/>
313+
<ClCompile Include="..\..\Source\Processors\RecordNode\DataQueue.cpp"/>
314+
<ClCompile Include="..\..\Source\Processors\RecordNode\RecordThread.cpp"/>
313315
<ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp"/>
314316
<ClCompile Include="..\..\Source\Processors\RecordNode\OriginalRecording.cpp"/>
315317
<ClCompile Include="..\..\Source\Processors\RecordNode\RecordEngine.cpp"/>
@@ -1525,6 +1527,9 @@
15251527
<ClInclude Include="..\..\Source\Processors\Parameter\ParameterEditor.h"/>
15261528
<ClInclude Include="..\..\Source\Processors\Parameter\Parameter.h"/>
15271529
<ClInclude Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.h"/>
1530+
<ClInclude Include="..\..\Source\Processors\RecordNode\DataQueue.h"/>
1531+
<ClInclude Include="..\..\Source\Processors\RecordNode\EventQueue.h"/>
1532+
<ClInclude Include="..\..\Source\Processors\RecordNode\RecordThread.h"/>
15281533
<ClInclude Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.h"/>
15291534
<ClInclude Include="..\..\Source\Processors\RecordNode\OriginalRecording.h"/>
15301535
<ClInclude Include="..\..\Source\Processors\RecordNode\RecordEngine.h"/>

Builds/VisualStudio2012/open-ephys.vcxproj.filters

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,12 @@
571571
<ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp">
572572
<Filter>open-ephys\Source\Processors\ProcessorGraph</Filter>
573573
</ClCompile>
574+
<ClCompile Include="..\..\Source\Processors\RecordNode\DataQueue.cpp">
575+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
576+
</ClCompile>
577+
<ClCompile Include="..\..\Source\Processors\RecordNode\RecordThread.cpp">
578+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
579+
</ClCompile>
574580
<ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp">
575581
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
576582
</ClCompile>
@@ -2073,6 +2079,15 @@
20732079
<ClInclude Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.h">
20742080
<Filter>open-ephys\Source\Processors\ProcessorGraph</Filter>
20752081
</ClInclude>
2082+
<ClInclude Include="..\..\Source\Processors\RecordNode\DataQueue.h">
2083+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
2084+
</ClInclude>
2085+
<ClInclude Include="..\..\Source\Processors\RecordNode\EventQueue.h">
2086+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
2087+
</ClInclude>
2088+
<ClInclude Include="..\..\Source\Processors\RecordNode\RecordThread.h">
2089+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
2090+
</ClInclude>
20762091
<ClInclude Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.h">
20772092
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
20782093
</ClInclude>

Builds/VisualStudio2013/open-ephys.sln

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1-
Microsoft Visual Studio Solution File, Format Version 11.00
1+
Microsoft Visual Studio Solution File, Format Version 12.00
22
# Visual Studio 2013
3-
Project("{5A05F353-1D63-394C-DFB0-981BB2309002}") = "open-ephys", "open-ephys.vcxproj", "{9C924D66-7DEC-1AEF-B375-DB8666BFB909}"
3+
VisualStudioVersion = 12.0.40629.0
4+
MinimumVisualStudioVersion = 10.0.40219.1
5+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "open-ephys", "open-ephys.vcxproj", "{9C924D66-7DEC-1AEF-B375-DB8666BFB909}"
46
EndProject
57
Global
68
GlobalSection(SolutionConfigurationPlatforms) = preSolution
79
Debug|Win32 = Debug|Win32
8-
Release|Win32 = Release|Win32
10+
Debug|x64 = Debug|x64
11+
Debug64|Win32 = Debug64|Win32
912
Debug64|x64 = Debug64|x64
13+
Release|Win32 = Release|Win32
14+
Release|x64 = Release|x64
15+
Release64|Win32 = Release64|Win32
1016
Release64|x64 = Release64|x64
1117
EndGlobalSection
1218
GlobalSection(ProjectConfigurationPlatforms) = postSolution
1319
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|Win32.ActiveCfg = Debug|Win32
1420
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|Win32.Build.0 = Debug|Win32
15-
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.ActiveCfg = Release|Win32
16-
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.Build.0 = Release|Win32
21+
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|x64.ActiveCfg = Debug|Win32
22+
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|Win32.ActiveCfg = Debug64|x64
1723
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.ActiveCfg = Debug64|x64
1824
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.Build.0 = Debug64|x64
25+
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.ActiveCfg = Release|Win32
26+
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.Build.0 = Release|Win32
27+
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|x64.ActiveCfg = Release|Win32
28+
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|Win32.ActiveCfg = Release64|x64
1929
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|x64.ActiveCfg = Release64|x64
2030
{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|x64.Build.0 = Release64|x64
2131
EndGlobalSection

Builds/VisualStudio2013/open-ephys.vcxproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@
314314
<ClCompile Include="..\..\Source\Processors\Parameter\ParameterEditor.cpp"/>
315315
<ClCompile Include="..\..\Source\Processors\Parameter\Parameter.cpp"/>
316316
<ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp"/>
317+
<ClCompile Include="..\..\Source\Processors\RecordNode\DataQueue.cpp"/>
318+
<ClCompile Include="..\..\Source\Processors\RecordNode\RecordThread.cpp"/>
317319
<ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp"/>
318320
<ClCompile Include="..\..\Source\Processors\RecordNode\OriginalRecording.cpp"/>
319321
<ClCompile Include="..\..\Source\Processors\RecordNode\RecordEngine.cpp"/>
@@ -1529,6 +1531,9 @@
15291531
<ClInclude Include="..\..\Source\Processors\Parameter\ParameterEditor.h"/>
15301532
<ClInclude Include="..\..\Source\Processors\Parameter\Parameter.h"/>
15311533
<ClInclude Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.h"/>
1534+
<ClInclude Include="..\..\Source\Processors\RecordNode\DataQueue.h"/>
1535+
<ClInclude Include="..\..\Source\Processors\RecordNode\EventQueue.h"/>
1536+
<ClInclude Include="..\..\Source\Processors\RecordNode\RecordThread.h"/>
15321537
<ClInclude Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.h"/>
15331538
<ClInclude Include="..\..\Source\Processors\RecordNode\OriginalRecording.h"/>
15341539
<ClInclude Include="..\..\Source\Processors\RecordNode\RecordEngine.h"/>

Builds/VisualStudio2013/open-ephys.vcxproj.filters

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,12 @@
571571
<ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp">
572572
<Filter>open-ephys\Source\Processors\ProcessorGraph</Filter>
573573
</ClCompile>
574+
<ClCompile Include="..\..\Source\Processors\RecordNode\DataQueue.cpp">
575+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
576+
</ClCompile>
577+
<ClCompile Include="..\..\Source\Processors\RecordNode\RecordThread.cpp">
578+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
579+
</ClCompile>
574580
<ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp">
575581
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
576582
</ClCompile>
@@ -2073,6 +2079,15 @@
20732079
<ClInclude Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.h">
20742080
<Filter>open-ephys\Source\Processors\ProcessorGraph</Filter>
20752081
</ClInclude>
2082+
<ClInclude Include="..\..\Source\Processors\RecordNode\DataQueue.h">
2083+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
2084+
</ClInclude>
2085+
<ClInclude Include="..\..\Source\Processors\RecordNode\EventQueue.h">
2086+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
2087+
</ClInclude>
2088+
<ClInclude Include="..\..\Source\Processors\RecordNode\RecordThread.h">
2089+
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
2090+
</ClInclude>
20762091
<ClInclude Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.h">
20772092
<Filter>open-ephys\Source\Processors\RecordNode</Filter>
20782093
</ClInclude>

Source/Plugins/KWIKFormat/RecordEngine/HDF5FileFormat.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include "HDF5FileFormat.h"
2626

2727
#ifndef CHUNK_XSIZE
28-
#define CHUNK_XSIZE 640
28+
#define CHUNK_XSIZE 2048
2929
#endif
3030

3131
#ifndef EVENT_CHUNK_SIZE
@@ -97,7 +97,7 @@ int HDF5FileBase::open(bool newfile, int nChans)
9797
FileAccPropList props = FileAccPropList::DEFAULT;
9898
if (nChans > 0)
9999
{
100-
props.setCache(0, 809, 8 * 2 * 640 * nChans, 1);
100+
props.setCache(0, 809, 8 * 2 * CHUNK_XSIZE * nChans, 1);
101101
//std::cout << "opening HDF5 " << getFileName() << " with nchans: " << nChans << std::endl;
102102
}
103103

@@ -712,6 +712,15 @@ void KWDFile::writeRowData(int16* data, int nSamples)
712712
curChan++;
713713
}
714714

715+
void KWDFile::writeRowData(int16* data, int nSamples, int channel)
716+
{
717+
if (channel >= 0 && channel < nChannels)
718+
{
719+
CHECK_ERROR(recdata->writeDataRow(channel, nSamples, I16, data));
720+
curChan = channel;
721+
}
722+
}
723+
715724
//KWE File
716725

717726
KWEFile::KWEFile(String basename) : HDF5FileBase()

Source/Plugins/KWIKFormat/RecordEngine/HDF5FileFormat.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ class KWDFile : public HDF5FileBase
127127
void stopRecording();
128128
void writeBlockData(int16* data, int nSamples);
129129
void writeRowData(int16* data, int nSamples);
130+
void writeRowData(int16* data, int nSamples, int channel);
130131
String getFileName();
131132

132133
protected:

Source/Plugins/KWIKFormat/RecordEngine/HDF5Recording.cpp

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@ String HDF5Recording::getEngineID()
4747
// this->timestamp = timestamp;
4848
// }
4949

50-
void HDF5Recording::registerProcessor(GenericProcessor* proc)
50+
void HDF5Recording::registerProcessor(const GenericProcessor* proc)
5151
{
5252
HDF5RecordingInfo* info = new HDF5RecordingInfo();
53-
info->sample_rate = proc->getSampleRate();
53+
//This is a VERY BAD thig to do. temporary only until we fix const-correctness on GenericEditor methods
54+
//(which implies modifying all the plugins and processors)
55+
info->sample_rate = const_cast<GenericProcessor*>(proc)->getSampleRate();
5456
info->bit_depth = 16;
5557
info->multiSample = false;
5658
infoArray.add(info);
@@ -70,11 +72,12 @@ void HDF5Recording::resetChannels()
7072
sampleRatesArray.clear();
7173
processorMap.clear();
7274
infoArray.clear();
75+
recordedChanToKWDChan.clear();
7376
if (spikesFile)
7477
spikesFile->resetChannels();
7578
}
7679

77-
void HDF5Recording::addChannel(int index, Channel* chan)
80+
void HDF5Recording::addChannel(int index,const Channel* chan)
7881
{
7982
processorMap.add(processorIndex);
8083
}
@@ -94,15 +97,40 @@ void HDF5Recording::openFiles(File rootFolder, int experimentNumber, int recordi
9497
//Let's just put the first processor (usually the source node) on the KWIK for now
9598
infoArray[0]->name = String("Open Ephys Recording #") + String(recordingNumber);
9699

97-
if (hasAcquired)
100+
/* if (hasAcquired)
98101
infoArray[0]->start_time = (*timestamps)[getChannel(0)->sourceNodeId]; //(*timestamps).begin()->first;
99102
else
100-
infoArray[0]->start_time = 0;
103+
infoArray[0]->start_time = 0;*/
104+
infoArray[0]->start_time = getTimestamp(0);
101105

102106
infoArray[0]->start_sample = 0;
103107
eventFile->startNewRecording(recordingNumber,infoArray[0]);
104108

105109
//KWD files
110+
recordedChanToKWDChan.clear();
111+
Array<int> processorRecPos;
112+
processorRecPos.insertMultiple(0, 0, fileArray.size());
113+
for (int i = 0; i < getNumRecordedChannels(); i++)
114+
{
115+
int index = processorMap[getRealChannel(i)];
116+
if (!fileArray[index]->isOpen())
117+
{
118+
fileArray[index]->initFile(getChannel(getRealChannel(i))->nodeId, basepath);
119+
infoArray[index]->start_time = getTimestamp(i);
120+
}
121+
122+
channelsPerProcessor.set(index, channelsPerProcessor[index] + 1);
123+
bitVoltsArray[index]->add(getChannel(getRealChannel(i))->bitVolts);
124+
sampleRatesArray[index]->add(getChannel(getRealChannel(i))->sampleRate);
125+
if (getChannel(getRealChannel(i))->sampleRate != infoArray[index]->sample_rate)
126+
{
127+
infoArray[index]->multiSample = true;
128+
}
129+
int procPos = processorRecPos[index];
130+
recordedChanToKWDChan.add(procPos);
131+
processorRecPos.set(index, procPos+1);
132+
}
133+
#if 0
106134
for (int i = 0; i < processorMap.size(); i++)
107135
{
108136
int index = processorMap[i];
@@ -125,6 +153,7 @@ void HDF5Recording::openFiles(File rootFolder, int experimentNumber, int recordi
125153
}
126154
}
127155
}
156+
#endif
128157
for (int i = 0; i < fileArray.size(); i++)
129158
{
130159
if ((!fileArray[i]->isOpen()) && (fileArray[i]->isReadyToOpen()))
@@ -169,42 +198,32 @@ void HDF5Recording::closeFiles()
169198
}
170199
}
171200

172-
void HDF5Recording::writeData(AudioSampleBuffer& buffer)
201+
void HDF5Recording::writeData(int writeChannel, int realChannel, const float* buffer, int size)
173202
{
174203
// int64 t1 = Time::getHighResolutionTicks();
175-
for (int i = 0; i < buffer.getNumChannels(); i++)
176-
{
177-
if (getChannel(i)->getRecordState())
178-
{
179-
180-
int sourceNodeId = getChannel(i)->sourceNodeId;
181-
int nSamples = (*numSamples)[sourceNodeId];
182-
183-
double multFactor = 1/(float(0x7fff) * getChannel(i)->bitVolts);
184-
int index = processorMap[getChannel(i)->recordIndex];
185-
FloatVectorOperations::copyWithMultiply(scaledBuffer,buffer.getReadPointer(i,0),multFactor,nSamples);
186-
AudioDataConverters::convertFloatToInt16LE(scaledBuffer,intBuffer,nSamples);
187-
fileArray[index]->writeRowData(intBuffer,nSamples);
188-
}
189-
}
204+
double multFactor = 1 / (float(0x7fff) * getChannel(realChannel)->bitVolts);
205+
int index = processorMap[getChannel(realChannel)->recordIndex];
206+
FloatVectorOperations::copyWithMultiply(scaledBuffer, buffer, multFactor, size);
207+
AudioDataConverters::convertFloatToInt16LE(scaledBuffer, intBuffer, size);
208+
fileArray[index]->writeRowData(intBuffer, size, recordedChanToKWDChan[writeChannel]);
190209
// int64 t2 = Time::getHighResolutionTicks();
191210
// std::cout << "record time: " << float(t2 - t1) / float(Time::getHighResolutionTicksPerSecond()) << std::endl;
192211
}
193212

194-
void HDF5Recording::writeEvent(int eventType, MidiMessage& event, int samplePosition)
213+
void HDF5Recording::writeEvent(int eventType, const MidiMessage& event, int64 timestamp)
195214
{
196215
const uint8* dataptr = event.getRawData();
197216
if (eventType == GenericProcessor::TTL)
198-
eventFile->writeEvent(0,*(dataptr+2),*(dataptr+1),(void*)(dataptr+3),(*timestamps)[*(dataptr+1)]+samplePosition);
217+
eventFile->writeEvent(0,*(dataptr+2),*(dataptr+1),(void*)(dataptr+3),timestamp);
199218
else if (eventType == GenericProcessor::MESSAGE)
200-
eventFile->writeEvent(1,*(dataptr+2),*(dataptr+1),(void*)(dataptr+6),(*timestamps)[*(dataptr+1)]+samplePosition);
219+
eventFile->writeEvent(1,*(dataptr+2),*(dataptr+1),(void*)(dataptr+6),timestamp);
201220
}
202221

203-
void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec)
222+
void HDF5Recording::addSpikeElectrode(int index, const SpikeRecordInfo* elec)
204223
{
205224
spikesFile->addChannelGroup(elec->numChannels);
206225
}
207-
void HDF5Recording::writeSpike(const SpikeObject& spike, int electrodeIndex)
226+
void HDF5Recording::writeSpike(int electrodeIndex, const SpikeObject& spike, int64 /*timestamp*/)
208227
{
209228
spikesFile->writeSpike(electrodeIndex,spike.nSamples,spike.data,spike.timestamp);
210229
}

0 commit comments

Comments
 (0)