Main connects drivers, and enumerates them. The program still doesn't do any work...
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 13 Dec 2013 01:57:11 +0000 (01:57 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 13 Dec 2013 01:57:11 +0000 (01:57 +0000)
structure for ma

git-svn-id: https://svn.code.sf.net/p/freetel/code@1341 01035d8c-6547-0410-b346-abe4f91aad63

16 files changed:
freedv-server/source/audio_input.cpp
freedv-server/source/audio_output.cpp
freedv-server/source/audio_sink.cpp
freedv-server/source/blank_panel.cpp
freedv-server/source/driver_manager.cpp
freedv-server/source/drivers.h
freedv-server/source/keying.cpp
freedv-server/source/keying_sink.cpp
freedv-server/source/main.cpp
freedv-server/source/ptt_constant.cpp
freedv-server/source/ptt_input.cpp
freedv-server/source/run.cpp [new file with mode: 0644]
freedv-server/source/text_constant.cpp
freedv-server/source/text_input.cpp
freedv-server/source/tone.cpp
freedv-server/source/user_interface.cpp

index 9a2704d7d68078f3eee77112dc2bd3ebec08232a..423446be5cb319d37514083a4938bf402afed535 100644 (file)
@@ -15,4 +15,4 @@ namespace FreeDV {
   {
     return false;
   }
-};
+}
index 47c79a6b7756382043695d98fb11f79941ae118a..bf87e2a819322c931586fd96a831be8c6ad1628e 100644 (file)
@@ -15,4 +15,4 @@ namespace FreeDV {
   {
     return false;
   }
-};
+}
index 77641fed109250a0f1bf741b525824770f87665f..60e8b3c5f5509d73244075af963e75554174b60a 100644 (file)
@@ -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();
-};
+}
index 3c749364007d43063ca9797e07ecf91ac6bfcd7e..321a14544ed69ed3bb8cb19a6a05eaac66f929b0 100644 (file)
@@ -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();
-};
+}
index 11e991dc2d7640e498e022630454f2c980ada48b..2990a6e5232f1a5617e637c5c37bf8c184610e2c 100644 (file)
@@ -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();
+}
index 36ee07a6d796407392b9935378141c2c58356b73..1988a2cdf90430dae5c43af890b9dfee12a8793a 100644 (file)
@@ -3,6 +3,10 @@
  */
 
 #include <stdlib.h>
+#include <iostream>
+#include <map>
+#include <string>
+
 
 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<std::string, AudioInput *(*)(const char *)> audio_input_drivers;
+                       std::map<std::string, AudioOutput *(*)(const char *)> audio_output_drivers;
+                       std::map<std::string, Keying *(*)(const char *)> keying_drivers;
+                       std::map<std::string, PTTInput *(*)(const char *)> ptt_input_drivers;
+                       std::map<std::string, TextInput *(*)(const char *)> text_input_drivers;
+                       std::map<std::string, UserInterface *(*)(const char *)> 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();
+}
index 51748810e2a59714e469f0f7a89fee39b32155dc..bebcbda2ff2780f97dcb2f8447b7d31b1add814e 100644 (file)
@@ -9,4 +9,4 @@ namespace FreeDV {
   Keying::~Keying()
   {
   }
-};
+}
index 8b48f2e8a818e04ce62ab238cd99541ba4d06d15..062bd44bea7ddcb9a3d70bce98868b557aebd516 100644 (file)
@@ -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();
-};
+}
index 3cc9b5794d8b6310bdbf90798f9915e242b3e4f3..7d266289e249d84739577b2459943eed02420036 100644 (file)
 #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);
 }
index c0ba089096dafbcef314b07bf4d19122557b6dfe..f1e9ead5f32a3f2e34e7d1de263a8dc6ac631eb2 100644 (file)
@@ -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();
-};
+}
index f5a050b391e0fa63123c5b76875efe20d2464706..012261b7716fa87fb9da97ef2578b8104f800ea7 100644 (file)
@@ -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 (file)
index 0000000..615eef6
--- /dev/null
@@ -0,0 +1,9 @@
+#include "drivers.h"
+
+namespace FreeDV {
+  int
+  run(Interfaces * i)
+  {
+    return 0;
+  }
+}
index b5b0e2bff5798ae5b39f172233daa1c5903ca869..ddef165f3fa9809dd6095fc502801197a120f3c6 100644 (file)
@@ -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();
-};
+}
index bffc9fa308b381a89f34dd4d2656998d1d9b500d..b1f9566904bb0983d1398944bf9bc98135da9092 100644 (file)
@@ -20,4 +20,4 @@ namespace FreeDV {
   TextInput::set(const char *)
   {
   }
-};
+}
index 703f03f7a8076d06f1b407b409a55483a1a11fd2..9a2890867ea1cbb0d9c2a644ca582ce26d1b9ba2 100644 (file)
@@ -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();
-};
+}
index 0ebe5cbdf204a632ac9bab3d2250c2921eb66aa6..0e86b7b580383740feabffeb179398de1252b912 100644 (file)
@@ -33,4 +33,4 @@ namespace FreeDV {
   {
     return 0;
   }
-};
+}