Define Codec and Modem as drivers. This is mostly for testing's sake, so that I can...
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 13 Dec 2013 03:11:59 +0000 (03:11 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 13 Dec 2013 03:11:59 +0000 (03:11 +0000)
place and test the input-to-output path.

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

24 files changed:
freedv-server/CMakeLists.txt
freedv-server/parameters/c-flags.txt
freedv-server/parameters/cxx-flags.txt
freedv-server/source/audio_input.cpp
freedv-server/source/audio_output.cpp
freedv-server/source/audio_sink.cpp
freedv-server/source/big_main.cpp [new file with mode: 0644]
freedv-server/source/blank_panel.cpp
freedv-server/source/codec.cpp [new file with mode: 0644]
freedv-server/source/codec_noop.cpp [new file with mode: 0644]
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 [deleted file]
freedv-server/source/modem.cpp [new file with mode: 0644]
freedv-server/source/modem_noop.cpp [new file with mode: 0644]
freedv-server/source/ptt_constant.cpp
freedv-server/source/ptt_input.cpp
freedv-server/source/text_constant.cpp
freedv-server/source/text_input.cpp
freedv-server/source/tiny_main.cpp [new file with mode: 0644]
freedv-server/source/tone.cpp
freedv-server/source/user_interface.cpp

index 51c59d60fdaab29faa0c3153328f4d8258cfa927..a01d54fed6ea7f09b26244ae9c8d4c9842a9a875 100644 (file)
@@ -5,6 +5,13 @@
 # for the original Qt FreeDV.
 # Hacked to bits for command-line/server version by Bruce Perens K6BP.
 #
+# Note: There is an embedded and not-embedded version of FreeDV built here.
+# The embedded version avoids use of the C++ standard template library,
+# templates, and anything that would make it large. It uses tiny_main.
+# The non-embedded version uses big_main and driver_manager. It uses
+# STL templates, and iostreams, and probably has a tremendous user interface
+# driver so none of this matters.
+#
 # Please report questions, comments, problems, or patches to the freetel
 # mailing list: https://lists.sourceforge.net/lists/listinfo/freetel-codec2
 #
@@ -77,27 +84,33 @@ message(STATUS "${Param.build-type} ${Version.major}.${Version.minor}.${Version.
 #
 # Set cmake internal variables from parameters.
 #
-load_parameters(cxx-flags c-flags)
-set(CMAKE_CXX_FLAGS, ${Param.cxx-flags})
-set(CMAKE_C_FLAGS, ${Param.c-flags})
-
 set(Compile.sources
   source/audio_input.cpp
   source/audio_output.cpp
   source/audio_sink.cpp
+  source/big_main.cpp
   source/blank_panel.cpp
+  source/codec.cpp
+  source/codec_noop.cpp
   source/driver_manager.cpp
   source/keying.cpp
   source/keying_sink.cpp
-  source/main.cpp
+  source/modem.cpp
+  source/modem_noop.cpp
   source/ptt_input.cpp
   source/ptt_constant.cpp
+  source/run.cpp
   source/text_constant.cpp
   source/text_input.cpp
+  source/tiny_main.cpp
   source/tone.cpp
   source/user_interface.cpp
 )
 
+load_parameters(cxx-flags)
+set_source_files_properties(${Compile.sources} PROPERTIES COMPILE_FLAGS "${Param.cxx-flags}")
+
+
 add_executable(freedv-server ${Compile.sources})
 
 find_path(Codec2.include codec2.h PATH_SUFFIXES codec2)
index 20143efd772b9d4fa846b60d7d91d98ee884b823..6438c8c94b5c50ae6cf3dfce064787828ecac05c 100644 (file)
@@ -1 +1 @@
--g
+-g -pedantic
index 7bed14b86bfa52c45781e64e0821d002d8fa5fda..3df231eac10c37692b1df31c68125bc320aa2755 100644 (file)
@@ -1 +1 @@
--std=c++11 -g
+-std=c++11 -g -pedantic
index 423446be5cb319d37514083a4938bf402afed535..2f1b208746534aee98f2ad8386757146c1e17ccf 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 namespace FreeDV {
   AudioInput::AudioInput()
index bf87e2a819322c931586fd96a831be8c6ad1628e..27ed71a6cef71a41a1a30e86f07f3252a60cce47 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 namespace FreeDV {
   AudioOutput::AudioOutput()
index 60e8b3c5f5509d73244075af963e75554174b60a..db10e59c2741eb50ed5ae1b953a3fa5f7385359f 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 // Audio output "sink", discards the audio, for testing.
 
@@ -17,7 +16,7 @@ namespace FreeDV {
        float   level(float value);
 
         // Write audio into the "short" type.
-       size_t  write_short(short * array, size_t length);
+       int     write_short(short * array, int length);
   };
 
   AudioSink::AudioSink(const char *)
@@ -41,12 +40,13 @@ namespace FreeDV {
   }
 
   // Write audio into the "short" type.
-  size_t
-  AudioSink::write_short(short * array, size_t length)
+  int
+  AudioSink::write_short(short * array, int length)
   {
     return 0;
   }
 
+#ifndef NO_INITIALIZERS
   static AudioOutput *
   creator(const char * parameter)
   {
@@ -60,4 +60,5 @@ namespace FreeDV {
     return true;
   }
   static const bool initialized = initializer();
+#endif
 }
diff --git a/freedv-server/source/big_main.cpp b/freedv-server/source/big_main.cpp
new file mode 100644 (file)
index 0000000..25e108e
--- /dev/null
@@ -0,0 +1,158 @@
+#ifndef NO_INITIALIZERS
+/*
+ * This is the main program for applications that are not space-limited.
+ * Any application that is space limited should have its own main that wires drivers to the
+ * Interfaces class without using DriverManager. Thus, you can get rid of all of the STL
+ * template use, etc.
+ *
+ * For the sake of correctness and optimization, I have written whatever I can to be without
+ * side-effects, a style inherited from functional programming. Thus, the excessive use of
+ * "const". - Bruce
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <iostream>
+#include <getopt.h>
+#include <codec2.h>
+#include <codec2_fdmdv.h>
+
+#include "drivers.h"
+
+using namespace std;
+namespace FreeDV {
+  extern int run(struct Interfaces *);
+}
+using namespace FreeDV;
+
+
+static void drivers()
+{
+  driver_manager.print(cout);
+}
+
+static void help(const char * name)
+{
+  static const char message[] = 
+    " [options]\n"
+    "\n\tWhere options are these flags:\n\n"
+    "\t\t--codec or -c\t\tSelect the voice codec.\n"
+    "\t\t--drivers or -d\t\tPrint a list of the available device drivers.\n"
+    "\t\t--help or -h\t\tPrint this message.\n"
+    "\t\t--interface or -i\tSelect the user-interface (graphical or otherwise).\n"
+    "\t\t--keying or -k\t\tSelect the transmitter keying interface.\n"
+    "\t\t--loudspeaker or -l\tSelect the operator audio output interface.\n"
+    "\t\t--microphone or -m\tSelect the operator audio input interface.\n"
+    "\t\t--modem or -M\t\tSelect RF modem.\n"
+    "\t\t--ptt or -p\t\tSelect the push-to-talk input interface.\n"
+    "\t\t--receiver or -r\tSelect the interface for audio input from the receiver.\n"
+    "\t\t--text or -x\t\tSelect the interface for text to be transmitted.\n"
+    "\t\t--transmitter or -t\tSelect the interface for audio output to the transmitter.\n"
+    "\n\tLong flags with parameters are in the form of --<flag>=<parameter>\n"
+    "\tShort flags with parameters are in the form of -<letter> <parameter>\n"
+    "\n\tFor example, both of these flags have the same effect:\n"
+    "\t\t-M codec2:1600\n"
+    "\t\t--modem=codec2:1600\n"
+    "\n\tAll of the flags except for -h or --help must have a \"<driver>:<parameter>\" argument\n"
+    "\twhere <driver> is the name of a device driver and <parameter> is specific to the driver.\n"
+    "\n\tExample:\n"
+    "\t\t --loudspeaker=alsa:default\n"
+  ;
+  cerr << "\nUsage: " << name << message << endl;
+}
+
+static const struct option options[] = {
+  { "codec",           required_argument, 0, 'c' },
+  { "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' },
+  { "modem",           required_argument, 0, 'M' },
+  { "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
+main(int argc, char * * argv)
+{
+  int          command;
+  Interfaces   i;
+  const char * driver;
+  const char * parameter;
+
+  if ( argc > 1 ) {
+    while ((command = getopt_long(argc, argv, "c:dhi:k:l:m:M:n:p:r:t:x:", options, NULL)) != -1) {
+      switch (command) {
+      case 'i':
+      case 'k':
+      case 'l':
+      case 'm':
+      case 'p':
+      case 'r':
+      case 't':
+      case 'x':
+        char * const colon(index(optarg, ':'));
+
+        if ( colon == 0 || colon[0] != ':' || colon[1] == 0 ) {
+          cerr << argv[optind - 1] << ": Missing colon. Argument must be of the form \"<driver>:<parameter>\"" << endl;
+          exit(1);
+        }
+       
+        *colon = 0;
+        driver = optarg;
+        parameter = &colon[1];
+      }
+
+      switch (command) {
+      case 'c':
+        i.codec = driver_manager.codec(driver, parameter);
+        break;
+      case 'd':
+        drivers();
+        exit(0);
+        break;
+      default:
+      case 'h':
+        help(argv[0]);
+        exit(1);
+        break;
+      case 'k':
+        i.keying = driver_manager.keying(driver, parameter);
+        break;
+      case 'l':
+        i.loudspeaker = driver_manager.audio_output(driver, parameter);
+        break;
+      case 'm':
+        i.microphone = driver_manager.audio_input(driver, parameter);
+        break;
+      case 'M':
+        i.modem = driver_manager.modem(driver, parameter);
+        break;
+      case 'p':
+        i.ptt = driver_manager.ptt_input(driver, parameter);
+        break;
+      case 'r':
+        i.receiver = driver_manager.audio_input(driver, parameter);
+        break;
+      case 't':
+        i.transmitter = driver_manager.audio_output(driver, parameter);
+        break;
+      case 'x':
+        i.text = driver_manager.text_input(driver, parameter);
+        break;
+      case 0:
+        break;
+      }
+    }
+  }
+  else { // argc <= 1
+    help(argv[0]);
+    exit(1);
+  }
+  return run(&i);
+}
+#endif
index 321a14544ed69ed3bb8cb19a6a05eaac66f929b0..5bb284d0cf133db91d54162f0471b179f00d7e93 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 // This is a test driver that provides tones.
 namespace FreeDV {
@@ -18,6 +17,7 @@ namespace FreeDV {
   {
   }
 
+#ifndef NO_INITIALIZERS
   static UserInterface *
   creator(const char * parameter)
   {
@@ -31,4 +31,5 @@ namespace FreeDV {
     return true;
   }
   static const bool initialized = initializer();
+#endif
 }
diff --git a/freedv-server/source/codec.cpp b/freedv-server/source/codec.cpp
new file mode 100644 (file)
index 0000000..78413ed
--- /dev/null
@@ -0,0 +1,11 @@
+#include "drivers.h"
+
+namespace FreeDV {
+  Codec::Codec()
+  {
+  }
+
+  Codec::~Codec()
+  {
+  }
+}
diff --git a/freedv-server/source/codec_noop.cpp b/freedv-server/source/codec_noop.cpp
new file mode 100644 (file)
index 0000000..dc9da95
--- /dev/null
@@ -0,0 +1,38 @@
+#include "drivers.h"
+
+// Codec "no-op", just copies its input to its output. For plain SSB voice, and for testing.
+namespace FreeDV {
+  class CodecNoOp : public Codec {
+  public:
+
+               CodecNoOp(const char *);
+               ~CodecNoOp();
+
+       void    key(bool value);
+
+  };
+
+  CodecNoOp::CodecNoOp(const char *)
+  {
+  }
+
+  CodecNoOp::~CodecNoOp()
+  {
+  }
+
+#ifndef NO_INITIALIZERS
+  static Codec *
+  creator(const char * parameter)
+  {
+    return new CodecNoOp(parameter);
+  }
+
+  static bool
+  initializer()
+  {
+    init_driver_manager().register_codec("no-op", creator);
+    return true;
+  }
+  static const bool initialized = initializer();
+#endif
+}
index 2990a6e5232f1a5617e637c5c37bf8c184610e2c..81b81682c5b8d7add919acefa280159ee2c06aaa 100644 (file)
@@ -1,3 +1,7 @@
+#ifndef NO_INITIALIZERS
+/*
+ * Don't use DriverManager and main.cpp in space-limited applications. STL stuff it uses is too large.
+ */
 #include <iostream>
 #include "drivers.h"
 
@@ -26,18 +30,26 @@ namespace FreeDV {
     for (auto i = audio_output_drivers.begin(); i != audio_output_drivers.end(); i++ )
       s << i->first << " ";
     s << endl;
+    s << "Codec: ";
+    for (auto i = codecs.begin(); i != codecs.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 << "Modem: ";
+    for (auto i = modems.begin(); i != modems.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 << "TextInput: ";
+    for (auto i = text_input_drivers.begin(); i != text_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 << " ";
@@ -60,6 +72,17 @@ namespace FreeDV {
   {
   }
  
+  Codec *
+  DriverManager::codec(const char * driver, const char * parameter)
+  {
+    Codec * (* const creator)(const char * parameter) = codecs[driver];
+
+    if(creator)
+      return creator(parameter);
+    else
+      return 0;
+  }
   Keying *
   DriverManager::keying(const char * driver, const char * parameter)
   {
@@ -71,6 +94,17 @@ namespace FreeDV {
       return 0;
   }
  
+  Modem *
+  DriverManager::modem(const char * driver, const char * parameter)
+  {
+    Modem * (* const creator)(const char * parameter) = modems[driver];
+
+    if(creator)
+      return creator(parameter);
+    else
+      return 0;
+  }
   PTTInput *
   DriverManager::ptt_input(const char * driver, const char * parameter)
   {
@@ -116,12 +150,24 @@ namespace FreeDV {
     audio_output_drivers[driver] = creator;
   }
 
+  void
+  DriverManager::register_codec(const char * driver, Codec * (*creator)(const char *))
+  {
+    codecs[driver] = creator;
+  }
+
   void
   DriverManager::register_keying(const char * driver, Keying * (*creator)(const char *))
   {
     keying_drivers[driver] = creator;
   }
 
+  void
+  DriverManager::register_modem(const char * driver, Modem * (*creator)(const char *))
+  {
+    modems[driver] = creator;
+  }
+
   void
   DriverManager::register_ptt_input(const char * driver, PTTInput * (*creator)(const char *))
   {
@@ -151,3 +197,4 @@ namespace FreeDV {
 
   DriverManager & driver_manager = init_driver_manager();
 }
+#endif
index 1988a2cdf90430dae5c43af890b9dfee12a8793a..89074d872e95624f3fd5e387799a2963187665ce 100644 (file)
@@ -2,10 +2,6 @@
  * FreeDV driver interface definitions.
  */
 
-#include <stdlib.h>
-#include <iostream>
-#include <map>
-#include <string>
 
 
 namespace FreeDV {
@@ -30,7 +26,7 @@ namespace FreeDV {
        virtual float   level(float value) = 0;
 
         // Read audio into the "short" type.
-       virtual size_t  read_short(short * array, size_t length) = 0;
+       virtual int     read_short(short * array, int length) = 0;
   };
 
   class AudioOutput {
@@ -54,7 +50,17 @@ namespace FreeDV {
        virtual float   level(float value) = 0;
 
         // Write audio into the "short" type.
-       virtual size_t  write_short(short * array, size_t length) = 0;
+       virtual int     write_short(short * array, int length) = 0;
+  };
+
+  class Codec {
+  protected:
+       // Create a codec instance.
+
+                       Codec();
+       virtual         ~Codec() = 0;
+
+  public:
   };
 
   class Keying {
@@ -69,6 +75,16 @@ namespace FreeDV {
        virtual void    key(bool value) = 0;
   };
 
+  class Modem {
+  protected:
+       // Create a modem instance.
+
+                       Modem();
+       virtual         ~Modem() = 0;
+
+  public:
+  };
+
   class PTTInput {
   protected:
        // The driver calls this member to inform FreeDV that the PTT switch value has changed.
@@ -137,27 +153,36 @@ namespace FreeDV {
 
   class Interfaces {
     public:
-                       Interfaces() : user_interface(0), keying(0), loudspeaker(0), microphone(0),
-                                       ptt(0), receiver(0), text(0), transmitter(0), mode(0)
+                       Interfaces() : codec(0), keying(0), loudspeaker(0), microphone(0), modem(0), ptt(0),
+                         receiver(0), text(0), transmitter(0), user_interface(0)
                        {
                        }
 
-    UserInterface *    user_interface;
+    Codec *            codec;
     Keying *           keying;
     AudioOutput *      loudspeaker;
     AudioInput *       microphone;
+    Modem *            modem;
     PTTInput *         ptt;
-    AudioInput *       receiver;
     TextInput *                text;
     AudioOutput *      transmitter;
-    const char *       mode;
+    AudioInput *       receiver;
+    UserInterface *    user_interface;
   };
+}
 
+#ifndef NO_INITIALIZERS
+#include <iostream>
+#include <map>
+#include <string>
+namespace FreeDV {
   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, Codec *(*)(const char *)> codecs;
                        std::map<std::string, Keying *(*)(const char *)> keying_drivers;
+                       std::map<std::string, Modem *(*)(const char *)> modems;
                        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;
@@ -169,14 +194,18 @@ namespace FreeDV {
 
        AudioInput *    audio_input(const char * driver, const char * parameter);
        AudioOutput *   audio_output(const char * driver, const char * parameter);
+       Codec *         codec(const char * driver, const char * parameter);
        Keying *        keying(const char * driver, const char * parameter);
+       Modem *         modem(const char * driver, const char * parameter);
        PTTInput *      ptt_input(const char * driver, const char * parameter);
        TextInput *     text_input(const char * driver, const char * parameter);
        UserInterface * user_interface(const char * driver, const char * parameter);
 
        void            register_audio_input(const char * driver, AudioInput * (*creator)(const char *));
        void            register_audio_output(const char * driver, AudioOutput * (*creator)(const char *));
+       void            register_codec(const char * driver, Codec * (*creator)(const char *));
        void            register_keying(const char * driver, Keying * (*creator)(const char *));
+       void            register_modem(const char * driver, Modem * (*creator)(const char *));
        void            register_ptt_input(const char * driver, PTTInput * (*creator)(const char *));
        void            register_text_input(const char * driver, TextInput * (*creator)(const char *));
        void            register_user_interface(const char * driver, UserInterface * (*creator)(const char *));
@@ -185,4 +214,5 @@ namespace FreeDV {
   extern DriverManager & driver_manager;
   // This version has to be called from static initializers.
   extern DriverManager & init_driver_manager();
+#endif
 }
index bebcbda2ff2780f97dcb2f8447b7d31b1add814e..00ad6074b8aef58c592fee9db8b5f17eb4ff134a 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 namespace FreeDV {
   Keying::Keying()
index 062bd44bea7ddcb9a3d70bce98868b557aebd516..275c1d6a9c8820e6ee4111ecf4cf99a932adbf2e 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 // Keying output "sink", doesn't key anything. For testing or use with VOX.
 namespace FreeDV {
@@ -26,7 +25,7 @@ namespace FreeDV {
   {
   }
 
-
+#ifndef NO_INITIALIZERS
   static Keying *
   creator(const char * parameter)
   {
@@ -40,4 +39,5 @@ namespace FreeDV {
     return true;
   }
   static const bool initialized = initializer();
+#endif
 }
diff --git a/freedv-server/source/main.cpp b/freedv-server/source/main.cpp
deleted file mode 100644 (file)
index 7d26628..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * For the sake of correctness and optimization, I have written whatever I can to be without
- * side-effects, a style inherited from functional programming. Thus, the excessive use of
- * "const". - Bruce
- */
-#include <stdlib.h>
-#include <string.h>
-#include <iostream>
-#include <getopt.h>
-#include <codec2.h>
-#include <codec2_fdmdv.h>
-
-#include "drivers.h"
-
-using namespace std;
-namespace FreeDV {
-  extern int run(struct Interfaces *);
-}
-using namespace FreeDV;
-
-
-static void drivers()
-{
-  driver_manager.print(cout);
-}
-
-static void help(const char * name)
-{
-  static const char message[] = 
-    " [options]\n"
-    "\n\tWhere options are these flags:\n\n"
-    "\t\t--drivers or -d\t\tPrint a list of the available device drivers.\n"
-    "\t\t--help or -h\t\tPrint this message.\n"
-    "\t\t--interface or -i\tSelect the user-interface (graphical or otherwise).\n"
-    "\t\t--keying or -k\t\tSelect the transmitter keying interface.\n"
-    "\t\t--loudspeaker or -l\tSelect the operator audio output interface.\n"
-    "\t\t--microphone or -m\tSelect the operator audio input interface.\n"
-    "\t\t--mode or -n\t\tSelect the codec mode and modulation.\n"
-    "\t\t--ptt or -p\t\tSelect the push-to-talk input interface.\n"
-    "\t\t--receiver or -r\tSelect the interface for audio input from the receiver.\n"
-    "\t\t--text or -x\t\tSelect the interface for text to be transmitted.\n"
-    "\t\t--transmitter or -t\tSelect the interface for audio output to the transmitter.\n"
-    "\n\tLong flags with parameters are in the form of --<flag>=<parameter>\n"
-    "\tShort flags with parameters are in the form of -<letter> <parameter>\n"
-    "\n\tFor example, both of these flags have the same effect:\n"
-    "\t\t-n 1600\n"
-    "\t\t--mode=1600\n"
-    "\n\tMode may be one of:\n"
-    "\t\t1600\t\tNormal 1600 bit-per-second in 1.275 kHz RF bandwidth.\n"
-    "\t\t1600-wide\t1600 bit-per-second in 2.125 kHz, wider guard-bands for improved\n"
-    "\t\t\t\t\tDX performance.\n"
-    "\n\tFlags used to select devices must have a \"<driver>:<parameter>\" argument\n"
-    "\twhere <driver> is the name of a device driver for the selected input/output device,\n"
-    "\tand <parameter> is the name or address of the selected device.\n"
-    "\n\tExample:\n"
-    "\t\t --loudspeaker=alsa:default\n"
-  ;
-  cerr << "\nUsage: " << name << message << endl;
-}
-
-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
-main(int argc, char * * argv)
-{
-  int          command;
-  Interfaces   i;
-  const char * driver;
-  const char * parameter;
-
-  if ( argc > 1 ) {
-    while ((command = getopt_long(argc, argv, "dhi:k:l:m:n:p:r:t:x:", options, NULL)) != -1) {
-      switch (command) {
-      case 'i':
-      case 'k':
-      case 'l':
-      case 'm':
-      case 'p':
-      case 'r':
-      case 't':
-      case 'x':
-        char * const colon(index(optarg, ':'));
-
-        if ( colon == 0 || colon[0] != ':' || colon[1] == 0 ) {
-          cerr << argv[optind - 1] << ": Missing colon. Argument must be of the form \"<driver>:<parameter>\"" << endl;
-          exit(1);
-        }
-       
-        *colon = 0;
-        driver = optarg;
-        parameter = &colon[1];
-      }
-
-      switch (command) {
-      case 'd':
-        drivers();
-        exit(0);
-        break;
-      default:
-      case 'h':
-        help(argv[0]);
-        exit(1);
-        break;
-      case 'i':
-        i.user_interface = driver_manager.user_interface(driver, parameter);
-        break;
-      case 'k':
-        i.keying = driver_manager.keying(driver, parameter);
-        break;
-      case 'l':
-        i.loudspeaker = driver_manager.audio_output(driver, parameter);
-        break;
-      case 'm':
-        i.microphone = driver_manager.audio_input(driver, parameter);
-        break;
-      case 'n':
-        i.mode = optarg;
-        break;
-      case 'p':
-        i.ptt = driver_manager.ptt_input(driver, parameter);
-        break;
-      case 'r':
-        i.receiver = driver_manager.audio_input(driver, parameter);
-        break;
-      case 't':
-        i.transmitter = driver_manager.audio_output(driver, parameter);
-        break;
-      case 'x':
-        i.text = driver_manager.text_input(driver, parameter);
-        break;
-      case 0:
-        break;
-      }
-    }
-  }
-  else { // argc <= 1
-    help(argv[0]);
-    exit(1);
-  }
-  return run(&i);
-}
diff --git a/freedv-server/source/modem.cpp b/freedv-server/source/modem.cpp
new file mode 100644 (file)
index 0000000..71cb64d
--- /dev/null
@@ -0,0 +1,11 @@
+#include "drivers.h"
+
+namespace FreeDV {
+  Modem::Modem()
+  {
+  }
+
+  Modem::~Modem()
+  {
+  }
+}
diff --git a/freedv-server/source/modem_noop.cpp b/freedv-server/source/modem_noop.cpp
new file mode 100644 (file)
index 0000000..27ead31
--- /dev/null
@@ -0,0 +1,38 @@
+#include "drivers.h"
+
+// Modem "no-op", just copies its input to its output. For plain SSB voice, and for testing.
+namespace FreeDV {
+  class ModemNoOp : public Modem {
+  public:
+
+               ModemNoOp(const char *);
+               ~ModemNoOp();
+
+       void    key(bool value);
+
+  };
+
+  ModemNoOp::ModemNoOp(const char *)
+  {
+  }
+
+  ModemNoOp::~ModemNoOp()
+  {
+  }
+
+#ifndef NO_INITIALIZERS
+  static Modem *
+  creator(const char * parameter)
+  {
+    return new ModemNoOp(parameter);
+  }
+
+  static bool
+  initializer()
+  {
+    init_driver_manager().register_modem("no-op", creator);
+    return true;
+  }
+  static const bool initialized = initializer();
+#endif
+}
index f1e9ead5f32a3f2e34e7d1de263a8dc6ac631eb2..2cc25f01fb2fa824a4cce9d798da605c695d13fd 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 // PTT driver that is constant transmit or constant receive. For testing.
 namespace FreeDV {
@@ -18,6 +17,7 @@ namespace FreeDV {
   {
   }
 
+#ifndef NO_INITIALIZERS
   static PTTInput *
   creator(const char * parameter)
   {
@@ -31,4 +31,5 @@ namespace FreeDV {
     return true;
   }
   static const bool initialized = initializer();
+#endif
 }
index 012261b7716fa87fb9da97ef2578b8104f800ea7..0496f5cb67a994b1d75f00477b8b22abbf768655 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 namespace FreeDV {
   PTTInput::PTTInput()
index ddef165f3fa9809dd6095fc502801197a120f3c6..3aa23a1b173b0476ef4938c148b23bb5f1f3e58a 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 // This is a test driver that provides tones.
 namespace FreeDV {
@@ -18,6 +17,7 @@ namespace FreeDV {
   {
   }
 
+#ifndef NO_INITIALIZERS
   static TextInput *
   creator(const char * parameter)
   {
@@ -31,4 +31,5 @@ namespace FreeDV {
     return true;
   }
   static const bool initialized = initializer();
+#endif
 }
index b1f9566904bb0983d1398944bf9bc98135da9092..c9daf63ebe01a80730d633ad440b7fe7eced1bfe 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 namespace FreeDV {
   TextInput::TextInput()
diff --git a/freedv-server/source/tiny_main.cpp b/freedv-server/source/tiny_main.cpp
new file mode 100644 (file)
index 0000000..c3b86ba
--- /dev/null
@@ -0,0 +1,5 @@
+#ifdef NO_INITIALIZERS
+/*
+ * Main program for embedded use.
+ */
+#endif
index 9a2890867ea1cbb0d9c2a644ca582ce26d1b9ba2..93126aeaae4172bd7746b2082f9cbe689f37b0af 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 // This is a test driver that provides tones.
 namespace FreeDV {
@@ -15,7 +14,7 @@ namespace FreeDV {
     virtual float      level(float value);
     
     // Read audio into the "short" type.
-    virtual size_t     read_short(short * array, size_t length);
+    virtual int        read_short(short * array, int length);
   };
 
   Tone::Tone(const char * parameter)
@@ -38,12 +37,13 @@ namespace FreeDV {
     return value;
   }
 
-  size_t
-  Tone::read_short(short * array, size_t length)
+  int
+  Tone::read_short(short * array, int length)
   {
     return 0;
   }
 
+#ifndef NO_INITIALIZERS
   static AudioInput *
   creator(const char * parameter)
   {
@@ -57,4 +57,5 @@ namespace FreeDV {
     return true;
   }
   static const bool initialized = initializer();
+#endif
 }
index 0e86b7b580383740feabffeb179398de1252b912..a43a92e917e939037229eb58966797be8359dc94 100644 (file)
@@ -1,5 +1,4 @@
 #include "drivers.h"
-#include <iostream>
 
 namespace FreeDV {
   UserInterface::UserInterface()