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