zynaddsubfx

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

commit fc6b1b9780a53ce3ef1ea0c74ff04e873c54eb1b
parent 94c8d08b1b91f1e7c48db6afa41d7b9faa7af165
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Thu, 13 May 2010 10:32:54 -0400

Nio: Globals -> Singletons

* Globals sysNio, sysOut, sysIn, and sysEngine are now accessible using the
  singleton pattern of Class::getInstance()
* Master is now handled partially with the singleton pattern
* Signal Handler Added to main.cpp for testing purposes

Diffstat:
Msrc/Misc/Master.cpp | 5+++++
Msrc/Misc/Master.h | 4+++-
Msrc/Misc/Recorder.cpp | 11++++++-----
Msrc/Nio/AlsaEngine.cpp | 14+++++++-------
Msrc/Nio/AlsaEngine.h | 2+-
Msrc/Nio/AudioOut.cpp | 17++++++-----------
Msrc/Nio/AudioOut.h | 2+-
Msrc/Nio/EngineMgr.cpp | 38+++++++++++++++++++++-----------------
Msrc/Nio/EngineMgr.h | 6+++---
Msrc/Nio/InMgr.cpp | 23++++++++++++++---------
Msrc/Nio/InMgr.h | 12+++++-------
Msrc/Nio/JackEngine.cpp | 12++++++------
Msrc/Nio/JackEngine.h | 2+-
Msrc/Nio/MidiIn.cpp | 8++++----
Msrc/Nio/Nio.cpp | 45+++++++++++++++++++++------------------------
Msrc/Nio/Nio.h | 12++++++------
Msrc/Nio/NulEngine.cpp | 4++--
Msrc/Nio/NulEngine.h | 2+-
Msrc/Nio/OssEngine.cpp | 4++--
Msrc/Nio/OssEngine.h | 2+-
Msrc/Nio/OutMgr.cpp | 28++++++++++++++++------------
Msrc/Nio/OutMgr.h | 10++++------
Msrc/Nio/PaEngine.h | 1-
Msrc/Nio/WavEngine.cpp | 4++--
Msrc/Nio/WavEngine.h | 2+-
Msrc/UI/NioUI.cpp | 14++++++++------
Msrc/main.cpp | 33+++++++++++++++++++++++----------
27 files changed, 170 insertions(+), 147 deletions(-)

diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -119,6 +119,11 @@ bool Master::mutexLock(lockset request) return false; } +Master &Master::getInstance() +{ + static Master instance; + return instance; +} /* * Note On Messages (velocity=0 for NoteOff) diff --git a/src/Misc/Master.h b/src/Misc/Master.h @@ -50,11 +50,13 @@ typedef struct vuData_t { class Master { public: - /** Constructor*/ + /** Constructor TODO make private*/ Master(); /** Destructor*/ ~Master(); + static Master &getInstance(); + /**Saves all settings to a XML file * @return 0 for ok or <0 if there is an error*/ int saveXML(const char *filename); diff --git a/src/Misc/Recorder.cpp b/src/Misc/Recorder.cpp @@ -46,7 +46,7 @@ int Recorder::preparefile(std::string filename_, int overwrite) return 1; } - sysOut->wave->newFile(new WavFile(filename_, SAMPLE_RATE, 2)); + OutMgr::getInstance().wave->newFile(new WavFile(filename_, SAMPLE_RATE, 2)); status = 1; //ready @@ -61,15 +61,15 @@ void Recorder::start() void Recorder::stop() { - sysOut->wave->Stop(); - sysOut->wave->destroyFile(); + OutMgr::getInstance().wave->Stop(); + OutMgr::getInstance().wave->destroyFile(); status = 0; } void Recorder::pause() { status = 0; - sysOut->wave->Stop(); + OutMgr::getInstance().wave->Stop(); } int Recorder::recording() @@ -84,9 +84,10 @@ void Recorder::triggernow() { if(status == 2) { if(notetrigger!=1) { - sysOut->wave->Start(); + OutMgr::getInstance().wave->Start(); } notetrigger = 1; } } +#warning todo move recorder inside nio system diff --git a/src/Nio/AlsaEngine.cpp b/src/Nio/AlsaEngine.cpp @@ -28,8 +28,8 @@ using namespace std; #include "InMgr.h" #include "AlsaEngine.h" -AlsaEngine::AlsaEngine(OutMgr *out) - :AudioOut(out) +AlsaEngine::AlsaEngine() + :AudioOut() { name = "ALSA"; audio.handle = NULL; @@ -126,7 +126,7 @@ void *AlsaEngine::MidiThread(void) ev.channel = event->data.note.channel; ev.num = event->data.note.note; ev.value = event->data.note.velocity; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); } break; @@ -135,7 +135,7 @@ void *AlsaEngine::MidiThread(void) ev.channel = event->data.note.channel; ev.num = event->data.note.note; ev.value = 0; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case SND_SEQ_EVENT_PITCHBEND: @@ -143,7 +143,7 @@ void *AlsaEngine::MidiThread(void) ev.channel = event->data.control.channel; ev.num = C_pitchwheel; ev.value = event->data.control.value; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case SND_SEQ_EVENT_CONTROLLER: @@ -151,7 +151,7 @@ void *AlsaEngine::MidiThread(void) ev.channel = event->data.control.channel; ev.num = event->data.control.param; ev.value = event->data.control.value; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case SND_SEQ_EVENT_RESET: // reset to power-on state @@ -159,7 +159,7 @@ void *AlsaEngine::MidiThread(void) ev.channel = event->data.control.channel; ev.num = C_resetallcontrollers; ev.value = 0; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case SND_SEQ_EVENT_PORT_SUBSCRIBED: // ports connected diff --git a/src/Nio/AlsaEngine.h b/src/Nio/AlsaEngine.h @@ -34,7 +34,7 @@ class AlsaEngine : public AudioOut, MidiIn { public: - AlsaEngine(OutMgr *out); + AlsaEngine(); ~AlsaEngine(); bool Start(); diff --git a/src/Nio/AudioOut.cpp b/src/Nio/AudioOut.cpp @@ -32,23 +32,18 @@ using namespace std; struct AudioOut::Data { - Data(OutMgr *out); + Data(); int samplerate; int bufferSize; - - Stereo<Sample> current;/**<used for xrun defence*/ - - OutMgr *manager; }; -AudioOut::Data::Data(OutMgr *out) - :samplerate(SAMPLE_RATE),bufferSize(SOUND_BUFFER_SIZE), - current(Sample(SOUND_BUFFER_SIZE,0.0)),manager(out) +AudioOut::Data::Data() + :samplerate(SAMPLE_RATE),bufferSize(SOUND_BUFFER_SIZE) {} -AudioOut::AudioOut(OutMgr *out) - :dat(new Data(out)) +AudioOut::AudioOut() + :dat(new Data()) {} AudioOut::~AudioOut() @@ -85,7 +80,7 @@ int AudioOut::bufferingSize() const Stereo<Sample> AudioOut::getNext(bool wait) { - Stereo<REALTYPE *> tmp = sysOut->tick(dat->bufferSize); + Stereo<REALTYPE *> tmp = OutMgr::getInstance().tick(dat->bufferSize); //stop the samples return Stereo<Sample>(Sample(dat->bufferSize, tmp.l()), Sample(dat->bufferSize, tmp.r())); diff --git a/src/Nio/AudioOut.h b/src/Nio/AudioOut.h @@ -30,7 +30,7 @@ class AudioOut : public virtual Engine { public: - AudioOut(class OutMgr *out); + AudioOut(); virtual ~AudioOut(); /**Sets the Sample Rate of this Output diff --git a/src/Nio/EngineMgr.cpp b/src/Nio/EngineMgr.cpp @@ -21,46 +21,50 @@ using namespace std; -EngineMgr *sysEngine; +EngineMgr &EngineMgr::getInstance() +{ + static EngineMgr instance; + return instance; +} EngineMgr::EngineMgr() { Engine *defaultEng = NULL; //conditional compiling mess (but contained) - engines.push_back(defaultEng = new NulEngine(sysOut)); + engines.push_back(defaultEng = new NulEngine()); #if OSS #if OSS_DEFAULT - engines.push_back(defaultEng = new OssEngine(sysOut)); + engines.push_back(defaultEng = new OssEngine()); #else - engines.push_back(new OssEngine(sysOut)); + engines.push_back(new OssEngine()); #endif #endif #if ALSA #if ALSA_DEFAULT - engines.push_back(defaultEng = new AlsaEngine(sysOut)); + engines.push_back(defaultEng = new AlsaEngine()); #else - engines.push_back(new AlsaEngine(sysOut)); + engines.push_back(new AlsaEngine()); #endif #endif #if JACK #if JACK_DEFAULT - engines.push_back(defaultEng = new JackEngine(sysOut)); + engines.push_back(defaultEng = new JackEngine()); #else - engines.push_back(new JackEngine(sysOut)); + engines.push_back(new JackEngine()); #endif #endif #if PORTAUDIO #if PORTAUDIO_DEFAULT - engines.push_back(defaultEng = new PaEngine(sysOut)); + engines.push_back(defaultEng = new PaEngine()); #else - engines.push_back(new PaEngine(sysOut)); + engines.push_back(new PaEngine()); #endif #endif defaultOut = dynamic_cast<AudioOut *>(defaultEng); - defaultIn = dynamic_cast<MidiIn *>(defaultEng); + defaultIn = dynamic_cast<MidiIn *>(defaultEng); }; EngineMgr::~EngineMgr() @@ -93,8 +97,8 @@ void EngineMgr::start() defaultIn = dynamic_cast<MidiIn *>(getEng("NULL")); } - sysOut->currentOut = defaultOut; - sysIn->current = defaultIn; + OutMgr::getInstance().currentOut = defaultOut; + InMgr::getInstance().current = defaultIn; //open up the default output(s) cout << "Starting Audio: " << defaultOut->name << endl; @@ -104,8 +108,8 @@ void EngineMgr::start() } else { cerr << "ERROR: The default audio output failed to open!" << endl; - sysOut->currentOut = dynamic_cast<AudioOut *>(sysEngine->getEng("NULL")); - sysOut->currentOut->setAudioEn(true); + OutMgr::getInstance().currentOut = dynamic_cast<AudioOut *>(getEng("NULL")); + OutMgr::getInstance().currentOut->setAudioEn(true); } cout << "Starting MIDI: " << defaultIn->name << endl; @@ -115,8 +119,8 @@ void EngineMgr::start() } else { //recover cerr << "ERROR: The default MIDI input failed to open!" << endl; - sysIn->current = dynamic_cast<MidiIn *>(sysEngine->getEng("NULL")); - sysIn->current->setMidiEn(true); + InMgr::getInstance().current = dynamic_cast<MidiIn *>(getEng("NULL")); + InMgr::getInstance().current->setMidiEn(true); } } diff --git a/src/Nio/EngineMgr.h b/src/Nio/EngineMgr.h @@ -12,7 +12,7 @@ class OutMgr; /**Container/Owner of the long lived Engines*/ struct EngineMgr { - EngineMgr(); + static EngineMgr &getInstance(); ~EngineMgr(); /**Gets requested engine @@ -36,8 +36,8 @@ struct EngineMgr //default I/O AudioOut *defaultOut; MidiIn *defaultIn; + private: + EngineMgr(); }; - -extern EngineMgr *sysEngine; #endif diff --git a/src/Nio/InMgr.cpp b/src/Nio/InMgr.cpp @@ -6,8 +6,6 @@ using namespace std; -InMgr *sysIn; - ostream &operator<<(ostream &out, const MidiEvent& ev) { if(ev.type == M_NOTE) @@ -25,8 +23,14 @@ MidiEvent::MidiEvent() :channel(0),type(0),num(0),value(0) {} -InMgr::InMgr(Master *_master) - :queue(100), master(_master) +InMgr &InMgr::getInstance() +{ + static InMgr instance; + return instance; +} + +InMgr::InMgr() + :queue(100), master(Master::getInstance()) { current = NULL; sem_init(&work, PTHREAD_PROCESS_PRIVATE, 0); @@ -57,13 +61,13 @@ void InMgr::flush() dump.dumpnote(ev.channel, ev.num, ev.value); if(ev.value) - master->noteOn(ev.channel, ev.num, ev.value); + master.noteOn(ev.channel, ev.num, ev.value); else - master->noteOff(ev.channel, ev.num); + master.noteOff(ev.channel, ev.num); } else { dump.dumpcontroller(ev.channel, ev.num, ev.value); - master->setController(ev.channel, ev.num, ev.value); + master.setController(ev.channel, ev.num, ev.value); } } } @@ -84,7 +88,7 @@ bool InMgr::setSource(string name) //Keep system in a valid state (aka with a running driver) if(!success) - (current = dynamic_cast<MidiIn *>(sysEngine->getEng("NULL")))->setMidiEn(true); + (current = getIn("NULL"))->setMidiEn(true); return success; } @@ -99,6 +103,7 @@ string InMgr::getSource() const MidiIn *InMgr::getIn(string name) { - return dynamic_cast<MidiIn *>(sysEngine->getEng(name)); + EngineMgr &eng = EngineMgr::getInstance(); + return dynamic_cast<MidiIn *>(eng.getEng(name)); } diff --git a/src/Nio/InMgr.h b/src/Nio/InMgr.h @@ -19,13 +19,11 @@ struct MidiEvent int value; //velocity or controller value }; -class Master; -class MidiIn; //super simple class to manage the inputs class InMgr { public: - InMgr(Master *nmaster); + static InMgr &getInstance(); ~InMgr(); void putEvent(MidiEvent ev); @@ -39,15 +37,15 @@ class InMgr friend class EngineMgr; private: - MidiIn *getIn(std::string name); + InMgr(); + class MidiIn *getIn(std::string name); SafeQueue<MidiEvent> queue; sem_t work; - MidiIn *current; + class MidiIn *current; /**the link to the rest of zyn*/ - Master *master; + class Master &master; }; -extern InMgr *sysIn; #endif diff --git a/src/Nio/JackEngine.cpp b/src/Nio/JackEngine.cpp @@ -30,8 +30,8 @@ using namespace std; -JackEngine::JackEngine(OutMgr *out) - :AudioOut(out), jackClient(NULL) +JackEngine::JackEngine() + :AudioOut(), jackClient(NULL) { name = "JACK"; audio.jackSamplerate = 0; @@ -318,28 +318,28 @@ void JackEngine::handleMidi(unsigned long frames) ev.type = M_NOTE; ev.num = midi_data[1]; ev.value = 0; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case 0x90: /* note-on */ ev.type = M_NOTE; ev.num = midi_data[1]; ev.value = midi_data[2]; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case 0xB0: /* controller */ ev.type = M_CONTROLLER; ev.num = midi_data[1]; ev.value = midi_data[2]; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case 0xE0: /* pitch bend */ ev.type = M_CONTROLLER; ev.num = C_pitchwheel; ev.value = ((midi_data[2] << 7) | midi_data[1]); - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; /* XXX TODO: handle MSB/LSB controllers and RPNs and NRPNs */ diff --git a/src/Nio/JackEngine.h b/src/Nio/JackEngine.h @@ -34,7 +34,7 @@ typedef jack_default_audio_sample_t jsample_t; class JackEngine : public AudioOut, MidiIn { public: - JackEngine(OutMgr *out); + JackEngine(); ~JackEngine() { }; bool Start(); diff --git a/src/Nio/MidiIn.cpp b/src/Nio/MidiIn.cpp @@ -35,28 +35,28 @@ void MidiIn::midiProcess(unsigned char head, unsigned char num, unsigned char va ev.channel = chan; ev.num = num; ev.value = 0; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case 0x90: //Note On ev.type = M_NOTE; ev.channel = chan; ev.num = num; ev.value = value; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case 0xb0: //Controller ev.type = M_CONTROLLER; ev.channel = chan; ev.num = num; ev.value = value; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; case 0xe0: //Pitch Wheel ev.type = M_CONTROLLER; ev.channel = chan; ev.num = C_pitchwheel; ev.value = (num + value * (int) 128) - 8192; - sysIn->putEvent(ev); + InMgr::getInstance().putEvent(ev); break; } } diff --git a/src/Nio/Nio.cpp b/src/Nio/Nio.cpp @@ -7,34 +7,31 @@ #include <iostream> using namespace std; -Nio::Nio(class Master *master) +Nio &Nio::getInstance() { - //Enable input wrapper - in = sysIn = new InMgr(master); - - //Initialize the Output Systems - out = sysOut = new OutMgr(master); - - //Initialize The Engines - eng = sysEngine = new EngineMgr(); + static Nio instance; + return instance; } +Nio::Nio() +:in(InMgr::getInstance()),//Enable input wrapper + out(OutMgr::getInstance()),//Initialize the Output Systems + eng(EngineMgr::getInstance())//Initialize The Engines +{} + Nio::~Nio() { stop(); - delete out; - delete in; - delete eng; } void Nio::start() { - eng->start();//Drivers start your engines! + eng.start();//Drivers start your engines! } void Nio::stop() { - eng->stop(); + eng.stop(); } int Nio::setDefaultSource(string name) @@ -42,7 +39,7 @@ int Nio::setDefaultSource(string name) if(name.empty()) return 0; - if(!eng->setInDefault(name)) { + if(!eng.setInDefault(name)) { cerr << "There is no input for " << name << endl; return false; } @@ -56,7 +53,7 @@ int Nio::setDefaultSink(string name) if(name.empty()) return 0; - if(!eng->setOutDefault(name)) { + if(!eng.setOutDefault(name)) { cerr << "There is no output for " << name << endl; } cout << name << " selected." << endl; @@ -65,19 +62,19 @@ int Nio::setDefaultSink(string name) bool Nio::setSource(string name) { - return in->setSource(name); + return in.setSource(name); } bool Nio::setSink(string name) { - return out->setSink(name); + return out.setSink(name); } set<string> Nio::getSources() const { set<string> sources; - for(list<Engine *>::iterator itr = eng->engines.begin(); - itr != eng->engines.end(); ++itr) + for(list<Engine *>::iterator itr = eng.engines.begin(); + itr != eng.engines.end(); ++itr) if(dynamic_cast<MidiIn *>(*itr)) sources.insert((*itr)->name); return sources; @@ -86,8 +83,8 @@ set<string> Nio::getSources() const set<string> Nio::getSinks() const { set<string> sinks; - for(list<Engine *>::iterator itr = eng->engines.begin(); - itr != eng->engines.end(); ++itr) + for(list<Engine *>::iterator itr = eng.engines.begin(); + itr != eng.engines.end(); ++itr) if(dynamic_cast<AudioOut *>(*itr)) sinks.insert((*itr)->name); return sinks; @@ -95,11 +92,11 @@ set<string> Nio::getSinks() const string Nio::getSource() const { - return in->getSource(); + return in.getSource(); } string Nio::getSink() const { - return out->getSink(); + return out.getSink(); } diff --git a/src/Nio/Nio.h b/src/Nio/Nio.h @@ -9,7 +9,7 @@ class Nio { public: - Nio(class Master *master); + static Nio &getInstance(); ~Nio(); void start(); @@ -28,12 +28,12 @@ class Nio std::string getSink() const; private: - class EngineMgr *eng; - class OutMgr *out; - class InMgr *in; -}; + Nio(); -extern Nio *sysNio; + class InMgr &in; + class OutMgr &out; + class EngineMgr &eng; +}; #endif diff --git a/src/Nio/NulEngine.cpp b/src/Nio/NulEngine.cpp @@ -27,8 +27,8 @@ using namespace std; -NulEngine::NulEngine(OutMgr *out) - :AudioOut(out), pThread(NULL) +NulEngine::NulEngine() + :AudioOut(), pThread(NULL) { name = "NULL"; playing_until.tv_sec = 0; diff --git a/src/Nio/NulEngine.h b/src/Nio/NulEngine.h @@ -32,7 +32,7 @@ class NulEngine: public AudioOut, MidiIn { public: - NulEngine(OutMgr *out); + NulEngine(); ~NulEngine(); bool Start(); diff --git a/src/Nio/OssEngine.cpp b/src/Nio/OssEngine.cpp @@ -38,8 +38,8 @@ using namespace std; -OssEngine::OssEngine(OutMgr *out) - :AudioOut(out), engThread(NULL) +OssEngine::OssEngine() + :AudioOut(), engThread(NULL) { name = "OSS"; diff --git a/src/Nio/OssEngine.h b/src/Nio/OssEngine.h @@ -31,7 +31,7 @@ class OssEngine: public AudioOut, MidiIn { public: - OssEngine(OutMgr *out); + OssEngine(); ~OssEngine(); bool Start(); diff --git a/src/Nio/OutMgr.cpp b/src/Nio/OutMgr.cpp @@ -11,15 +11,19 @@ using namespace std; -OutMgr *sysOut; +OutMgr &OutMgr::getInstance() +{ + static OutMgr instance; + return instance; +} -OutMgr::OutMgr(Master *nmaster) - :wave(new WavEngine(this)), - priBuf(new REALTYPE[4096],new REALTYPE[4096]),priBuffCurrent(priBuf) +OutMgr::OutMgr() + :wave(new WavEngine()), + priBuf(new REALTYPE[4096],new REALTYPE[4096]),priBuffCurrent(priBuf),master(Master::getInstance()) { currentOut = NULL; stales = 0; - master = nmaster; + master = Master::getInstance(); //init samples outr = new REALTYPE[SOUND_BUFFER_SIZE]; @@ -45,15 +49,15 @@ OutMgr::~OutMgr() */ const Stereo<REALTYPE *> OutMgr::tick(unsigned int frameSize) { - pthread_mutex_lock(&(master->mutex)); - sysIn->flush(); - pthread_mutex_unlock(&(master->mutex)); + pthread_mutex_lock(&(master.mutex)); + InMgr::getInstance().flush(); + pthread_mutex_unlock(&(master.mutex)); //SysEv->execute(); removeStaleSmps(); while(frameSize > storedSmps()) { - pthread_mutex_lock(&(master->mutex)); - master->AudioOut(outl, outr); - pthread_mutex_unlock(&(master->mutex)); + pthread_mutex_lock(&(master.mutex)); + master.AudioOut(outl, outr); + pthread_mutex_unlock(&(master.mutex)); addSmps(outl,outr); } Stereo<REALTYPE *> ans = priBuffCurrent; @@ -65,7 +69,7 @@ const Stereo<REALTYPE *> OutMgr::tick(unsigned int frameSize) AudioOut *OutMgr::getOut(string name) { - return dynamic_cast<AudioOut *>(sysEngine->getEng(name)); + return dynamic_cast<AudioOut *>(EngineMgr::getInstance().getEng(name)); } string OutMgr::getDriver() const diff --git a/src/Nio/OutMgr.h b/src/Nio/OutMgr.h @@ -10,12 +10,10 @@ class AudioOut; -class WavEngine; -class Master; class OutMgr { public: - OutMgr(Master *nmaster); + static OutMgr &getInstance(); ~OutMgr(); /**Execute a tick*/ @@ -42,9 +40,10 @@ class OutMgr std::string getSink() const; - WavEngine *wave; /**<The Wave Recorder*/ + class WavEngine *wave; /**<The Wave Recorder*/ friend class EngineMgr; private: + OutMgr(); void addSmps(REALTYPE *l, REALTYPE *r); int storedSmps() const {return priBuffCurrent.l() - priBuf.l();}; void removeStaleSmps(); @@ -60,11 +59,10 @@ class OutMgr REALTYPE *outl; REALTYPE *outr; - Master *master; + class Master &master; int stales; }; -extern OutMgr *sysOut; #endif diff --git a/src/Nio/PaEngine.h b/src/Nio/PaEngine.h @@ -47,7 +47,6 @@ class PaEngine: public AudioOut }; -void PAaudiooutputinit(Master *master_); void PAfinish(); #endif diff --git a/src/Nio/WavEngine.cpp b/src/Nio/WavEngine.cpp @@ -25,8 +25,8 @@ using namespace std; -WavEngine::WavEngine(OutMgr *out) - :AudioOut(out), file(NULL), buffer(SAMPLE_RATE*2), pThread(NULL) +WavEngine::WavEngine() + :AudioOut(), file(NULL), buffer(SAMPLE_RATE*2), pThread(NULL) { sem_init(&work, PTHREAD_PROCESS_PRIVATE, 0); } diff --git a/src/Nio/WavEngine.h b/src/Nio/WavEngine.h @@ -32,7 +32,7 @@ class WavFile; class WavEngine: public AudioOut { public: - WavEngine(OutMgr *out); + WavEngine(); ~WavEngine(); bool openAudio(); diff --git a/src/UI/NioUI.cpp b/src/UI/NioUI.cpp @@ -37,10 +37,12 @@ NioUI::NioUI() } settings->end(); + Nio &nio = Nio::getInstance(); + //initialize midi list { - set<string> midiList = sysNio->getSources(); - string source = sysNio->getSource(); + set<string> midiList = nio.getSources(); + string source = nio.getSource(); int midival = 0; for(set<string>::iterator itr = midiList.begin(); itr != midiList.end(); ++itr) { @@ -53,8 +55,8 @@ NioUI::NioUI() //initialize audio list { - set<string> audioList = sysNio->getSinks(); - string sink = sysNio->getSink(); + set<string> audioList = nio.getSinks(); + string sink = nio.getInstance().getSink(); int audioval = 0; for(set<string>::iterator itr = audioList.begin(); itr != audioList.end(); ++itr) { @@ -77,13 +79,13 @@ void NioUI::refresh() void NioUI::midiCallback(Fl_Widget *c) { - bool good = sysNio->setSource(static_cast<Fl_Choice *>(c)->text()); + bool good = Nio::getInstance().setSource(static_cast<Fl_Choice *>(c)->text()); static_cast<Fl_Choice *>(c)->textcolor(fl_rgb_color(255*!good,0,0)); } void NioUI::audioCallback(Fl_Widget *c) { - bool good = sysNio->setSink(static_cast<Fl_Choice *>(c)->text()); + bool good = Nio::getInstance().setSink(static_cast<Fl_Choice *>(c)->text()); static_cast<Fl_Choice *>(c)->textcolor(fl_rgb_color(255*!good,0,0)); } diff --git a/src/main.cpp b/src/main.cpp @@ -24,6 +24,7 @@ #include <cmath> #include <cctype> #include <algorithm> +#include <signal.h> #include <unistd.h> #include <pthread.h> @@ -42,7 +43,6 @@ extern Dump dump; //Nio System #include "Nio/Nio.h" -Nio *sysNio, *nio; #ifndef DISABLE_GUI #ifdef QT_GUI @@ -164,6 +164,18 @@ void *thread4(void *arg) } #endif +void exitprogram(); + +//cleanup on signaled exit +void sigterm_exit(int sig) +{ + Pexitprogram = 1; + sleep(1); + exitprogram(); + exit(0); +} + + /* * Program initialisation */ @@ -182,11 +194,11 @@ void initprogram() for(int i = 0; i < SOUND_BUFFER_SIZE; i++) denormalkillbuf[i] = (RND - 0.5) * 1e-16; - master = new Master(); + master = &Master::getInstance(); master->swaplr = swaplr; - //Nio Initialization - sysNio = nio = new Nio(master); + signal(SIGINT, sigterm_exit); + signal(SIGTERM, sigterm_exit); } /* @@ -194,15 +206,15 @@ void initprogram() */ void exitprogram() { + //ensure that everything has stopped with the mutex wait pthread_mutex_lock(&master->mutex); pthread_mutex_unlock(&master->mutex); - nio->stop(); - delete nio; + + Nio::getInstance().stop(); #ifndef DISABLE_GUI delete ui; #endif - delete master; #ifdef USE_LASH delete lash; @@ -437,14 +449,15 @@ int main(int argc, char *argv[]) } } + Nio &nio = Nio::getInstance(); - if(nio->setDefaultSource(input)) + if(nio.setDefaultSource(input)) exit(1); - if(nio->setDefaultSink(output)) + if(nio.setDefaultSink(output)) exit(1); //Run the Nio system - nio->start(); + nio.start(); #warning remove welcome message when system is out of beta cout << "\nThanks for using the Nio system :)" << endl;