diff --git a/Source/Processors/RecordNode/HDF5Recording.cpp b/Source/Processors/RecordNode/HDF5Recording.cpp index ff4f33f1768f63dfa88770f037bba251c5f091e4..a6a45d41a41263aa5b9db01b8f1e4e06178c0723 100644 --- a/Source/Processors/RecordNode/HDF5Recording.cpp +++ b/Source/Processors/RecordNode/HDF5Recording.cpp @@ -135,13 +135,17 @@ void HDF5Recording::closeFiles() } } -void HDF5Recording::writeData(AudioSampleBuffer& buffer, int nSamples) +void HDF5Recording::writeData(AudioSampleBuffer& buffer) { int index; for (int i = 0; i < buffer.getNumChannels(); i++) { if (getChannel(i)->getRecordState()) { + + int sourceNodeId = getChannel(i)->sourceNodeId; + int nSamples = (*numSamples)[sourceNodeId]; + double multFactor = 1/(float(0x7fff) * getChannel(i)->bitVolts); int index = processorMap[getChannel(i)->recordIndex]; FloatVectorOperations::copyWithMultiply(scaledBuffer,buffer.getReadPointer(i,0),multFactor,nSamples); diff --git a/Source/Processors/RecordNode/HDF5Recording.h b/Source/Processors/RecordNode/HDF5Recording.h index eea2359f8eccb454d700685bad6198ca1c7f2220..07e7e19ab39d151afa98188461fc75e2e5d15967 100644 --- a/Source/Processors/RecordNode/HDF5Recording.h +++ b/Source/Processors/RecordNode/HDF5Recording.h @@ -35,7 +35,7 @@ public: String getEngineID(); void openFiles(File rootFolder, int experimentNumber, int recordingNumber); void closeFiles(); - void writeData(AudioSampleBuffer& buffer, int nSamples); + void writeData(AudioSampleBuffer& buffer); void writeEvent(int eventType, MidiMessage& event, int samplePosition); void addChannel(int index, Channel* chan); void addSpikeElectrode(int index, SpikeRecordInfo* elec); diff --git a/Source/Processors/RecordNode/OriginalRecording.cpp b/Source/Processors/RecordNode/OriginalRecording.cpp index 07453f8e12535dfb27b0e6f4c4b49da36bf59803..10003f98b77b542eea70615f7c3b3094ffc63395 100644 --- a/Source/Processors/RecordNode/OriginalRecording.cpp +++ b/Source/Processors/RecordNode/OriginalRecording.cpp @@ -406,106 +406,76 @@ void OriginalRecording::writeTTLEvent(MidiMessage& event, int samplePosition) diskWriteLock.exit(); } -void OriginalRecording::writeData(AudioSampleBuffer& buffer, int nSamples) +void OriginalRecording::writeData(AudioSampleBuffer& buffer) { - int samplesWritten = 100; // SOME NUMBER - for (int i = 0; i < buffer.getNumChannels(); i++) { if (getChannel(i)->getRecordState()) { + int samplesWritten = 0; int sourceNodeId = getChannel(i)->sourceNodeId; int nSamples = (*numSamples)[sourceNodeId]; int64 timestamp = (*timestamps)[sourceNodeId]; - int samplesToWrite = jmin(BLOCK_LENGTH, nSamples - blockIndex[i]); - - // write buffer to disk! - writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), - samplesToWrite, - i); - - blockIndex.set(i, blockIndex[i] + samplesToWrite); - } - } - - // 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), - // getChannel(i)->sourceNodeId, - // i); - - - // } - // } + while (samplesWritten < nSamples) // there are still unwritten samples in this buffer + { + int numSamplesToWrite = nSamples - samplesWritten; - // // update our variables - // samplesWritten += numSamplesToWrite; - // timestamp += numSamplesToWrite; - // blockIndex += numSamplesToWrite; + if (blockIndex[i] + numSamplesToWrite < BLOCK_LENGTH) // we still have space in this block + { - // } - // else // there's not enough space left in this block for all remaining samples - // { + // write buffer to disk! + writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), + numSamplesToWrite, + i); - // numSamplesToWrite = BLOCK_LENGTH - blockIndex; + timestamp += numSamplesToWrite; + blockIndex.set(i, blockIndex[i] + numSamplesToWrite); + samplesWritten += numSamplesToWrite; - // for (int i = 0; i < buffer.getNumChannels(); i++) - // { + } else // there's not enough space left in this block for all remaining samples + { - // if (getChannel(i)->getRecordState()) - // { - // // write buffer to disk! - // writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), - // getChannel(i)->sourceNodeId, - // i); + numSamplesToWrite = BLOCK_LENGTH - blockIndex[i]; - // //std::cout << "Record channel " << i << std::endl; - // } - // } + // write buffer to disk! + writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten), + numSamplesToWrite, + i); - // // update our variables - // samplesWritten += numSamplesToWrite; - // timestamp += numSamplesToWrite; - // blockIndex = 0; // back to the beginning of the block + // update our variables + samplesWritten += numSamplesToWrite; + timestamp += numSamplesToWrite; + blockIndex.set(i,0); // back to the beginning of the block + } + } + + } + } - // } - // } } -void OriginalRecording::writeContinuousBuffer(const float* data, int sourceNodeId, int channel) +void OriginalRecording::writeContinuousBuffer(const float* data, int nSamples, int channel) { // check to see if the file exists if (fileArray[channel] == nullptr) return; - int nSamples = (*numSamples)[sourceNodeId]; - // 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, (*numSamples)[sourceNodeId]); + AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples); if (blockIndex[channel] == 0) { - writeTimestampAndSampleCount(fileArray[channel], sourceNodeId); + writeTimestampAndSampleCount(fileArray[channel], getChannel(channel)->sourceNodeId); } diskWriteLock.enter(); @@ -515,6 +485,8 @@ void OriginalRecording::writeContinuousBuffer(const float* data, int sourceNodeI nSamples, // count fileArray[channel]); // ptr to FILE object + //std::cout << channel << " : " << nSamples << " : " << count << std::endl; + jassert(count == nSamples); // make sure all the data was written diskWriteLock.exit(); diff --git a/Source/Processors/RecordNode/OriginalRecording.h b/Source/Processors/RecordNode/OriginalRecording.h index ba22fe75eb60c604c8ec555874f2c91da522c865..9e9b07b7e4f9e8455bb09304ff534843999e9904 100644 --- a/Source/Processors/RecordNode/OriginalRecording.h +++ b/Source/Processors/RecordNode/OriginalRecording.h @@ -43,7 +43,7 @@ public: String getEngineID(); void openFiles(File rootFolder, int experimentNumber, int recordingNumber); void closeFiles(); - void writeData(AudioSampleBuffer& buffer, int nSamples); + void writeData(AudioSampleBuffer& buffer); void writeEvent(int eventType, MidiMessage& event, int samplePosition); void addChannel(int index, Channel* chan); void resetChannels(); @@ -57,7 +57,7 @@ private: String getFileName(Channel* ch); void openFile(File rootFolder, Channel* ch); String generateHeader(Channel* ch); - void writeContinuousBuffer(const float* data, int sourceNodeId, int channel); + void writeContinuousBuffer(const float* data, int nSamples, int channel); void writeTimestampAndSampleCount(FILE* file, int sourceNodeId); void writeRecordMarker(FILE* file); diff --git a/Source/Processors/RecordNode/RecordEngine.h b/Source/Processors/RecordNode/RecordEngine.h index c9fdd18371e29e98fb81c67c9ede45a22bee0fdd..343207134befb0f1bb7317a94a7a017f3507b669 100644 --- a/Source/Processors/RecordNode/RecordEngine.h +++ b/Source/Processors/RecordNode/RecordEngine.h @@ -91,9 +91,10 @@ public: /** 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 + each registered channel to determine which channels to actually write to disk. + The number of samples to write will be found in the numSamples object. */ - virtual void writeData(AudioSampleBuffer& buffer, int nSamples) = 0; + virtual void writeData(AudioSampleBuffer& buffer) = 0; /** Write a single event to disk. */ diff --git a/Source/Processors/RecordNode/RecordNode.cpp b/Source/Processors/RecordNode/RecordNode.cpp index c567a533e4eb00efd67f3eb2bf8886682f1b785b..cd7663bff8dd57f6186aa2f2d7871677ad236c2f 100755 --- a/Source/Processors/RecordNode/RecordNode.cpp +++ b/Source/Processors/RecordNode/RecordNode.cpp @@ -429,14 +429,13 @@ void RecordNode::process(AudioSampleBuffer& buffer, EVERY_ENGINE->updateTimestamps(×tamps); EVERY_ENGINE->updateNumSamples(&numSamples); - // FIRST: cycle through events -- extract the TTLs and the timestamps + // FIRST: cycle through events -- extract the TTLs checkForEvents(events); // SECOND: write channel data if (channelPointers.size() > 0) { - //EVERY_ENGINE->updateTimeStamp(getTimestamp(channelPointers)) - EVERY_ENGINE->writeData(buffer, 10); + EVERY_ENGINE->writeData(buffer); } // std::cout << nSamples << " " << samplesWritten << " " << blockIndex << std::endl;