From c4979562c5c99455b27e5dc8d0a8505d09fa3454 Mon Sep 17 00:00:00 2001
From: jsiegle <joshs@alleninstitute.org>
Date: Wed, 29 Oct 2014 20:54:19 -0700
Subject: [PATCH] Fix original recording

---
 .../Processors/RecordNode/HDF5Recording.cpp   |   6 +-
 Source/Processors/RecordNode/HDF5Recording.h  |   2 +-
 .../RecordNode/OriginalRecording.cpp          | 100 +++++++-----------
 .../Processors/RecordNode/OriginalRecording.h |   4 +-
 Source/Processors/RecordNode/RecordEngine.h   |   5 +-
 Source/Processors/RecordNode/RecordNode.cpp   |   5 +-
 6 files changed, 49 insertions(+), 73 deletions(-)

diff --git a/Source/Processors/RecordNode/HDF5Recording.cpp b/Source/Processors/RecordNode/HDF5Recording.cpp
index ff4f33f17..a6a45d41a 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 eea2359f8..07e7e19ab 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 07453f8e1..10003f98b 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 ba22fe75e..9e9b07b7e 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 c9fdd1837..343207134 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 c567a533e..cd7663bff 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(&timestamps);
         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;
-- 
GitLab