Main Page   Class Hierarchy   Compound List   File List   Compound Members   Related Pages  

gapeaccumulator.cpp

00001 #include "gapeaccumulator.h"
00002 #include <limits.h>
00003 
00004 GapeAccumulator::GapeAccumulator(int numSamples)
00005 : GapeUnit(NULL),
00006 resizeSize(numSamples),
00007 //resizeNeeded(false) {
00008 tickCounter(INT_MAX) {
00009     if (numSamples <= 0) {
00010         numSamples = 1;
00011         GapeConsts::reportError("Invalid number of samples in GapeAccumulator constructor, gapeaccumulator.cpp line 33\n");
00012     }
00013     d_numSamples = numSamples;
00014     d_writeIndex = 0;
00015     d_samples = new GapeFloat[d_numSamples];
00016 }
00017 
00018 GapeAccumulator::~GapeAccumulator() { delete[] d_samples; }
00019 
00020 
00021 void GapeAccumulator::receiveTick( const GapeFloat* values, int numValues ) {
00022     // handled by next case, but faster.
00023     if(numValues == 0) return;
00024 
00025 
00026     //more terse code for thread safety and to keep critcal section small...
00027     if (tickCounter >= GapeConsts::updateMutexPeriod) {
00028         bool needResize = false;
00029         int newSize;
00030         d_mutex.lock();
00031         if (resizeSize != d_numSamples) {
00032             needResize = true;
00033             newSize = resizeSize;
00034         }
00035         d_mutex.unlock();
00036         if (needResize) {
00037             adjustBuffers(newSize);
00038         }
00039         tickCounter = 0;
00040     }
00041 
00042     const GapeFloat*  readptr = values;
00043     int   numunaccumulated   = numValues;
00044     int   numtocopy;
00045 
00046     while(true) {
00047         // if we have space to write all values to d_samples,
00048         // just do so and break.
00049         if(numunaccumulated < spaceRemaining() ) {
00050             memcpy(d_samples + d_writeIndex, readptr,
00051             numunaccumulated * sizeof(GapeFloat));
00052             d_writeIndex     += numunaccumulated;
00053             break;
00054         } else {
00055             numtocopy = spaceRemaining();
00056             memcpy(d_samples + d_writeIndex, readptr,
00057             numtocopy * sizeof(GapeFloat));
00058             readptr += numtocopy;
00059             d_writeIndex = 0;
00060             numunaccumulated -= numtocopy;
00061             emit emitTick(d_samples, d_numSamples);
00062         }
00063     }
00064     tickCounter++;
00065 }
00066 
00067 
00068 
00069 void GapeAccumulator::adjustBuffers(int newSize) {
00070     if (newSize <= 0) {
00071             newSize = 1;
00072             GapeConsts::reportError("Invalid number of samples in GapeAccumulator adjustBuffers, gapeaccumulator.cpp line 79\n");
00073     }
00074 
00075     int numTimesSmaller = d_writeIndex / newSize; // truncated.
00076 
00077     // if new size is smaller, send out newSize buffers
00078     // as many times as it takes to get the existing
00079     // samples within the new range.
00080     int numEmitted = 0;
00081     for(int i = 0; i < numTimesSmaller; ++i) {
00082      emit emitTick(d_samples + (i * newSize), newSize);
00083      numEmitted += newSize;
00084     }
00085 
00086     GapeFloat* temp = new GapeFloat[newSize];
00087     d_writeIndex -= numEmitted;
00088 
00089     memcpy(temp, d_samples + numEmitted,
00090     d_writeIndex * sizeof(GapeFloat));
00091 
00092     delete[] d_samples;
00093     d_samples = temp;
00094     d_numSamples = newSize;
00095 }
00096 
00097 
00098 
00099 //this function and the whole flag structure here is for threading issues. mutex.lock() would
00100 //have been more desirable but it's too slow to use every sample and this works just as well.
00101 void GapeAccumulator::resizeAccumulator( int newSize ) {
00102     if (newSize <= 0) {
00103         newSize = 1;
00104         GapeConsts::reportError("Invalid number of samples in GapeAccumulator resize, gapeaccumulator.cpp line 79\n");
00105     }
00106     d_mutex.lock();
00107     resizeSize = newSize;
00108     d_mutex.unlock();
00109 }

Generated at Thu Jun 21 13:28:49 2001 for GAPE by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001