Skip to content
Snippets Groups Projects
Commit 3ea7283d authored by jsiegle's avatar jsiegle
Browse files

Reduced CPU consumption on FileReaderThread

parent 3b698e39
No related branches found
No related tags found
No related merge requests found
...@@ -24,18 +24,22 @@ ...@@ -24,18 +24,22 @@
#include "FileReaderThread.h" #include "FileReaderThread.h"
FileReaderThread::FileReaderThread(SourceNode* sn) : DataThread(sn), FileReaderThread::FileReaderThread(SourceNode* sn) : DataThread(sn)
sampleRate(40000.0),
numChannels(16),
samplesPerBlock(1024)
{ {
File file = File("./data_stream_16ch"); //File file = File("./data_stream_16ch");
input = file.createInputStream(); //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; std::cout << "File Reader Thread initialized." << std::endl;
...@@ -45,44 +49,78 @@ FileReaderThread::~FileReaderThread() { ...@@ -45,44 +49,78 @@ FileReaderThread::~FileReaderThread() {
deleteAndZero(input); deleteAndZero(input);
//deleteAndZero(dataBuffer); }
bool FileReaderThread::foundInputSource()
{
return true;
}
int FileReaderThread::getNumChannels()
{
return 16;
}
float FileReaderThread::getSampleRate()
{
return 40000.0f;
} }
bool FileReaderThread::startAcquisition() bool FileReaderThread::startAcquisition()
{ {
startThread(); startThread();
return true;
} }
bool FileReaderThread::stopAcquisition() 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() 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++) { int chan = 0;
if (input->isExhausted())
input->setPosition(0);
thisSample[ch%numChannels] = float(input->readShort())/80000.0f;
} 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; return true;
} }
...@@ -26,8 +26,9 @@ ...@@ -26,8 +26,9 @@
#include "../../../JuceLibraryCode/JuceHeader.h" #include "../../../JuceLibraryCode/JuceHeader.h"
#include <ftdi.h>
#include <stdio.h> #include <stdio.h>
#include <time.h>
#include "DataThread.h" #include "DataThread.h"
/** /**
...@@ -50,26 +51,28 @@ public: ...@@ -50,26 +51,28 @@ public:
FileReaderThread(SourceNode* sn); FileReaderThread(SourceNode* sn);
~FileReaderThread(); ~FileReaderThread();
bool foundInputSource() {return true;} bool foundInputSource();// {return true;}
bool startAcquisition(); bool startAcquisition();
bool stopAcquisition(); bool stopAcquisition();
int getNumChannels() {return 16;} int getNumChannels();// {return 16;}
float getSampleRate() {return 40000.0;} float getSampleRate();// {return 40000.0;}
private: private:
float sampleRate;
int numChannels;
int samplesPerBlock; int samplesPerBlock;
int lengthOfInputFile; int lengthOfInputFile;
int playHead; int playHead;
FileInputStream* input; FILE* input;
//FileInputStream* input;
float thisSample[16]; float thisSample[16];
float readBuffer[1600]; int16 readBuffer[1600];
int bufferSize;
bool updateBuffer(); bool updateBuffer();
......
...@@ -163,8 +163,8 @@ void RecordNode::setParameter (int parameterIndex, float newValue) ...@@ -163,8 +163,8 @@ void RecordNode::setParameter (int parameterIndex, float newValue)
isRecording = false; isRecording = false;
std::cout << "STOP RECORDING." << std::endl; std::cout << "STOP RECORDING." << std::endl;
// close necessary files // DANGER
for (int i = 0; i < continuousChannels.size(); i++) for (int i = 0; i < jmin(int(continuousChannels.size()), 32); i++)
{ {
if (continuousChannels[i].isRecording) if (continuousChannels[i].isRecording)
{ {
......
...@@ -202,6 +202,8 @@ void SourceNode::process(AudioSampleBuffer &buffer, ...@@ -202,6 +202,8 @@ void SourceNode::process(AudioSampleBuffer &buffer,
int& nSamples) int& nSamples)
{ {
//std::cout << "SOURCE NODE" << std::endl;
buffer.clear(); buffer.clear();
nSamples = inputBuffer->readAllFromBuffer(buffer,buffer.getNumSamples()); nSamples = inputBuffer->readAllFromBuffer(buffer,buffer.getNumSamples());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment