diff --git a/Source/Processors/DataThreads/DataBuffer.h b/Source/Processors/DataThreads/DataBuffer.h index 2695ab61d314e6ebe38189f3c9d550bcf34e4886..dc088a63000497d09f14bce680bf50c5db12b7f8 100644 --- a/Source/Processors/DataThreads/DataBuffer.h +++ b/Source/Processors/DataThreads/DataBuffer.h @@ -28,6 +28,9 @@ private: AbstractFifo abstractFifo; AudioSampleBuffer buffer; int numChans; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataBuffer); + }; diff --git a/Source/Processors/DataThreads/DataThread.cpp b/Source/Processors/DataThreads/DataThread.cpp index a10c258dd7bd21d25339efbba1e28245187e2ee5..dd83b847c237fe7672fceedc8ffd7da0d43e3e2f 100644 --- a/Source/Processors/DataThreads/DataThread.cpp +++ b/Source/Processors/DataThreads/DataThread.cpp @@ -31,7 +31,10 @@ DataThread::DataThread(SourceNode* s) : Thread ("Data Thread"), dataBuffer(0) setPriority(10); } -DataThread::~DataThread() {} +DataThread::~DataThread() +{ + deleteAndZero(dataBuffer); +} void DataThread::run() { diff --git a/Source/Processors/DataThreads/DataThread.h b/Source/Processors/DataThreads/DataThread.h index a86cfa4e266065ad5aea5de7bb57c21770e5ad0d..001bb8e5fabc36645a5ea8c49a8792ebdf8b9448 100644 --- a/Source/Processors/DataThreads/DataThread.h +++ b/Source/Processors/DataThreads/DataThread.h @@ -64,6 +64,11 @@ public: SourceNode* sn; +private: + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataThread); + + }; diff --git a/Source/Processors/EventNode.cpp b/Source/Processors/EventNode.cpp index c0ee0c90e4c43a1a94d70feb0860804a312d188f..b36be29e73a6aa93391520d8b17e46d6faee1e11 100644 --- a/Source/Processors/EventNode.cpp +++ b/Source/Processors/EventNode.cpp @@ -69,7 +69,7 @@ void EventNode::process(AudioSampleBuffer &buffer, if (accumulator > getSampleRate()/Hz) { //std::cout << "Adding message." << std::endl; - addEvent(midiMessages, 10, i); + addEvent(midiMessages, TTL, i); accumulator = 0; } diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp index 2ffebde260de37c8b7bdf6f4692d049537c244f7..6fa0d3d360a485e3247826d0c65663e3c22dcfee 100644 --- a/Source/Processors/GenericProcessor.cpp +++ b/Source/Processors/GenericProcessor.cpp @@ -88,17 +88,16 @@ void GenericProcessor::resetConnections() wasConnected = false; } -void GenericProcessor::setNumSamples(MidiBuffer& midiMessages, int numberToAdd) { +void GenericProcessor::setNumSamples(MidiBuffer& midiMessages, int sampleIndex) { uint8 data[2]; - data[0] = numberToAdd >> 8; // most-significant byte - data[1] = numberToAdd & 0xFF; // least-significant byte + data[0] = BUFFER_SIZE; // most-significant byte + data[1] = nodeId; // least-significant byte midiMessages.addEvent(data, // spike data - sizeof(data), // total bytes - -1); // sample index - + 2, // total bytes + sampleIndex); // sample index } @@ -118,13 +117,13 @@ int GenericProcessor::getNumSamples(MidiBuffer& midiMessages) { while (i.getNextEvent (message, samplePosition)) { - int numbytes = message.getRawDataSize(); - uint8* dataptr = message.getRawData(); + uint8* dataptr = message.getRawData(); - if (message.getTimeStamp() < 0) - numRead = (*dataptr<<8) + *(dataptr+1); + if (*dataptr == BUFFER_SIZE) + { + numRead = message.getTimeStamp(); + } } - } return numRead; @@ -321,18 +320,11 @@ int GenericProcessor::checkForEvents(MidiBuffer& midiMessages) while (i.getNextEvent (message, samplePosition)) { - int numbytes = message.getRawDataSize(); - uint8* dataptr = message.getRawData(); + //int numbytes = message.getRawDataSize(); + uint8* dataptr = message.getRawData(); - //std::cout << " Bytes received: " << numbytes << std::endl; - //std::cout << " Message timestamp = " << message.getTimeStamp() << std::endl; + handleEvent(*dataptr, message); - if (message.getTimeStamp() >= 0) - { - int value = (*dataptr<<8) + *(dataptr+1); - //std::cout << " " << value << std::endl; - return value; - } } } @@ -341,12 +333,21 @@ int GenericProcessor::checkForEvents(MidiBuffer& midiMessages) } -void GenericProcessor::addEvent(MidiBuffer& midiMessages, int numberToAdd, int sampleNum) +void GenericProcessor::addEvent(MidiBuffer& midiMessages, + uint8 type, + int sampleNum, + uint8 eventId, + uint8 eventChannel, + uint8 numBytes, + uint8* eventData) { - uint8 data[2]; + uint8 data[4+numBytes]; - data[0] = numberToAdd >> 8; // most-significant byte - data[1] = numberToAdd & 0xFF; // least-significant byte + data[0] = type; // event type + data[1] = nodeId; // processor ID + data[2] = eventId; // event ID + data[3] = eventChannel; // event channel + memcpy(&data[4], eventData, numBytes); midiMessages.addEvent(data, // spike data sizeof(data), // total bytes diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h index a5742e6cabd5942c7f200ef2dabef7b114a698ee..bd6d1424cc9aad3dbdd3f85dd0f6360d83aa4143 100644 --- a/Source/Processors/GenericProcessor.h +++ b/Source/Processors/GenericProcessor.h @@ -158,17 +158,33 @@ public: virtual bool stillHasSource() {return true;} + bool isEnabled; + bool wasConnected; + virtual AudioSampleBuffer* getContinuousBuffer() {return 0;} virtual MidiBuffer* getEventBuffer() {return 0;} int nextAvailableChannel; - int checkForEvents(MidiBuffer& mb); - void addEvent(MidiBuffer& mb, int a, int b); - - bool isEnabled; - - bool wasConnected; + // event buffers + virtual int checkForEvents(MidiBuffer& mb); + virtual void addEvent(MidiBuffer& mb, + uint8 type, + int sampleNum, + uint8 eventID = 0, + uint8 eventChannel = 0, + uint8 numBytes = 0, + uint8* data = 0); + + virtual void handleEvent(int eventType, MidiMessage& event) {} + + enum eventTypes + { + BUFFER_SIZE = 0, + PARAMETER_CHANGE = 1, + TTL = 2, + SPIKE = 3 + }; int saveOrder; int loadOrder; @@ -202,15 +218,15 @@ public: virtual void generateDefaultChannelNames(StringArray&); virtual void update(); // default node updating - virtual void updateSettings() {}; + virtual void updateSettings() {} // custom node updating + + int nodeId; private: void processBlock (AudioSampleBuffer &buffer, MidiBuffer &midiMessages); const String name; - - int nodeId; int getNumSamples(MidiBuffer&); void setNumSamples(MidiBuffer&, int); diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp index fb313b3829dc7b4925009bdd6f7d2b72534ca613..c444d776a51e218e684a9581cf80c1bcde91c82d 100644 --- a/Source/Processors/LfpDisplayNode.cpp +++ b/Source/Processors/LfpDisplayNode.cpp @@ -100,6 +100,7 @@ void LfpDisplayNode::setParameter (int parameterIndex, float newValue) void LfpDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples) { // 1. place any new samples into the displayBuffer + int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex; if (nSamples < samplesLeft) diff --git a/Source/Processors/SourceNode.cpp b/Source/Processors/SourceNode.cpp index c964169f0b24d9dad8fccff3d34fda162dbb9d52..e22db7a14f7720cc7b432ce45ef06bcb51293873 100644 --- a/Source/Processors/SourceNode.cpp +++ b/Source/Processors/SourceNode.cpp @@ -27,7 +27,7 @@ SourceNode::SourceNode(const String& name_) : GenericProcessor(name_), - dataThread(0), + dataThread(0), inputBuffer(0), sourceCheckInterval(2000), wasDisabled(true) { if (getName().equalsIgnoreCase("Intan Demo Board")) { @@ -55,14 +55,14 @@ SourceNode::SourceNode(const String& name_) SourceNode::~SourceNode() { - //if (dataThread != 0) - // deleteAndZero(dataThread); - - //config->removeDataSource(this); } void SourceNode::updateSettings() { + if (inputBuffer == 0 && dataThread != 0) + { + inputBuffer = dataThread->getBufferAddress(); + } } @@ -122,7 +122,6 @@ void SourceNode::timerCallback() //stopTimer(); // check for input source every two seconds enabledState(true); GenericEditor* ed = getEditor(); - //ed->enable(); getEditorViewport()->makeEditorVisible(ed); } } else { @@ -130,7 +129,6 @@ void SourceNode::timerCallback() std::cout << "No input source found." << std::endl; enabledState(false); GenericEditor* ed = getEditor(); - //ed->disable(); getEditorViewport()->makeEditorVisible(ed); } } @@ -161,29 +159,6 @@ bool SourceNode::enable() { stopTimer(); - - - // bool return_code = true; - - // if (getName().equalsIgnoreCase("Intan Demo Board")) { - - // dataThread = new IntanThread(); - // inputBuffer = dataThread->getBufferAddress(); - // return_code = dataThread->threadStarted(); - - // if (!return_code) - // deleteAndZero(dataThread); - - // } else if (getName().equalsIgnoreCase("Custom FPGA")) { - // dataThread = new FPGAThread(); - // inputBuffer = dataThread->getBufferAddress(); - // } else if (getName().equalsIgnoreCase("File Reader")) { - // dataThread = new FileReaderThread(); - // inputBuffer = dataThread->getBufferAddress(); - // } - - // return return_code; - } bool SourceNode::disable() { @@ -217,22 +192,14 @@ void SourceNode::acquisitionStopped() } -void SourceNode::process(AudioSampleBuffer &outputBuffer, - MidiBuffer &midiMessages, +void SourceNode::process(AudioSampleBuffer &buffer, + MidiBuffer &events, int& nSamples) { - - //std::cout << "Source node processing." << std::endl; - //std::cout << outputBuffer.getNumChannels() << " " << outputBuffer.getNumSamples() << std::endl; - - outputBuffer.clear(); - nSamples = inputBuffer->readAllFromBuffer(outputBuffer,outputBuffer.getNumSamples()); - // //setNumSamples(numRead); // write the total number of samples - // setNumSamples(midiMessages, numRead); - //std::cout << numRead << std::endl; - - //addMidiEvent(midiMessages,10, 10); + buffer.clear(); + nSamples = inputBuffer->readAllFromBuffer(buffer,buffer.getNumSamples()); + } diff --git a/Source/Processors/SpikeDetector.h b/Source/Processors/SpikeDetector.h index 8d0a1059e24a74ec24d3edd90b56b5a5c7d42073..770ed5800acc4749afc7ea94f1cab679d5b510ca 100644 --- a/Source/Processors/SpikeDetector.h +++ b/Source/Processors/SpikeDetector.h @@ -31,8 +31,6 @@ /** - --UNDER CONSTRUCTION-- - Detects spikes in a continuous signal and outputs events containing the spike data. @see GenericProcessor, SpikeDetectorEditor diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.cpp b/Source/Processors/Visualization/LfpDisplayCanvas.cpp index 2609c2d4f03e0f41f5865335d6f7ea0d5cc79779..3c54ef979d269713d83b13c47b8401d9c4882e56 100644 --- a/Source/Processors/Visualization/LfpDisplayCanvas.cpp +++ b/Source/Processors/Visualization/LfpDisplayCanvas.cpp @@ -92,6 +92,12 @@ void LfpDisplayCanvas::update() if (nChans < 200 && nChans > 0) screenBuffer->setSize(nChans, 10000); //sampleRate = processor->getSampleRate(); + + screenBuffer->clear(); + + repaint(); + + totalHeight = (plotHeight+yBuffer)*nChans + yBuffer; }