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:
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 ∈
+ class OutMgr &out;
+ class EngineMgr ŋ
+};
#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;