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:
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) {