zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 207676179e69c4d399ba971eee5c225bcbd35349
parent 3f7d778606d2c75b90a7c5d7beb87d6a31b969c8
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Tue,  4 May 2010 11:48:20 -0400

WIP: Nio command line options

Testing/Refactoring remains

Diffstat:
Msrc/Nio/EngineMgr.cpp | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/Nio/EngineMgr.h | 11++++++++++-
Msrc/Nio/InMgr.h | 1+
Msrc/Nio/NulEngine.cpp | 2+-
Msrc/Nio/NulEngine.h | 6+++++-
Msrc/Nio/OutMgr.cpp | 2++
Msrc/Nio/OutMgr.h | 3+--
Msrc/main.cpp | 31+++++++------------------------
8 files changed, 89 insertions(+), 31 deletions(-)

diff --git a/src/Nio/EngineMgr.cpp b/src/Nio/EngineMgr.cpp @@ -1,8 +1,10 @@ #include "EngineMgr.h" #include <algorithm> #include <iostream> +#include "InMgr.h" #include "OutMgr.h" #include "AudioOut.h" +#include "MidiIn.h" #include "NulEngine.h" #if OSS #include "OssEngine.h" @@ -23,6 +25,8 @@ EngineMgr *sysEngine; EngineMgr::EngineMgr() { + Engine *defaultEng; + //conditional compiling mess (but contained) engines.push_back(defaultEng = new NulEngine(sysOut)); #if OSS @@ -42,7 +46,6 @@ EngineMgr::EngineMgr() #if JACK #if JACK_DEFAULT engines.push_back(defaultEng = new JackEngine(sysOut)); - cout << "jack go" << endl; #else engines.push_back(new JackEngine(sysOut)); #endif @@ -55,6 +58,9 @@ EngineMgr::EngineMgr() #endif #endif + defaultOut = dynamic_cast<AudioOut *>(defaultEng); + + defaultIn = dynamic_cast<MidiIn *>(defaultEng); }; EngineMgr::~EngineMgr() @@ -77,10 +83,64 @@ Engine *EngineMgr::getEng(string name) return NULL; } +void EngineMgr::start() +{ + if(!(defaultOut&&defaultIn)) { + cerr << "ERROR: It looks like someone broke the Nio Output\n" + << " Attempting to recover by defaulting to the\n" + << " Null Engine." << endl; + defaultOut = dynamic_cast<AudioOut *>(getEng("NULL")); + defaultIn = dynamic_cast<MidiIn *>(getEng("NULL")); + } + + sysOut->currentOut = defaultOut; + sysIn->current = defaultIn; + + //open up the default output(s) + defaultOut->setAudioEn(true); + if(defaultOut->getAudioEn()) { + cerr << "ERROR: The default audio output failed to open!" << endl; + } + else { //recover + sysOut->currentOut = dynamic_cast<AudioOut *>(sysEngine->getEng("NULL")); + sysOut->currentOut->setAudioEn(true); + } + + defaultIn->setMidiEn(true); + if(defaultIn->getMidiEn()) { + cerr << "ERROR: The default MIDI input failed to open!" << endl; + } + else { //recover + sysIn->current = dynamic_cast<MidiIn *>(sysEngine->getEng("NULL")); + sysIn->current->setMidiEn(true); + } +} + void EngineMgr::stop() { for(list<Engine*>::iterator itr = engines.begin(); - itr != engines.end(); ++itr) + itr != engines.end(); ++itr) (*itr)->Stop(); } +bool EngineMgr::setInDefault(string name) +{ + MidiIn *chosen; + if((chosen = dynamic_cast<MidiIn *>(getEng(name)))){ //got the input + defaultIn = chosen; + return true; + } + return false; +} + +bool EngineMgr::setOutDefault(string name) +{ + AudioOut *chosen; + if((chosen = dynamic_cast<AudioOut *>(getEng(name)))){ //got the output + defaultOut = chosen; + return true; + } + return false; +} + + diff --git a/src/Nio/EngineMgr.h b/src/Nio/EngineMgr.h @@ -21,12 +21,21 @@ struct EngineMgr */ Engine *getEng(std::string name); + /**Start up defaults*/ + void start(); + /**Stop all engines*/ void stop(); std::list<Engine *> engines; - Engine *defaultEng;/**<The default output*/ + //return false on failure + bool setInDefault(std::string name); + bool setOutDefault(std::string name); + + //default I/O + AudioOut *defaultOut; + MidiIn *defaultIn; }; extern EngineMgr *sysEngine; diff --git a/src/Nio/InMgr.h b/src/Nio/InMgr.h @@ -37,6 +37,7 @@ class InMgr std::string getSource() const; + friend class EngineMgr; private: SafeQueue<MidiEvent> queue; sem_t work; diff --git a/src/Nio/NulEngine.cpp b/src/Nio/NulEngine.cpp @@ -41,7 +41,7 @@ void *NulEngine::_AudioThread(void *arg) } void *NulEngine::AudioThread() -{ +{ while(pThread) { const Stereo<Sample> smps = getNext(); diff --git a/src/Nio/NulEngine.h b/src/Nio/NulEngine.h @@ -27,8 +27,9 @@ #include <pthread.h> #include "../globals.h" #include "AudioOut.h" +#include "MidiIn.h" -class NulEngine: public AudioOut +class NulEngine: public AudioOut, MidiIn { public: NulEngine(OutMgr *out); @@ -40,6 +41,9 @@ class NulEngine: public AudioOut void setAudioEn(bool nval); bool getAudioEn() const; + void setMidiEn(bool){}; + bool getMidiEn() const{return true;}; + protected: void *AudioThread(); static void *_AudioThread(void *arg); diff --git a/src/Nio/OutMgr.cpp b/src/Nio/OutMgr.cpp @@ -97,6 +97,7 @@ string OutMgr::getDriver() const void OutMgr::run() { +#if 0 defaultOut = dynamic_cast<AudioOut *>(sysEngine->defaultEng); if(!defaultOut) { cerr << "ERROR: It looks like someone broke the Nio Output\n" @@ -114,6 +115,7 @@ void OutMgr::run() currentOut = defaultOut = dynamic_cast<AudioOut *>(sysEngine->getEng("NULL")); defaultOut->Start(); } +#endif } bool OutMgr::setSink(string name) diff --git a/src/Nio/OutMgr.h b/src/Nio/OutMgr.h @@ -45,14 +45,13 @@ class OutMgr std::string getSink() const; WavEngine *wave; /**<The Wave Recorder*/ + friend class EngineMgr; private: void addSmps(REALTYPE *l, REALTYPE *r); int storedSmps() const {return priBuffCurrent.l() - priBuf.l();}; void makeStale(unsigned int size); void removeStaleSmps(); - AudioOut *defaultOut;/**<The default output*/ - AudioOut *currentOut;/**<The current output driver*/ sem_t requested; diff --git a/src/main.cpp b/src/main.cpp @@ -198,13 +198,6 @@ void initprogram() //Initialize The Engines sysEngine = new EngineMgr(); - - //Run the system - sysOut->run(); -#warning remove welcome message when system is out of beta - cout << "\nThanks for using the Nio system :)" << endl; - - } /* @@ -458,34 +451,24 @@ int main(int argc, char *argv[]) } - //Select Drivers TODO abstract this a bit more if(!input.empty()) { - //upper case - transform(input.begin(), input.end(), input.begin(), ::toupper); - - MidiIn *chosen; - if((chosen = dynamic_cast<MidiIn *>(sysEngine->getEng(input)))) - cout << input << " selected" << endl, - sysIn->setSource(input); - else { + if(!sysEngine->setInDefault(input)) { cerr << "There is no input for " << input << endl; exit(1); } } if(!output.empty()) { - //upper case - transform(output.begin(), output.end(), output.begin(), ::toupper); - - AudioOut *chosen; - if((chosen = dynamic_cast<AudioOut *>(sysEngine->getEng(output)))) - cout << output << " selected" << endl, - sysOut->setSink(output); - else { + if(!sysEngine->setOutDefault(input)) { cerr << "There is no output for " << output << endl; exit(1); } } + //Run the Nio system + sysEngine->start(); //Drivers start your engines! + +#warning remove welcome message when system is out of beta + cout << "\nThanks for using the Nio system :)" << endl; #ifndef DISABLE_GUI if(noui == 0) {