Skip to content
Snippets Groups Projects
Commit c2256c9a authored by Aaron Cuevas Lopez's avatar Aaron Cuevas Lopez
Browse files

Add HDF5 basic recording as RecordEngine

parent 88ba1d93
Branches
Tags
No related merge requests found
......@@ -24,6 +24,7 @@
#include "MainWindow.h"
#include <stdio.h>
#include "Processors\OriginalRecording.h"
#include "Processors\HDF5Recording.h"
//-----------------------------------------------------------------------
MainWindow::MainWindow()
......@@ -65,6 +66,9 @@ MainWindow::MainWindow()
RecordEngine* re = static_cast<RecordEngine*>(new OriginalRecording());
re->setUIComponent(ui);
processorGraph->getRecordNode()->registerRecordEngine(re);
re = static_cast<RecordEngine*>(new HDF5Recording());
re->setUIComponent(ui);
processorGraph->getRecordNode()->registerRecordEngine(re);
loadWindowBounds();
setUsingNativeTitleBar(true);
......
......@@ -24,6 +24,14 @@
#include <H5Cpp.h>
#include "HDF5FileFormat.h"
#ifndef BLOCK_XSIZE
#define BLOCK_XSIZE 256
#endif
#ifndef CHUNK_XSIZE
#define CHUNK_XSIZE 256
#endif
#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;
......@@ -423,10 +431,8 @@ int HDF5RecordingData::writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataT
offset[1] = yPos;
fSpace.selectHyperslab(H5S_SELECT_SET, dim, offset);
//This should use native types but as RecordNode currently converts to Big Endian it's easier to just
//use the BE format in which we're encoding the dataset.
//nativeType = HDF5FileBase::getNativeType(type);
nativeType = HDF5FileBase::getH5Type(type);
nativeType = HDF5FileBase::getNativeType(type);
dSet->write(data,nativeType,mSpace,fSpace);
}
......@@ -463,7 +469,7 @@ String KWDFile::getFileName()
void KWDFile::initFile(int processorNumber, String basename)
{
if (isOpen) return;
if (isOpen()) return;
filename = basename + String(processorNumber) + "_raw.kwd";
readyToOpen=true;
}
......@@ -475,7 +481,7 @@ void KWDFile::startNewRecording(int recordingNumber, int nChannels)
String recordPath = String("/recordings/")+String(recordingNumber);
CHECK_ERROR(createGroup(recordPath));
recdata = createDataSet(I16,256,nChannels,256,recordPath+"/data");
recdata = createDataSet(I16,BLOCK_XSIZE,nChannels,CHUNK_XSIZE,recordPath+"/data");
if (!recdata.get())
std::cerr << "Error creating data set" << std::endl;
curChan = nChannels;
......@@ -509,4 +515,4 @@ void KWDFile::writeRowData(int16* data, int nSamples)
}
CHECK_ERROR(recdata->writeDataRow(curChan,nSamples,I16,data));
curChan++;
}
}
\ No newline at end of file
......@@ -21,3 +21,100 @@
*/
#include "HDF5Recording.h"
#define MAX_BUFFER_SIZE 10000
HDF5Recording::HDF5Recording() : processorIndex(-1)
{
scaledBuffer = new float[MAX_BUFFER_SIZE];
intBuffer = new int16[MAX_BUFFER_SIZE];
}
HDF5Recording::~HDF5Recording()
{
delete scaledBuffer;
delete intBuffer;
}
void HDF5Recording::registerProcessor(GenericProcessor *proc)
{
fileArray.add(new KWDFile());
activeChannelCount.add(0);
processorIndex++;
}
void HDF5Recording::resetChannels()
{
processorIndex = -1;
fileArray.clear();
activeChannelCount.clear();
processorMap.clear();
}
void HDF5Recording::addChannel(int index, Channel* chan)
{
processorMap.add(processorIndex);
}
void HDF5Recording::openFiles(File rootFolder, int recordingNumber)
{
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,rootFolder.getFullPathName() + rootFolder.separatorString);
fileArray[index]->open();
}
activeChannelCount.set(index,activeChannelCount[index]+1);
}
}
for (int i = 0; i < fileArray.size(); i++)
{
if (fileArray[i]->isOpen())
{
fileArray[i]->startNewRecording(recordingNumber,activeChannelCount[i]);
}
}
}
void HDF5Recording::closeFiles()
{
for (int i = 0; i < fileArray.size(); i++)
{
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(MidiMessage& event, int samplePosition)
{
//TODO
}
void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec)
{
//TODO
}
void HDF5Recording::writeSpike(const SpikeObject& spike, int electrodeIndex)
{
//TODO
}
\ No newline at end of file
......@@ -24,7 +24,35 @@
#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 recordingNumber);
void closeFiles();
void writeData(AudioSampleBuffer& buffer, int nSamples);
void writeEvent(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();
private:
int processorIndex;
Array<int> processorMap;
Array<int> activeChannelCount;
OwnedArray<KWDFile> fileArray;
float* scaledBuffer;
int16* intBuffer;
};
#endif // HDF5RECORDING_H_INCLUDED
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment