diff --git a/Builds/Linux/build/windowState.xml b/Builds/Linux/build/windowState.xml index 38dad57e4e40f3f0460d946e2ad333503f29dc2c..3488bf5bf021bfbe29f2e82add4a1ccad002fcaf 100644 --- a/Builds/Linux/build/windowState.xml +++ b/Builds/Linux/build/windowState.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <MAINWINDOW> - <BOUNDS x="1729" y="52" w="1161" h="968" fullscreen="0"/> + <BOUNDS x="1739" y="52" w="1181" h="831" fullscreen="0"/> </MAINWINDOW> diff --git a/Source/Processors/DataThreads/DataThread.cpp b/Source/Processors/DataThreads/DataThread.cpp index 0f31a883ee7c209c62380c56187af9463d7cd02c..c165ad233eaf006de02119167e6507abdd5dd747 100644 --- a/Source/Processors/DataThreads/DataThread.cpp +++ b/Source/Processors/DataThreads/DataThread.cpp @@ -9,8 +9,13 @@ */ #include "DataThread.h" +#include "../SourceNode.h" -DataThread::DataThread() : Thread ("Data Thread"), dataBuffer(0) {} + +DataThread::DataThread(SourceNode* s) : Thread ("Data Thread"), dataBuffer(0) +{ + sn = s; +} DataThread::~DataThread() {} @@ -21,8 +26,15 @@ void DataThread::run() { const MessageManagerLock mml (Thread::getCurrentThread()); if (! mml.lockWasGained()) return; - if (!updateBuffer()) + if (!updateBuffer()) { + std::cout << "Aquisition error...stopping thread." << std::endl; signalThreadShouldExit(); + //stopAcquisition(); + std::cout << "Notifying source node to stop acqusition." << std::endl; + sn->acquisitionStopped(); + } + // + } } diff --git a/Source/Processors/DataThreads/DataThread.h b/Source/Processors/DataThreads/DataThread.h index 33d1975730aa30cae168ab12475098bf975dc7eb..9f269fbee3bd939ce6b0904854e33c224075d437 100644 --- a/Source/Processors/DataThreads/DataThread.h +++ b/Source/Processors/DataThreads/DataThread.h @@ -15,12 +15,14 @@ #include <stdio.h> #include "DataBuffer.h" +class SourceNode; + class DataThread : public Thread { public: - DataThread(); + DataThread(SourceNode* sn); ~DataThread(); void run(); @@ -37,6 +39,8 @@ public: virtual int getNumChannels() = 0; virtual float getSampleRate() = 0; + SourceNode* sn; + }; diff --git a/Source/Processors/DataThreads/FPGAThread.cpp b/Source/Processors/DataThreads/FPGAThread.cpp index 59b5b18ffeb066669c211e28acbfd4788cb1c6e2..485e978bdb69f72e67d88e92799c61a6d597fdd9 100644 --- a/Source/Processors/DataThreads/FPGAThread.cpp +++ b/Source/Processors/DataThreads/FPGAThread.cpp @@ -10,7 +10,7 @@ #include "FPGAThread.h" -FPGAThread::FPGAThread() : DataThread(), +FPGAThread::FPGAThread(SourceNode* sn) : DataThread(sn), isRunning(false), numchannels(32), m_u32SegmentSize(1048576) diff --git a/Source/Processors/DataThreads/FPGAThread.h b/Source/Processors/DataThreads/FPGAThread.h index bf68110a5e4089c45316596ce7a0f9dc87d50c3f..04e9f371bb6448eedf35c08a84bdf815a8e7888e 100644 --- a/Source/Processors/DataThreads/FPGAThread.h +++ b/Source/Processors/DataThreads/FPGAThread.h @@ -22,11 +22,14 @@ #include "okFrontPanelDLL.h" #include "DataThread.h" + +class SourceNode; + class FPGAThread : public DataThread { public: - FPGAThread(); + FPGAThread(SourceNode* sn); ~FPGAThread(); bool foundInputSource() {return true;} diff --git a/Source/Processors/DataThreads/FileReaderThread.cpp b/Source/Processors/DataThreads/FileReaderThread.cpp index 905793497af84bab6c9799a13bc9aa9bed57886a..09dace080f614c5f82f4ac5dec55efc72581a37e 100644 --- a/Source/Processors/DataThreads/FileReaderThread.cpp +++ b/Source/Processors/DataThreads/FileReaderThread.cpp @@ -11,7 +11,7 @@ #include "FileReaderThread.h" -FileReaderThread::FileReaderThread() : DataThread(), +FileReaderThread::FileReaderThread(SourceNode* sn) : DataThread(sn), sampleRate(40000.0), numChannels(16), samplesPerBlock(1024) diff --git a/Source/Processors/DataThreads/FileReaderThread.h b/Source/Processors/DataThreads/FileReaderThread.h index d98afa06ac0918ba2d0100eaea199788b23b42bc..676167341212275b437fc3ae3fe31d4b45dcf773 100644 --- a/Source/Processors/DataThreads/FileReaderThread.h +++ b/Source/Processors/DataThreads/FileReaderThread.h @@ -17,11 +17,14 @@ #include <stdio.h> #include "DataThread.h" + +class SourceNode; + class FileReaderThread : public DataThread { public: - FileReaderThread(); + FileReaderThread(SourceNode* sn); ~FileReaderThread(); bool foundInputSource() {return true;} diff --git a/Source/Processors/DataThreads/IntanThread.cpp b/Source/Processors/DataThreads/IntanThread.cpp index 607b4fe092a1b1b3e56b1207b7477f0dec586894..fec0ac7dba9eab52f97a278f9eb89e8d3eca54f6 100644 --- a/Source/Processors/DataThreads/IntanThread.cpp +++ b/Source/Processors/DataThreads/IntanThread.cpp @@ -10,7 +10,7 @@ #include "IntanThread.h" -IntanThread::IntanThread() : DataThread(), +IntanThread::IntanThread(SourceNode* sn) : DataThread(sn), vendorID(0x0403), productID(0x6010), baudrate(115200), @@ -29,7 +29,7 @@ IntanThread::IntanThread() : DataThread(), IntanThread::~IntanThread() { - closeUSB(); + //closeUSB(); deleteAndZero(dataBuffer); } @@ -70,17 +70,33 @@ bool IntanThread::foundInputSource() bool IntanThread::startAcquisition() { + closeUSB(); + initializeUSB(false); ftdi_write_data(&ftdic, &startCode, 1); startThread(); + + return true; } bool IntanThread::stopAcquisition() { - stopThread(500); + std::cout << "Received signal to terminate thread." << std::endl; + + if (isThreadRunning()) { + signalThreadShouldExit(); + } + + std::cout << "Thread stopped successfully, stopping Intan Board." << std::endl; - ftdi_write_data(&ftdic, &stopCode, 1); - unsigned char buf[4097]; // has to be bigger than the on-chip buffer - ftdi_read_data(&ftdic, buf, sizeof(buf)); + int return_value; + + if ((return_value = ftdi_write_data(&ftdic, &stopCode, 1)) > 0) { + unsigned char buf[4097]; // has to be bigger than the on-chip buffer + ftdi_read_data(&ftdic, buf, sizeof(buf)); + closeUSB(); + } + + return true; } @@ -150,6 +166,7 @@ bool IntanThread::updateBuffer() // >0 : number of bytes read if ((bytes_read = ftdi_read_data(&ftdic, buffer, sizeof(buffer))) < 0) { + std::cout << "NO DATA FOUND!" << std::endl; return false; } diff --git a/Source/Processors/DataThreads/IntanThread.h b/Source/Processors/DataThreads/IntanThread.h index 557e08d957173166c10863a865469127672b520a..6b9bb8ee4da2d4b992ed12b5a4e2356418ef0626 100644 --- a/Source/Processors/DataThreads/IntanThread.h +++ b/Source/Processors/DataThreads/IntanThread.h @@ -16,11 +16,13 @@ #include <stdio.h> #include "DataThread.h" +class SourceNode; + class IntanThread : public DataThread { public: - IntanThread(); + IntanThread(SourceNode* sn); ~IntanThread(); bool foundInputSource(); diff --git a/Source/Processors/DataThreads/NetworkThread.cpp b/Source/Processors/DataThreads/NetworkThread.cpp index 25a1e7a4288cf423e0949e29401c1142543d5058..d02538c25997839a77865a393305e44d6c4935f3 100644 --- a/Source/Processors/DataThreads/NetworkThread.cpp +++ b/Source/Processors/DataThreads/NetworkThread.cpp @@ -10,7 +10,7 @@ #include "NetworkThread.h" -NetworkThread::NetworkThread() : DataThread() +NetworkThread::NetworkThread(SourceNode* sn) : DataThread(sn) { char host[] = "10.121.43.47"; char port[] = "5227"; diff --git a/Source/Processors/DataThreads/NetworkThread.h b/Source/Processors/DataThreads/NetworkThread.h index 65ab10c5c0138926c68cead4c93b05b0754fb400..e1989bdb8d015fbc7e1efc1373f5f7ba6aaef083 100644 --- a/Source/Processors/DataThreads/NetworkThread.h +++ b/Source/Processors/DataThreads/NetworkThread.h @@ -25,7 +25,7 @@ class NetworkThread : public DataThread { public: - NetworkThread(); + NetworkThread(SourceNode* sn); ~NetworkThread(); bool foundInputSource() {return true;} diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp index b478fa9d986731b2445749a3de070738361135a7..13e6d78b4274db3b6cbd29898841091f31f5ea2d 100644 --- a/Source/Processors/ProcessorGraph.cpp +++ b/Source/Processors/ProcessorGraph.cpp @@ -113,6 +113,7 @@ void* ProcessorGraph::createNewProcessor(String& description)//, processor->setFilterViewport(filterViewport); processor->setConfiguration(config); processor->addActionListener(messageCenter); + processor->setUIComponent(UI); addNode(processor,id); // have to add it so it can be deleted by the graph diff --git a/Source/Processors/SourceNode.cpp b/Source/Processors/SourceNode.cpp index 7b81329da15958d1f5888c3030b0668e9a2580e3..ef09b9c3c702e6a1fc3234517e98efae69853f66 100644 --- a/Source/Processors/SourceNode.cpp +++ b/Source/Processors/SourceNode.cpp @@ -19,11 +19,11 @@ SourceNode::SourceNode(const String& name_) sourceCheckInterval(1500) { if (getName().equalsIgnoreCase("Intan Demo Board")) { - dataThread = new IntanThread(); + dataThread = new IntanThread(this); } else if (getName().equalsIgnoreCase("Custom FPGA")) { - dataThread = new FPGAThread(); + dataThread = new FPGAThread(this); } else if (getName().equalsIgnoreCase("File Reader")) { - dataThread = new FileReaderThread(); + dataThread = new FileReaderThread(this); } setNumInputs(0); @@ -211,6 +211,15 @@ bool SourceNode::disable() { return true; } +void SourceNode::acquisitionStopped() +{ + std::cout << "Source node sending signal to UI." << std::endl; + UI->disableCallbacks(); + enabledState(false); + GenericEditor* ed = (GenericEditor*) getEditor(); + viewport->updateVisibleEditors(ed, 4); +} + void SourceNode::process(AudioSampleBuffer &outputBuffer, MidiBuffer &midiMessages, diff --git a/Source/Processors/SourceNode.h b/Source/Processors/SourceNode.h index 40cad49f459c397d4ab743e7a34af33c5c27cda4..5605d2c49a369455f700c31302680f87d47d56b5 100644 --- a/Source/Processors/SourceNode.h +++ b/Source/Processors/SourceNode.h @@ -19,6 +19,7 @@ #include "DataThreads/FPGAThread.h" #include "DataThreads/FileReaderThread.h" #include "GenericProcessor.h" +#include "../UI/UIComponent.h" class SourceNode : public GenericProcessor, public Timer @@ -54,6 +55,8 @@ public: bool disable(); bool isSource() {return true;} + + void acquisitionStopped(); private: diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp index 70167f3ae72e7ca8b1c45ce5ab2dfa5fa63fd0c8..acec62bad96153ddc12277ddfb1994fee002b0ff 100644 --- a/Source/UI/ControlPanel.cpp +++ b/Source/UI/ControlPanel.cpp @@ -268,6 +268,24 @@ void ControlPanel::buttonClicked(Button* button) } +void ControlPanel::disableCallbacks() +{ + + std::cout << "Control panel received signal to disable callbacks." << std::endl; + + if (audio->callbacksAreActive()) + { + std::cout << "Stopping audio." << std::endl; + audio->endCallbacks(); + std::cout << "Disabling processors." << std::endl; + graph->disableProcessors(); + std::cout << "Updating control panel." << std::endl; + cpuMeter->updateCPU(0.0f); + playButton->setToggleState(false,false); + recordButton->setToggleState(false,false); + } +} + void ControlPanel::actionListenerCallback(const String & msg) { //std::cout << "Message Received." << std::endl; diff --git a/Source/UI/ControlPanel.h b/Source/UI/ControlPanel.h index 32c37a627d0b0fc9c026283e51a9ae053b25c965..5a2fbce0e8f7fdb0362bc902a721c4649ec47bac 100644 --- a/Source/UI/ControlPanel.h +++ b/Source/UI/ControlPanel.h @@ -86,6 +86,8 @@ public: ControlPanel(ProcessorGraph* graph, AudioComponent* audio); ~ControlPanel(); + void disableCallbacks(); + private: PlayButton* playButton; RecordButton* recordButton; diff --git a/Source/UI/UIComponent.cpp b/Source/UI/UIComponent.cpp index 8e0259b9bf465108ed20568e4efffa9fbcc6b3b3..8a9879abfc05613e824ae93988419ca78e45e073 100644 --- a/Source/UI/UIComponent.cpp +++ b/Source/UI/UIComponent.cpp @@ -45,6 +45,7 @@ UIComponent::UIComponent (ProcessorGraph* pgraph, AudioComponent* audio_) messageCenter = new MessageCenter(); processorGraph->addActionListener(messageCenter); + addActionListener(messageCenter); addAndMakeVisible(messageCenter); std::cout << "Created message center." << std::endl; @@ -100,4 +101,10 @@ void UIComponent::resized() if (messageCenter != 0) messageCenter->setBounds(40,h-40,w-160,30); +} + +void UIComponent::disableCallbacks() +{ + //sendActionMessage("Data acquisition terminated."); + controlPanel->disableCallbacks(); } \ No newline at end of file diff --git a/Source/UI/UIComponent.h b/Source/UI/UIComponent.h index 2a9ecf1e1ad6b735f745044b355ef7fe0893b435..226cd657a4765f85ec8f22e19962fe5e071ba117 100644 --- a/Source/UI/UIComponent.h +++ b/Source/UI/UIComponent.h @@ -25,7 +25,7 @@ class UIComponent : public Component, - //public ActionBroadcaster, + public ActionBroadcaster, public DragAndDropContainer // required for // drag-and-drop // internal components @@ -40,6 +40,7 @@ public: Configuration* getConfiguration() {return config;} //void transmitMessage(const String& message); + void disableCallbacks(); private: