diff --git a/Source/Processors/HDF5Recording.cpp b/Source/Processors/HDF5Recording.cpp index f9b89c5d98af6406e4c49930b5555a35fae75c29..b70570bf2785544a7697cad3ae85b0e29880e05a 100644 --- a/Source/Processors/HDF5Recording.cpp +++ b/Source/Processors/HDF5Recording.cpp @@ -149,8 +149,8 @@ void HDF5Recording::writeData(AudioSampleBuffer& buffer, int 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); + if (eventType == GenericProcessor::TTL) + mainFile->writeEvent(0,*(dataptr+2),*(dataptr+1),*(dataptr+3),timestamp+samplePosition); } void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec) diff --git a/Source/Processors/OriginalRecording.cpp b/Source/Processors/OriginalRecording.cpp index c858c793894aeaef6c337f4fdf5429ba3ba5b93f..7ad5469189f6c2bb4971150c62a2ff702146bc17 100644 --- a/Source/Processors/OriginalRecording.cpp +++ b/Source/Processors/OriginalRecording.cpp @@ -25,7 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "../Audio/AudioComponent.h" OriginalRecording::OriginalRecording() : separateFiles(true), eventFile(nullptr), - recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0) + messageFile(nullptr), recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0) { continuousDataIntegerBuffer = new int16[10000]; continuousDataFloatBuffer = new float[10000]; @@ -78,6 +78,7 @@ void OriginalRecording::openFiles(File rootFolder, int experimentNumber, int rec this->recordingNumber = recordingNumber; this->experimentNumber = experimentNumber; openFile(rootFolder,nullptr); + openMessageFile(rootFolder); for (int i = 0; i < fileArray.size(); i++) { if (getChannel(i)->getRecordState()) @@ -173,6 +174,29 @@ void OriginalRecording::openSpikeFile(File rootFolder, SpikeRecordInfo* elec) } +void OriginalRecording::openMessageFile(File rootFolder) +{ + FILE* mFile; + String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString); + fullPath += "messages.events"; + + std::cout << "OPENING FILE: " << fullPath << std::endl; + + File f = File(fullPath); + + bool fileExists = f.exists(); + + diskWriteLock.enter(); + + mFile = fopen(fullPath.toUTF8(),"ab"); + + //If this file needs a header, it goes here + + diskWriteLock.exit(); + messageFile = mFile; + +} + String OriginalRecording::getFileName(Channel* ch) { String filename; @@ -287,6 +311,36 @@ String OriginalRecording::generateSpikeHeader(SpikeRecordInfo* elec) } void OriginalRecording::writeEvent(int eventType, MidiMessage& event, int samplePosition) +{ + if (eventType == GenericProcessor::TTL) + writeTTLEvent(event,samplePosition); + else if (eventType == GenericProcessor::MESSAGE) + writeMessage(event,samplePosition); +} + +void OriginalRecording::writeMessage(MidiMessage& event, int samplePosition) +{ + if (messageFile == nullptr) + return; + uint64 samplePos = (uint64) samplePosition; + + int64 eventTimestamp = timestamp + samplePos; + + int msgLength = event.getRawDataSize() - 4; + const char* dataptr = (const char*)event.getRawData() + 4; + + String timestampText(eventTimestamp); + + diskWriteLock.enter(); + fwrite(timestampText.toUTF8(),1,timestampText.length(),messageFile); + fwrite(" ",1,1,messageFile); + fwrite(dataptr,1,msgLength,messageFile); + fwrite("\n",1,1,messageFile); + diskWriteLock.exit(); + +} + +void OriginalRecording::writeTTLEvent(MidiMessage& event, int samplePosition) { // find file and write samples to disk // std::cout << "Received event!" << std::endl; @@ -296,8 +350,7 @@ void OriginalRecording::writeEvent(int eventType, MidiMessage& event, int sample const uint8* dataptr = event.getRawData(); - - uint64 samplePos = (uint64) samplePosition; + uint64 samplePos = (uint64) samplePosition; int64 eventTimestamp = timestamp + samplePos; // add the sample position to the buffer timestamp @@ -491,6 +544,13 @@ void OriginalRecording::closeFiles() eventFile = nullptr; diskWriteLock.exit(); } + if (messageFile != nullptr) + { + diskWriteLock.enter(); + fclose(messageFile); + messageFile = nullptr; + diskWriteLock.exit(); + } blockIndex = 0; } diff --git a/Source/Processors/OriginalRecording.h b/Source/Processors/OriginalRecording.h index 99c6f0a716965fd712e3037ccb9d254663130008..e98e29cdb225981d95512e088b6c671a7e0da4f1 100644 --- a/Source/Processors/OriginalRecording.h +++ b/Source/Processors/OriginalRecording.h @@ -59,6 +59,10 @@ private: void openSpikeFile(File rootFolder, SpikeRecordInfo* elec); String generateSpikeHeader(SpikeRecordInfo* elec); + void openMessageFile(File rootFolder); + void writeTTLEvent(MidiMessage& event, int samplePosition); + void writeMessage(MidiMessage& event, int samplePosition); + bool separateFiles; int blockIndex; int recordingNumber; @@ -81,6 +85,7 @@ private: int64 timestamp; FILE* eventFile; + FILE* messageFile; Array<FILE*> fileArray; Array<FILE*> spikeFileArray; CriticalSection diskWriteLock; diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp index d1069ad7f622888fcbf9f83832ed1c9fc5f7e82b..05cd28efb6f545c44229dc5d1094eada79f4cbb1 100755 --- a/Source/Processors/RecordNode.cpp +++ b/Source/Processors/RecordNode.cpp @@ -410,7 +410,7 @@ float RecordNode::getFreeSpace() void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePosition) { - if (eventType == TTL) + if ((eventType == TTL) || (eventType == MESSAGE)) { if (event.getNoteNumber() > 0) // processor ID > 0 {