From 854897fc5f6a4d0b9935d88bf889a3f8c988b196 Mon Sep 17 00:00:00 2001 From: bruceperens Date: Fri, 13 Dec 2013 01:57:11 +0000 Subject: [PATCH] Main connects drivers, and enumerates them. The program still doesn't do any work at this point, but the structure for ma git-svn-id: https://svn.code.sf.net/p/freetel/code@1341 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/source/audio_input.cpp | 2 +- freedv-server/source/audio_output.cpp | 2 +- freedv-server/source/audio_sink.cpp | 4 +- freedv-server/source/blank_panel.cpp | 4 +- freedv-server/source/driver_manager.cpp | 90 ++++++++++++++++++++---- freedv-server/source/drivers.h | 37 +++++++++- freedv-server/source/keying.cpp | 2 +- freedv-server/source/keying_sink.cpp | 4 +- freedv-server/source/main.cpp | 93 +++++++++---------------- freedv-server/source/ptt_constant.cpp | 4 +- freedv-server/source/ptt_input.cpp | 2 +- freedv-server/source/run.cpp | 9 +++ freedv-server/source/text_constant.cpp | 4 +- freedv-server/source/text_input.cpp | 2 +- freedv-server/source/tone.cpp | 4 +- freedv-server/source/user_interface.cpp | 2 +- 16 files changed, 172 insertions(+), 93 deletions(-) create mode 100644 freedv-server/source/run.cpp diff --git a/freedv-server/source/audio_input.cpp b/freedv-server/source/audio_input.cpp index 9a2704d7..423446be 100644 --- a/freedv-server/source/audio_input.cpp +++ b/freedv-server/source/audio_input.cpp @@ -15,4 +15,4 @@ namespace FreeDV { { return false; } -}; +} diff --git a/freedv-server/source/audio_output.cpp b/freedv-server/source/audio_output.cpp index 47c79a6b..bf87e2a8 100644 --- a/freedv-server/source/audio_output.cpp +++ b/freedv-server/source/audio_output.cpp @@ -15,4 +15,4 @@ namespace FreeDV { { return false; } -}; +} diff --git a/freedv-server/source/audio_sink.cpp b/freedv-server/source/audio_sink.cpp index 77641fed..60e8b3c5 100644 --- a/freedv-server/source/audio_sink.cpp +++ b/freedv-server/source/audio_sink.cpp @@ -56,8 +56,8 @@ namespace FreeDV { static bool initializer() { - driver_manager.register_audio_output("sink", creator); + init_driver_manager().register_audio_output("sink", creator); return true; } static const bool initialized = initializer(); -}; +} diff --git a/freedv-server/source/blank_panel.cpp b/freedv-server/source/blank_panel.cpp index 3c749364..321a1454 100644 --- a/freedv-server/source/blank_panel.cpp +++ b/freedv-server/source/blank_panel.cpp @@ -27,8 +27,8 @@ namespace FreeDV { static bool initializer() { - driver_manager.register_user_interface("blank-panel", creator); + init_driver_manager().register_user_interface("blank-panel", creator); return true; } static const bool initialized = initializer(); -}; +} diff --git a/freedv-server/source/driver_manager.cpp b/freedv-server/source/driver_manager.cpp index 11e991dc..2990a6e5 100644 --- a/freedv-server/source/driver_manager.cpp +++ b/freedv-server/source/driver_manager.cpp @@ -6,7 +6,6 @@ using namespace std; namespace FreeDV { // Global instance of the driver manager used to register // drivers and to create driver instances. - DriverManager driver_manager; DriverManager::DriverManager() { @@ -16,76 +15,139 @@ namespace FreeDV { { } + void + DriverManager::print(ostream & s) + { + s << "AudioInput: "; + for (auto i = audio_input_drivers.begin(); i != audio_input_drivers.end(); i++ ) + s << i->first << " "; + s << endl; + s << "AudioOutput: "; + for (auto i = audio_output_drivers.begin(); i != audio_output_drivers.end(); i++ ) + s << i->first << " "; + s << endl; + s << "Keying: "; + for (auto i = keying_drivers.begin(); i != keying_drivers.end(); i++ ) + s << i->first << " "; + s << endl; + s << "TextInput: "; + for (auto i = text_input_drivers.begin(); i != text_input_drivers.end(); i++ ) + s << i->first << " "; + s << endl; + s << "PTTInput: "; + for (auto i = ptt_input_drivers.begin(); i != ptt_input_drivers.end(); i++ ) + s << i->first << " "; + s << endl; + s << "UserInterface: "; + for (auto i = user_interface_drivers.begin(); i != user_interface_drivers.end(); i++ ) + s << i->first << " "; + s << endl; + } + AudioInput * DriverManager::audio_input(const char * driver, const char * parameter) { - return 0; + AudioInput * (* const creator)(const char * parameter) = audio_input_drivers[driver]; + + if(creator) + return creator(parameter); + else + return 0; } AudioOutput * DriverManager::audio_output(const char * driver, const char * parameter) { - return 0; } Keying * DriverManager::keying(const char * driver, const char * parameter) { - return 0; + Keying * (* const creator)(const char * parameter) = keying_drivers[driver]; + + if(creator) + return creator(parameter); + else + return 0; } PTTInput * DriverManager::ptt_input(const char * driver, const char * parameter) { - return 0; + PTTInput * (* const creator)(const char * parameter) = ptt_input_drivers[driver]; + + if(creator) + return creator(parameter); + else + return 0; } TextInput * DriverManager::text_input(const char * driver, const char * parameter) { - return 0; + TextInput * (* const creator)(const char * parameter) = text_input_drivers[driver]; + + if(creator) + return creator(parameter); + else + return 0; } UserInterface * DriverManager::user_interface(const char * driver, const char * parameter) { - return 0; + UserInterface * (* const creator)(const char * parameter) = user_interface_drivers[driver]; + + if(creator) + return creator(parameter); + else + return 0; } void DriverManager::register_audio_input(const char * driver, AudioInput * (*creator)(const char *)) { - clog << "Registered audio input driver \"" << driver << "\"." << endl; + audio_input_drivers[driver] = creator; } void DriverManager::register_audio_output(const char * driver, AudioOutput * (*creator)(const char *)) { - clog << "Registered audio output driver \"" << driver << "\"." << endl; + audio_output_drivers[driver] = creator; } void DriverManager::register_keying(const char * driver, Keying * (*creator)(const char *)) { - clog << "Registered keying driver \"" << driver << "\"." << endl; + keying_drivers[driver] = creator; } void DriverManager::register_ptt_input(const char * driver, PTTInput * (*creator)(const char *)) { - clog << "Registered PTT driver \"" << driver << "\"." << endl; + ptt_input_drivers[driver] = creator; } void DriverManager::register_text_input(const char * driver, TextInput * (*creator)(const char *)) { - clog << "Registered text input driver \"" << driver << "\"." << endl; + text_input_drivers[driver] = creator; } void DriverManager::register_user_interface(const char * driver, UserInterface * (*creator)(const char *)) { - clog << "Registered user interface driver \"" << driver << "\"." << endl; + user_interface_drivers[driver] = creator; + } + + // This has to be a function to get around the static initalization order problem. + DriverManager & + init_driver_manager() + { + static DriverManager manager; + return manager; } -}; + + DriverManager & driver_manager = init_driver_manager(); +} diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index 36ee07a6..1988a2cd 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -3,6 +3,10 @@ */ #include +#include +#include +#include + namespace FreeDV { class AudioInput { @@ -131,11 +135,38 @@ namespace FreeDV { virtual PTTInput * ptt_input(); }; + class Interfaces { + public: + Interfaces() : user_interface(0), keying(0), loudspeaker(0), microphone(0), + ptt(0), receiver(0), text(0), transmitter(0), mode(0) + { + } + + UserInterface * user_interface; + Keying * keying; + AudioOutput * loudspeaker; + AudioInput * microphone; + PTTInput * ptt; + AudioInput * receiver; + TextInput * text; + AudioOutput * transmitter; + const char * mode; + }; + class DriverManager { + private: + std::map audio_input_drivers; + std::map audio_output_drivers; + std::map keying_drivers; + std::map ptt_input_drivers; + std::map text_input_drivers; + std::map user_interface_drivers; public: DriverManager(); ~DriverManager(); + void print(std::ostream &); + AudioInput * audio_input(const char * driver, const char * parameter); AudioOutput * audio_output(const char * driver, const char * parameter); Keying * keying(const char * driver, const char * parameter); @@ -151,5 +182,7 @@ namespace FreeDV { void register_user_interface(const char * driver, UserInterface * (*creator)(const char *)); }; - extern DriverManager driver_manager; -}; + extern DriverManager & driver_manager; + // This version has to be called from static initializers. + extern DriverManager & init_driver_manager(); +} diff --git a/freedv-server/source/keying.cpp b/freedv-server/source/keying.cpp index 51748810..bebcbda2 100644 --- a/freedv-server/source/keying.cpp +++ b/freedv-server/source/keying.cpp @@ -9,4 +9,4 @@ namespace FreeDV { Keying::~Keying() { } -}; +} diff --git a/freedv-server/source/keying_sink.cpp b/freedv-server/source/keying_sink.cpp index 8b48f2e8..062bd44b 100644 --- a/freedv-server/source/keying_sink.cpp +++ b/freedv-server/source/keying_sink.cpp @@ -36,8 +36,8 @@ namespace FreeDV { static bool initializer() { - driver_manager.register_keying("sink", creator); + init_driver_manager().register_keying("sink", creator); return true; } static const bool initialized = initializer(); -}; +} diff --git a/freedv-server/source/main.cpp b/freedv-server/source/main.cpp index 3cc9b579..7d266289 100644 --- a/freedv-server/source/main.cpp +++ b/freedv-server/source/main.cpp @@ -13,11 +13,15 @@ #include "drivers.h" using namespace std; +namespace FreeDV { + extern int run(struct Interfaces *); +} using namespace FreeDV; + static void drivers() { - cout << "To be implemented." << endl; + driver_manager.print(cout); } static void help(const char * name) @@ -54,58 +58,30 @@ static void help(const char * name) cerr << "\nUsage: " << name << message << endl; } -struct parameters { - const char * * interface; - const char * * keying; - const char * * loudspeaker; - const char * * microphone; - const char * mode; - const char * * ptt; - const char * * receiver; - const char * * text; - const char * * transmitter; +static const struct option options[] = { + { "drivers", no_argument, 0, 'd' }, + { "help", no_argument, 0, 'h' }, + { "interface", required_argument, 0, 'i' }, + { "keying", required_argument, 0, 'k' }, + { "loudspeaker", required_argument, 0, 'l' }, + { "microphone", required_argument, 0, 'm' }, + { "mode", required_argument, 0, 'n' }, + { "ptt", required_argument, 0, 'p' }, + { "receiver", required_argument, 0, 'r' }, + { "text", required_argument, 0, 'x' }, + { "transmitter", required_argument, 0, 't' }, + { 0, 0, 0, 0 } }; -struct interfaces { - UserInterface * interface; - Keying * keying; - AudioOutput * loudspeaker; - AudioInput * microphone; - PTTInput * ptt; - AudioInput * receiver; - TextInput * text; - AudioOutput * transmitter; -}; - -static int run(struct parameters * p) -{ - return 0; -} - int main(int argc, char * * argv) { - int command; - struct parameters p = { 0,0,0,0,0,0,0,0,0 }; - - static const struct option options[] = { - { "drivers", no_argument, 0, 'd' }, - { "help", no_argument, 0, 'h' }, - { "interface", required_argument, 0, 'i' }, - { "keying", required_argument, 0, 'k' }, - { "loudspeaker", required_argument, 0, 'l' }, - { "microphone", required_argument, 0, 'm' }, - { "mode", required_argument, 0, 'n' }, - { "ptt", required_argument, 0, 'p' }, - { "receiver", required_argument, 0, 'r' }, - { "text", required_argument, 0, 'x' }, - { "transmitter", required_argument, 0, 't' }, - { 0, 0, 0, 0 } - }; + int command; + Interfaces i; + const char * driver; + const char * parameter; if ( argc > 1 ) { - const char * * vector(new const char *[2]); - while ((command = getopt_long(argc, argv, "dhi:k:l:m:n:p:r:t:x:", options, NULL)) != -1) { switch (command) { case 'i': @@ -124,8 +100,8 @@ main(int argc, char * * argv) } *colon = 0; - vector[0] = optarg; - vector[1] = &colon[1]; + driver = optarg; + parameter = &colon[1]; } switch (command) { @@ -139,31 +115,31 @@ main(int argc, char * * argv) exit(1); break; case 'i': - p.interface = vector; + i.user_interface = driver_manager.user_interface(driver, parameter); break; case 'k': - p.keying = vector; + i.keying = driver_manager.keying(driver, parameter); break; case 'l': - p.loudspeaker = vector; + i.loudspeaker = driver_manager.audio_output(driver, parameter); break; case 'm': - p.microphone = vector; + i.microphone = driver_manager.audio_input(driver, parameter); break; case 'n': - p.mode = optarg; + i.mode = optarg; break; case 'p': - p.ptt = vector; + i.ptt = driver_manager.ptt_input(driver, parameter); break; case 'r': - p.receiver = vector; + i.receiver = driver_manager.audio_input(driver, parameter); break; case 't': - p.transmitter = vector; + i.transmitter = driver_manager.audio_output(driver, parameter); break; case 'x': - p.text = vector; + i.text = driver_manager.text_input(driver, parameter); break; case 0: break; @@ -174,6 +150,5 @@ main(int argc, char * * argv) help(argv[0]); exit(1); } - run(&p); - return 0; + return run(&i); } diff --git a/freedv-server/source/ptt_constant.cpp b/freedv-server/source/ptt_constant.cpp index c0ba0890..f1e9ead5 100644 --- a/freedv-server/source/ptt_constant.cpp +++ b/freedv-server/source/ptt_constant.cpp @@ -27,8 +27,8 @@ namespace FreeDV { static bool initializer() { - driver_manager.register_ptt_input("constant", creator); + init_driver_manager().register_ptt_input("constant", creator); return true; } static const bool initialized = initializer(); -}; +} diff --git a/freedv-server/source/ptt_input.cpp b/freedv-server/source/ptt_input.cpp index f5a050b3..012261b7 100644 --- a/freedv-server/source/ptt_input.cpp +++ b/freedv-server/source/ptt_input.cpp @@ -15,4 +15,4 @@ namespace FreeDV { { return false; } -}; +} diff --git a/freedv-server/source/run.cpp b/freedv-server/source/run.cpp new file mode 100644 index 00000000..615eef6a --- /dev/null +++ b/freedv-server/source/run.cpp @@ -0,0 +1,9 @@ +#include "drivers.h" + +namespace FreeDV { + int + run(Interfaces * i) + { + return 0; + } +} diff --git a/freedv-server/source/text_constant.cpp b/freedv-server/source/text_constant.cpp index b5b0e2bf..ddef165f 100644 --- a/freedv-server/source/text_constant.cpp +++ b/freedv-server/source/text_constant.cpp @@ -27,8 +27,8 @@ namespace FreeDV { static bool initializer() { - driver_manager.register_text_input("constant", creator); + init_driver_manager().register_text_input("constant", creator); return true; } static const bool initialized = initializer(); -}; +} diff --git a/freedv-server/source/text_input.cpp b/freedv-server/source/text_input.cpp index bffc9fa3..b1f95669 100644 --- a/freedv-server/source/text_input.cpp +++ b/freedv-server/source/text_input.cpp @@ -20,4 +20,4 @@ namespace FreeDV { TextInput::set(const char *) { } -}; +} diff --git a/freedv-server/source/tone.cpp b/freedv-server/source/tone.cpp index 703f03f7..9a289086 100644 --- a/freedv-server/source/tone.cpp +++ b/freedv-server/source/tone.cpp @@ -53,8 +53,8 @@ namespace FreeDV { static bool initializer() { - driver_manager.register_audio_input("tone", creator); + init_driver_manager().register_audio_input("tone", creator); return true; } static const bool initialized = initializer(); -}; +} diff --git a/freedv-server/source/user_interface.cpp b/freedv-server/source/user_interface.cpp index 0ebe5cbd..0e86b7b5 100644 --- a/freedv-server/source/user_interface.cpp +++ b/freedv-server/source/user_interface.cpp @@ -33,4 +33,4 @@ namespace FreeDV { { return 0; } -}; +} -- 2.25.1