From 3ea7283dfd097d810a35a8e6d0b3d49719b232db Mon Sep 17 00:00:00 2001
From: jsiegle <jsiegle@mit.edu>
Date: Sat, 21 Apr 2012 15:45:46 -0400
Subject: [PATCH] Reduced CPU consumption on FileReaderThread

---
 .../DataThreads/FileReaderThread.cpp          | 86 +++++++++++++------
 .../Processors/DataThreads/FileReaderThread.h | 19 ++--
 Source/Processors/RecordNode.cpp              |  4 +-
 Source/Processors/SourceNode.cpp              |  2 +
 4 files changed, 77 insertions(+), 34 deletions(-)

diff --git a/Source/Processors/DataThreads/FileReaderThread.cpp b/Source/Processors/DataThreads/FileReaderThread.cpp
index 242093003..7e5e72d30 100644
--- a/Source/Processors/DataThreads/FileReaderThread.cpp
+++ b/Source/Processors/DataThreads/FileReaderThread.cpp
@@ -24,18 +24,22 @@
 
 #include "FileReaderThread.h"
 
-FileReaderThread::FileReaderThread(SourceNode* sn) : DataThread(sn),
-			sampleRate(40000.0),
-			numChannels(16),
-			samplesPerBlock(1024)
+FileReaderThread::FileReaderThread(SourceNode* sn) : DataThread(sn)
 
 {
-	File file = File("./data_stream_16ch");
-	input = file.createInputStream();
+	//File file = File("./data_stream_16ch");
+	//input = file.createInputStream();
+    bufferSize = 1600;
 
-   // lengthOfInputFile = file
+    input = fopen("./data_stream_16ch", "r");
 
-	dataBuffer = new DataBuffer(16, 4096);
+    fseek(input, 0, SEEK_END);
+    lengthOfInputFile = ftell(input);
+    rewind(input);
+
+	dataBuffer = new DataBuffer(16, bufferSize*3);
+
+   
 
 	std::cout << "File Reader Thread initialized." << std::endl;
 
@@ -45,44 +49,78 @@ FileReaderThread::~FileReaderThread() {
 
 	deleteAndZero(input);
 
-	//deleteAndZero(dataBuffer);
+}
 
+bool FileReaderThread::foundInputSource()
+{
+    return true;
+}
+
+int FileReaderThread::getNumChannels()
+{
+    return 16;
+}
+
+float FileReaderThread::getSampleRate()
+{
+    return 40000.0f;
 }
 
 bool FileReaderThread::startAcquisition()
 {
 	startThread();
 
+    return true;
+
 }
 
 bool FileReaderThread::stopAcquisition()
 {
-	stopThread(500);
-	std::cout << "File reader received disable signal." << std::endl;
+    std::cout << "File reader received disable signal." << std::endl;
+	if (isThreadRunning()) {
+        signalThreadShouldExit();
+    }
+	
+
+    return true;
+
 }
 
 bool FileReaderThread::updateBuffer()
 {
 
-	while (dataBuffer->getNumSamples() < 4096)
-	{
+	if (dataBuffer->getNumSamples() < bufferSize)
+	 {
+ //       // std::cout << dataBuffer->getNumSamples() << std::endl;
 
-       // if (input->getTotalLength())
+       if (ftell(input) >= lengthOfInputFile - bufferSize)
+       {
+           rewind(input);
+       }
 
-        //input->read(thisSample, 4*)
+         fread(readBuffer, 2, bufferSize, input);
 
-    	for (int ch = 0; ch < numChannels; ch++) {
-    		
-    		if (input->isExhausted())
-    			input->setPosition(0);   			
-    	
-    		thisSample[ch%numChannels] = float(input->readShort())/80000.0f;
+        int chan = 0;
 
-    	}
+        for (int n = 0; n < bufferSize; n++)
+        {
+            thisSample[chan] = float(readBuffer[n])/80000.0f;
 
-    	dataBuffer->addToBuffer(thisSample,1);
+            if (chan == 15)
+            {
+                dataBuffer->addToBuffer(thisSample,1);
+                chan = 0;
+            } else {
+                chan++;
+            }
 
-    }
+
+         }
+    	
+
+     } else {
+        wait(5); // pause for 5 ms
+     }
 
     return true;
 }
diff --git a/Source/Processors/DataThreads/FileReaderThread.h b/Source/Processors/DataThreads/FileReaderThread.h
index d7ac4beb8..7736565e9 100644
--- a/Source/Processors/DataThreads/FileReaderThread.h
+++ b/Source/Processors/DataThreads/FileReaderThread.h
@@ -26,8 +26,9 @@
 
 
 #include "../../../JuceLibraryCode/JuceHeader.h"
-#include <ftdi.h>
+
 #include <stdio.h>
+#include <time.h>
 #include "DataThread.h"
 
 /**
@@ -50,26 +51,28 @@ public:
 	FileReaderThread(SourceNode* sn);
 	~FileReaderThread();
 
-	bool foundInputSource() {return true;}
+	bool foundInputSource();// {return true;}
 	bool startAcquisition();
 	bool stopAcquisition();
-	int getNumChannels() {return 16;}
-	float getSampleRate() {return 40000.0;}
+	int getNumChannels();// {return 16;}
+	float getSampleRate();// {return 40000.0;}
 	
 private:
 
-	float sampleRate;
-	int numChannels;
 	int samplesPerBlock;
 
     int lengthOfInputFile;
 
     int playHead;
 
-	FileInputStream* input;
+    FILE* input;
+
+	//FileInputStream* input;
 
 	float thisSample[16];
-    float readBuffer[1600];
+    int16 readBuffer[1600];
+
+    int bufferSize;
 
 	bool updateBuffer();
 
diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp
index eb4d13d03..6af5c8491 100644
--- a/Source/Processors/RecordNode.cpp
+++ b/Source/Processors/RecordNode.cpp
@@ -163,8 +163,8 @@ void RecordNode::setParameter (int parameterIndex, float newValue)
  		isRecording = false;
  		std::cout << "STOP RECORDING." << std::endl;
 
- 		// close necessary files
- 		for (int i = 0; i < continuousChannels.size(); i++)
+ 		// DANGER
+ 		for (int i = 0; i < jmin(int(continuousChannels.size()), 32); i++)
  		{
  			if (continuousChannels[i].isRecording)
  			{
diff --git a/Source/Processors/SourceNode.cpp b/Source/Processors/SourceNode.cpp
index 3fa8e709d..58bd61f40 100644
--- a/Source/Processors/SourceNode.cpp
+++ b/Source/Processors/SourceNode.cpp
@@ -202,6 +202,8 @@ void SourceNode::process(AudioSampleBuffer &buffer,
                             int& nSamples)
 {
 	
+	//std::cout << "SOURCE NODE" << std::endl;
+
 	 buffer.clear();
 	 nSamples = inputBuffer->readAllFromBuffer(buffer,buffer.getNumSamples());
 	
-- 
GitLab