Turn on all warnings, and then fix whatever had warnings. G++ by default
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 11 Mar 2014 07:03:11 +0000 (07:03 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 11 Mar 2014 07:03:11 +0000 (07:03 +0000)
doesn't complain about non-void functions that return no value. That was
enough to prompt me to turn on all possible warnings.

git-svn-id: https://svn.code.sf.net/p/freetel/code@1425 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_sink.cpp
freedv-server/source/base.cpp
freedv-server/source/big_main.cpp
freedv-server/source/codec_noop.cpp
freedv-server/source/driver_manager.cpp
freedv-server/source/drivers.h
freedv-server/source/fifo.cpp
freedv-server/source/framer_noop.cpp
freedv-server/source/interfaces.cpp
freedv-server/source/libevent.cpp
freedv-server/source/modem_noop.cpp
freedv-server/source/platform/linux/audio_in_alsa.cpp
freedv-server/source/platform/linux/audio_out_alsa.cpp
freedv-server/source/run.cpp
freedv-server/source/test/blank_panel.cpp
freedv-server/source/test/fifo.cpp
freedv-server/source/test/ptt_constant.cpp
freedv-server/source/test/text_constant.cpp
freedv-server/source/text_constant.cpp
freedv-server/source/tone.cpp
freedv-server/source/user_interface.cpp

index a5d03cb11da5355a70384aad2c990d6af4d316d7..97c6aeee9510ed02fcc7eb67b4aa53dd05b62d7d 100644 (file)
@@ -88,18 +88,28 @@ message(STATUS "${Param.build-type} ${Version.major}.${Version.minor}.${Version.
 #
 
 set(Compile.linux.sources
+  source/platform/linux/alsa.cpp
+  source/platform/linux/audio_out_alsa.cpp
+  source/platform/linux/audio_in_alsa.cpp
   source/platform/linux/scheduler.cpp
+  source/platform/linux/privilege.cpp
+)
+set(Compile.linux.libraries
+  asound
 )
 
 # FIX: Add other platforms.
 if(Platform.name STREQUAL Linux)
   set(Compile.platform.sources ${Compile.linux.sources})
+  set(Compile.platform.libraries ${Compile.linux.libraries})
 endif(Platform.name STREQUAL Linux)
 
 set(Compile.sources
   ${Compile.platform.sources}
   source/audio_device.cpp
+  source/audio_in_default.cpp
   source/audio_input.cpp
+  source/audio_out_default.cpp
   source/audio_output.cpp
   source/audio_sink.cpp
   source/base.cpp
@@ -109,6 +119,8 @@ set(Compile.sources
   source/driver_manager.cpp
   source/event_handler.cpp
   source/fifo.cpp
+  source/framer.cpp
+  source/framer_noop.cpp
   source/interfaces.cpp
   source/io_device.cpp
   source/keying.cpp
@@ -178,4 +190,7 @@ else( Codec2.lib AND Codec2.include )
   message(FATAL_ERROR "Can't find Codec2 library.")
 endif( Codec2.lib AND Codec2.include )
 
+target_link_libraries(freedv-server ${Compile.platform.libraries})
+target_link_libraries(freedv-gtest ${Compile.platform.libraries})
+
 install(TARGETS freedv-server RUNTIME DESTINATION bin)
index 6438c8c94b5c50ae6cf3dfce064787828ecac05c..4ee6b833c4b67092fd3a890cb21430f471798771 100644 (file)
@@ -1 +1 @@
--g -pedantic
+-g -pedantic -Wall -Wextra
index 4208c7b040e6fd12f6de4225fea48c47d3476a1e..0891ade7222a891ba2c0f1e0a3d66f1f9a955d11 100644 (file)
@@ -1 +1 @@
--std=c++11 -g -pedantic -DDEBUG
+-std=c++11 -g -pedantic -Wall -Wextra -DDEBUG
index 6059605ad50fe444425b52418d401dd91f549d23..deaeb2c14d3147266a896aa3fef77bd14584d11a 100644 (file)
@@ -32,7 +32,7 @@ namespace FreeDV {
 
   // Write audio into the "short" type.
   std::size_t
-  AudioSink::write16(const std::int16_t * array, std::size_t length)
+  AudioSink::write16(const std::int16_t *, std::size_t length)
   {
     return length;
   }
index 5bb9ab5798a8f5204fbeb0ac99a4d66c686db6b3..fdf3b06be6dd8d4fda252b267424e8d72f6c498d 100644 (file)
@@ -13,7 +13,7 @@ namespace FreeDV {
     delete parameters;
   }
 
-  bool const
+  bool
   Base::captive() const
   {
     return false;
index c84a1ceffac3daa1f9e6451dad99f491a8b5e87b..86657dd165af98742d05144bce70e65b5ae6ef07 100644 (file)
@@ -36,9 +36,9 @@ static void help(const char * name)
     " [options]\n"
     "\nWhere options are these flags:\n\n"
     "--codec or -c\t\tSelect the voice codec.\n"
+    "--config or -c\t\tPrint the configuration.\n"
     "--drivers or -d\t\tPrint a list of the available device drivers.\n"
     "--framer or -f\t\tSelect the communications protocol framer.\n"
-    "--gui or -g\t\tSelect the graphical user interface.\n"
     "--help or -h\t\tPrint this message.\n"
     "--interface or -i\tSelect the user-interface (graphical or otherwise).\n"
     "--keying or -k\t\tSelect the transmitter keying interface.\n"
@@ -73,7 +73,6 @@ static const struct option options[] = {
   { "codec",           required_argument, 0, 'c' },
   { "config",          no_argument,       0, 'C' },
   { "drivers",         no_argument,       0, 'd' },
-  { "default",         no_argument,       0, 'D' },
   { "framer",          required_argument, 0, 'f' },
   { "help",            no_argument,       0, 'h' },
   { "interface",       required_argument, 0, 'i' },
@@ -92,95 +91,92 @@ static const struct option options[] = {
 int
 main(int argc, char * * argv)
 {
-  int          command;
   Interfaces   i;
-  const char * driver;
-  const char * parameter;
   const DriverManager * const m = driver_manager();
 
   i.fill_in();
 
   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 'f':
-      case 'i':
-      case 'k':
-      case 'l':
-      case 'm':
-      case 'p':
-      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];
-      }
-
-      Base * set = (Base *)1; 
+    int command;
+    while ((command = getopt_long(argc, argv, "c:Cdf:hi:k:l:m:M:p:P:r:t:x:", options, NULL)) != -1 ) {
       switch (command) {
       case 'c':
-        set = i.codec = m->codec(driver, parameter);
-        break;
-      case 'd':
-        drivers();
-        exit(0);
-      case 'D':
-        break;
       case 'f':
-        set = i.framer = m->framer(driver, parameter);
-        break;
-      default:
-      case 'h':
-        help(argv[0]);
-        exit(1);
       case 'i':
-        set = i.user_interface = m->user_interface(driver, parameter, &i);
-        break;
       case 'k':
-        set = i.keying_output = m->keying_output(driver, parameter);
-        break;
       case 'l':
-        set = i.loudspeaker = m->audio_output(driver, parameter);
-        break;
       case 'm':
-        set = i.microphone = m->audio_input(driver, parameter);
-        break;
       case 'M':
-        set = i.modem = m->modem(driver, parameter);
-        break;
       case 'p':
-        set = i.ptt_input_digital = m->ptt_input(driver, parameter);
-        break;
       case 'P':
-        set = i.ptt_input_ssb = m->ptt_input(driver, parameter);
-        break;
       case 'r':
-        set = i.receiver = m->audio_input(driver, parameter);
-        break;
       case 't':
-        set = i.transmitter = m->audio_output(driver, parameter);
-        break;
       case 'x':
-        set = i.text_input = m->text_input(driver, parameter);
-        break;
-      case 'C':
-       // FIX: Operator overload doesn't work here.
-        i.print(cout) << endl;
-        exit(0);
-      case 0:
-        break;
+        const char * const     driver = optarg;
+        char * const           colon = index(optarg, ':');
+        const char *           parameter = "";
+  
+        if ( colon ) {
+          *colon = 0;
+          parameter = colon + 1;
+        }
+  
+        Base * set = (Base *)1; 
+  
+        switch (command) {
+        case 'c':
+          set = i.codec = m->codec(driver, parameter);
+          break;
+        case 'd':
+          drivers();
+          exit(0);
+        case 'f':
+          set = i.framer = m->framer(driver, parameter);
+          break;
+        default:
+        case 'h':
+          help(argv[0]);
+          exit(1);
+        case 'i':
+          set = i.user_interface = m->user_interface(driver, parameter, &i);
+          break;
+        case 'k':
+          set = i.keying_output = m->keying_output(driver, parameter);
+          break;
+        case 'l':
+          set = i.loudspeaker = m->audio_output(driver, parameter);
+          break;
+        case 'm':
+          set = i.microphone = m->audio_input(driver, parameter);
+          break;
+        case 'M':
+          set = i.modem = m->modem(driver, parameter);
+          break;
+        case 'p':
+          set = i.ptt_input_digital = m->ptt_input(driver, parameter);
+          break;
+        case 'P':
+          set = i.ptt_input_ssb = m->ptt_input(driver, parameter);
+          break;
+        case 'r':
+          set = i.receiver = m->audio_input(driver, parameter);
+          break;
+        case 't':
+          set = i.transmitter = m->audio_output(driver, parameter);
+          break;
+        case 'x':
+          set = i.text_input = m->text_input(driver, parameter);
+          break;
+        case 'C':
+       // FIX: Operator overload doesn't work here.
+          i.print(cout) << endl;
+          exit(0);
+        case 0:
+          break;
+        }
+        if ( set == 0 )
+          exit(1);
       }
-      if ( set == 0 )
-        exit(1);
     }
   }
   else { // argc <= 1
index f50db6d300838e36536cbc4c4bc874e96fce9297..f7a39b51c4875286a36d04218dad721876e8ef94 100644 (file)
@@ -16,7 +16,7 @@ namespace FreeDV {
     /// Data Bytes provided to decode16 and encode16 must be a multiple
     /// of this value. The result is invariant.
     /// \return The number of data bytes necessary to store a codec frame.
-    virtual std::size_t const
+    virtual std::size_t
                        bytes_per_frame() const;
 
     /// Decode from data bytes to audio samples.
@@ -46,7 +46,7 @@ namespace FreeDV {
 
     /// Return the duration of a frame in milliseconds.
     /// \return The duration of a frame in milliseconds.
-    virtual int const
+    virtual int
                        frame_duration() const;
 
     /// Return the number of audio samples expected to create a codec
@@ -55,7 +55,7 @@ namespace FreeDV {
     /// a given SampleRate.
     /// \return The number of audio samples expected to create a codec
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        samples_per_frame() const;
   };
 
@@ -68,7 +68,7 @@ namespace FreeDV {
   {
   }
 
-  std::size_t const
+  std::size_t
   CodecNoOp::bytes_per_frame() const
   {
     return sizeof(std::int16_t);
@@ -77,7 +77,7 @@ namespace FreeDV {
   std::size_t
   CodecNoOp::decode16(const std::uint8_t * i, std::int16_t * o, std::size_t * data_length, std::size_t sample_length)
   {
-    const std::size_t length = std::min(*data_length / 2, sample_length);
+    const std::size_t length = min(*data_length / 2, sample_length);
     memcpy(o, i, length * 2);
     *data_length = length * 2;
     return length;
@@ -90,13 +90,13 @@ namespace FreeDV {
     return length;
   }
 
-  int const
+  int
   CodecNoOp::frame_duration() const
   {
     return 1;
   }
 
-  std::size_t const
+  std::size_t
   CodecNoOp::samples_per_frame() const
   {
     return 1;
index 6dea58a11afedafaa6ecfc042bf5d98b0bdaf308..7c82aa3e3a618f197b68f05043d5279f97292fa6 100644 (file)
@@ -29,12 +29,15 @@ namespace FreeDV {
   }
 
   static FreeDV::Base *
-  pick(const char * key, const char * type, const char * const parameters, const DriverList * list)
+  pick(const char * key, const char * type, const char * const parameters, const DriverList * list, Interfaces * interfaces = 0)
   {
     while ( list->key ) {
       if ( strcmp(key, list->key) == 0 ) {
        try {
-          return (*(list->creator))(parameters);
+         if ( interfaces )
+            return (*(list->creator_i))(parameters, interfaces);
+          else
+           return (*(list->creator))(parameters);
         }
         catch(std::exception & e) {
           std::cerr << "Open " << type << " \"" << key << "\": " << e.what() << std::endl;
@@ -158,7 +161,7 @@ namespace FreeDV {
   UserInterface *
   DriverManager::user_interface(const char * key, const char * parameter, Interfaces * interfaces) const
   {
-    return (UserInterface *)pick(key, "user interface", parameter, user_interface_drivers);
+    return (UserInterface *)pick(key, "user interface", parameter, user_interface_drivers, interfaces);
   }
 
   void
@@ -216,7 +219,7 @@ namespace FreeDV {
     place(key, (base_creator)creator, enumerator, &user_interface_drivers);
   }
 
-  DriverManager * const
+  DriverManager *
   driver_manager()
   {
     static DriverManager * const d(new DriverManager());
index b99981758b88e64566aa59d19b422979b21ce676..4f1ca9cec6b8c1e77158fb1ae5ea0010ccf2517f 100644 (file)
@@ -1,6 +1,7 @@
 /// FreeDV driver interface definitions.
 #include <cstdint>
 #include <iostream>
+#include <assert.h>
 
 /// Namespace used for all code in this program.
 namespace FreeDV {
@@ -31,8 +32,8 @@ namespace FreeDV {
     uint8_t *                  in;
     const uint8_t *            out;
 
-    void               out_overrun(std::size_t length) const;
-    uint8_t *          reorder(std::size_t length);
+    void       out_overrun() const;
+    uint8_t *  reorder(std::size_t length);
 
   public:
     /// Create the FIFO object.
@@ -44,7 +45,7 @@ namespace FreeDV {
     /// Returns the amount of space available for incoming data.
     /// \return The amount of space, in bytes, available for incoming data.
     inline std::size_t incoming_available() const {
-                         return buffer_end - in + out - buffer;
+                         return (buffer_end) - in + (out - buffer);
                        }
 
     /// Return the address of an incoming data buffer of the requested size.
@@ -70,6 +71,7 @@ namespace FreeDV {
     /// smaller than or equal to the length passed to incoming_buffer().
     inline void                incoming_done(std::size_t length) {
                          in += length;
+                         assert(in >= buffer && in <= buffer_end);
                        }
 
     /// Returns the amount of data available to read.
@@ -83,8 +85,8 @@ namespace FreeDV {
     /// than or equal to the amount returned by outgoing_available().
     /// \return The address of the data to be read.
     inline const uint8_t *     outgoing_buffer(std::size_t length) {
-                         if ( length > in - out )
-                           out_overrun(length);
+                         if ( length > (std::size_t)(in - out) )
+                           out_overrun();
                          return out;
                        }
 
@@ -94,6 +96,7 @@ namespace FreeDV {
     /// outgoing_buffer().
     inline void                outgoing_done(std::size_t length) {
                          out += length;
+                         assert(out >= buffer && out <= buffer_end);
                        }
 
     /// Discard any buffered data.
@@ -126,13 +129,13 @@ namespace FreeDV {
        /// The name of the driver. This must be the same as the name it
        /// is registered under. It's expected to be from a per-class static
        /// string and thus should not be deleted.
-       const char * const
+       const char *
                        name;
 
        /// The parameters to this instance of the driver. They are
        /// copied here so that we can print them later in operator<<() .
        /// the copy is deleted when in the ~Base() destructor.
-       const char * const
+       const char *
                        parameters;
 
        /// Constructor for the virtual base class.
@@ -149,7 +152,7 @@ namespace FreeDV {
        /// should not be destroyed separately.
        /// The result is invariant for a particular object (or possibly
        /// class).
-       virtual bool const
+       virtual bool
                        captive() const;
 
        /// Write the driver information onto a stream, for debugging and
@@ -279,7 +282,7 @@ namespace FreeDV {
     /// Data Bytes provided to decode16 and encode16 must be a multiple
     /// of this value. The result is invariant for a particular configuration.
     /// \return The number of data bytes necessary to store a codec frame.
-    virtual std::size_t const
+    virtual std::size_t
                        bytes_per_frame() const = 0;
 
     /// Decode from data bytes to audio samples.
@@ -310,7 +313,7 @@ namespace FreeDV {
 
     /// Return the duration of a frame in milliseconds.
     /// \return The duration of a frame in milliseconds.
-    virtual int const
+    virtual int
                        frame_duration() const = 0;
 
     /// Return the number of audio samples expected to create a codec
@@ -319,7 +322,7 @@ namespace FreeDV {
     /// data because of the potential for clock skew between stations.
     /// \return The number of audio samples expected to create a codec
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        samples_per_frame() const = 0;
   };
 
@@ -442,7 +445,7 @@ namespace FreeDV {
     /// \return The maximum number of data bytes expected to store the unwrapped
     /// codec data.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        max_unwrapped_bytes_per_frame() const = 0;
 
     /// Return the minimum number of data bytes expected to store the unwrapped
@@ -450,7 +453,7 @@ namespace FreeDV {
     /// \return The minimum number of data bytes expected to store the unwrapped
     /// codec data.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        min_unwrapped_bytes_per_frame() const = 0;
 
     /// Wrap codec data bytes in a protocol for transmission through the modem.
@@ -475,7 +478,7 @@ namespace FreeDV {
     /// \return The maximum number of data bytes expected to store a wrapped
     /// protocol frame.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        max_wrapped_bytes_per_frame() const = 0;
 
     /// Return the minimum number of data bytes expected to store a wrapped
@@ -485,7 +488,7 @@ namespace FreeDV {
     /// \return The minimum number of data bytes expected to store a wrapped
     /// protocol frame.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        min_wrapped_bytes_per_frame() const = 0;
   };
 
@@ -526,7 +529,7 @@ namespace FreeDV {
     /// The data buffer provided to demodulate16 must be a multiple of
     /// this value. The result is invariant.
     /// \return The number of data bytes necessary to store a modem frame.
-    virtual std::size_t const
+    virtual std::size_t
                        bytes_per_frame() const = 0;
 
     /// Demodulate from audio samples to data.
@@ -556,7 +559,7 @@ namespace FreeDV {
 
     /// Return the duration of a frame in milliseconds.
     /// \return The duration of a frame in milliseconds.
-    virtual int const
+    virtual int
                        frame_duration() const = 0;
 
     /// Return the number of audio samples expected to create a modem
@@ -565,7 +568,7 @@ namespace FreeDV {
     /// data due to the potential for clock skew between stations.
     /// \return The number of audio samples expected to create a codec
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        samples_per_frame() const = 0;
   };
 
@@ -638,13 +641,15 @@ namespace FreeDV {
   class Interfaces {
     public:
                        Interfaces() : codec(0), event_handler(0),
-                        keying_output(0), loudspeaker(0), microphone(0),
-                        modem(0), ptt_input_digital(0), ptt_input_ssb(0),
-                        receiver(0), text_input(0), transmitter(0),
-                        user_interface(0)
+                        framer(0), keying_output(0), loudspeaker(0),
+                        microphone(0), modem(0), ptt_input_digital(0),
+                        ptt_input_ssb(0), receiver(0), text_input(0),
+                        transmitter(0), user_interface(0)
                        {
                        }
 
+    virtual            ~Interfaces() final;
+
     /// The voice codec in use.
     Codec *            codec;
     /// The event loop handler. This is specific to a GUI, or POSIX.
@@ -665,12 +670,12 @@ namespace FreeDV {
     PTTInput *         ptt_input_digital;
     /// The PTT input that indicates the transmission is to be SSB.
     PTTInput *         ptt_input_ssb;
+    /// The audio input from the receiver.
+    AudioInput *       receiver;
     /// The text to be transmitted in our text side-channel.
     TextInput *                text_input;
     /// The audio output that drives the transmitter.
     AudioOutput *      transmitter;
-    /// The audio input from the receiver.
-    AudioInput *       receiver;
     /// The user interface driver. Used for GUIs.
     UserInterface *    user_interface;
 
@@ -686,6 +691,7 @@ namespace FreeDV {
     virtual std::ostream &
                        print(std::ostream & stream) const;
   };
+
   /// Write the driver information from the Interfaces object onto a stream,
   /// for debugging and dumping the configuration information.
   /// \param stream A reference to an instance of ostream upon which the
@@ -743,12 +749,15 @@ namespace FreeDV {
   inline std::size_t
   min(std::size_t a, std::size_t b)
   {
-    a < b ? a : b;
+    return a < b ? a : b;
   }
 
   struct DriverList {
     const char *       key;
-    FreeDV::Base *     (*creator)(const char *);
+    union {
+      FreeDV::Base *   (*creator)(const char *);
+      FreeDV::Base *   (*creator_i)(const char *, Interfaces *);
+    };
     std::ostream &     (*enumerator)(std::ostream &);
   };
 
@@ -879,5 +888,5 @@ namespace FreeDV {
   }
   
   /// Global reference to the driver manager.
-  extern DriverManager * const driver_manager();
+  extern DriverManager * driver_manager();
 }
index 4edc893ddc66816dd8c098cd6851cae2928ef496..b498bfa9aa2a4e77dfe37583884f4d7e7b76803c 100644 (file)
@@ -15,7 +15,7 @@ namespace FreeDV {
   }
 
   void
-  FIFO::out_overrun(std::size_t size) const
+  FIFO::out_overrun() const
   {
     throw std::runtime_error("FIFO outgoing data overrun.");
   }
@@ -30,13 +30,17 @@ namespace FreeDV {
       // memmove() is specified to handle overlap properly.
       memmove(buffer, out, bytes);
 #ifdef DEBUG
-      std::cerr << "FIFO reorder with copy." << std::endl;
+      std::cerr << "FIFO reorder with copy. Size = " << size
+       << ", buffer = " << (void *)buffer << ", buffer_end = "
+       << (void *)buffer_end << ", in = " << (void *)in
+       << ", out = " << (void *)out
+       << std::endl;
 #endif
     }
     out = buffer;
     in = buffer + bytes;
 
-    if ( size > buffer_end - in )
+    if ( size > (std::size_t)(buffer_end - in) )
       throw std::runtime_error("FIFO incoming data overrun.");
 
     return in;
index ac8c6c098f49b76ae426347d08c427afdfa1d48f..bbaa18d4d3e70146b851cc5ca2749759a721acdf 100644 (file)
@@ -24,7 +24,7 @@ namespace FreeDV {
     /// \return The maximum number of data bytes expected to store a wrapped
     /// protocol frame.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        max_wrapped_bytes_per_frame() const;
 
     /// Return the maximum number of data bytes expected to store the unwrapped
@@ -32,7 +32,7 @@ namespace FreeDV {
     /// \return The maximum number of data bytes expected to store the unwrapped
     /// codec data.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        max_unwrapped_bytes_per_frame() const;
 
     /// Return the minimum number of data bytes expected to store the unwrapped
@@ -40,7 +40,7 @@ namespace FreeDV {
     /// \return The minimum number of data bytes expected to store the unwrapped
     /// codec data.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        min_unwrapped_bytes_per_frame() const;
 
     /// Return the minimum number of data bytes expected to store a wrapped
@@ -50,7 +50,7 @@ namespace FreeDV {
     /// \return The minimum number of data bytes expected to store a wrapped
     /// protocol frame.
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        min_wrapped_bytes_per_frame() const;
 
     /// Decode from modem data to codec frames, removing the wrapping protocol.
@@ -94,25 +94,25 @@ namespace FreeDV {
   {
   }
 
-  std::size_t const
+  std::size_t
   FramerNoOp::max_wrapped_bytes_per_frame() const
   {
     return 1;
   }
 
-  std::size_t const
+  std::size_t
   FramerNoOp::max_unwrapped_bytes_per_frame() const
   {
     return 1;
   }
 
-  std::size_t const
+  std::size_t
   FramerNoOp::min_unwrapped_bytes_per_frame() const
   {
     return 1;
   }
 
-  std::size_t const
+  std::size_t
   FramerNoOp::min_wrapped_bytes_per_frame() const
   {
     return 1;
@@ -124,7 +124,7 @@ namespace FreeDV {
    std::size_t * input_length,
    std::size_t output_length)
   {
-    const std::size_t length = std::min(*input_length, output_length);
+    const std::size_t length = min(*input_length, output_length);
     memcpy(o, i, length);
     *input_length = length;
     return length;
@@ -137,7 +137,7 @@ namespace FreeDV {
    std::size_t * input_length,
    std::size_t output_length)
   {
-    const std::size_t length = std::min(*input_length, output_length);
+    const std::size_t length = min(*input_length, output_length);
     memcpy(o, i, length);
     *input_length = length;
     return length;
index 387cfebb2786d604f1d8f2ae2c40f2d93ff902d9..0c47e1e9e95779abfac353bee81da0b155d861d9 100644 (file)
@@ -6,6 +6,10 @@
 static const char empty[1] = { '\0' };
 
 namespace FreeDV {
+  Interfaces::~Interfaces()
+  {
+  }
+
   void
   Interfaces::fill_in()
   {
@@ -19,7 +23,7 @@ namespace FreeDV {
       loudspeaker = Driver::AudioOutDefault();
 
     if ( !microphone )
-      microphone = Driver::Tone(empty);
+      microphone = Driver::AudioInDefault();
 
     if ( !modem )
       modem = Driver::ModemNoOp(empty);
index 6103c7cf4499021f72fe06003a4e99f43a00857a..4e597eb3096189aadf0b354a85db52e8b396d3eb 100644 (file)
@@ -53,13 +53,13 @@ namespace FreeDV {
   }
 
   void
-  LibEvent::monitor(int fd, unsigned int type, void * private_data,
-   void (*event)(int fd, unsigned int type, void * private_data))
+  LibEvent::monitor(int, unsigned int, void *,
+   void (*)(int, unsigned int, void *))
   {
   }
 
   void
-  LibEvent::unmonitor(int fd)
+  LibEvent::unmonitor(int)
   {
   }
 
index d418370964559cd772be8cb844263be14c0f6acc..c0eeda04c084a353ae79405ceda3df02bc80e1a3 100644 (file)
@@ -18,7 +18,7 @@ namespace FreeDV {
     /// The data buffer provided to demodulate16 must be a multiple of
     /// this value. The result is invariant.
     /// \return The number of data bytes necessary to store a modem frame.
-    virtual std::size_t const
+    virtual std::size_t
                        bytes_per_frame() const;
 
     /// Demodulate from audio samples to data.
@@ -48,7 +48,7 @@ namespace FreeDV {
 
     /// Return the duration of a frame in milliseconds.
     /// \return The duration of a frame in milliseconds.
-    virtual int const
+    virtual int
                        frame_duration() const;
 
     /// Return the number of audio samples expected to create a codec
@@ -57,7 +57,7 @@ namespace FreeDV {
     /// invariant for a given SampleRate.
     /// \return The number of audio samples expected to create a codec
     /// frame.
-    virtual std::size_t const
+    virtual std::size_t
                        samples_per_frame() const;
   };
 
@@ -70,7 +70,7 @@ namespace FreeDV {
   {
   }
 
-  std::size_t const
+  std::size_t
   ModemNoOp::bytes_per_frame() const
   {
     return sizeof(std::int16_t);
@@ -83,9 +83,9 @@ namespace FreeDV {
    std::size_t * sample_length,
    std::size_t data_length)
   {
-    const std::size_t length = std::min(data_length / 2, *sample_length);
+    const std::size_t length = min(data_length / 2, *sample_length);
     memcpy(o, i, length * 2);
-    *sample_length = length * 2;
+    *sample_length = length;
     return length;
   }
 
@@ -98,13 +98,13 @@ namespace FreeDV {
     return length / 2;
   }
 
-  int const
+  int
   ModemNoOp::frame_duration() const
   {
     return 1;
   }
 
-  std::size_t const
+  std::size_t
   ModemNoOp::samples_per_frame() const
   {
     return 1;
index 084581f4cee2f9c09c8acd4f16d4afc11320cf4e..9f2f52907bd17daf4be298a388d61aa63b028c3a 100644 (file)
@@ -55,7 +55,13 @@ namespace FreeDV {
   std::size_t
   AudioInALSA::read16(std::int16_t * array, std::size_t length)
   {
-    return length;
+    const int result = snd_pcm_writei(handle, array, length);
+    if ( result >= 0 )
+      return result;
+    else {
+      // FIX: do_throw(result, "Write");
+      return 0; // do_throw doesn't return.
+    }
   }
 
   AudioInput *
index 0e30537e2e5c3353df7c05da58303f7839b26d14..884a1bfb89a733339ffa3a71a5944ee6d86a25fa 100644 (file)
@@ -16,7 +16,7 @@ namespace FreeDV {
     char * const       parameters;
     snd_pcm_t *                handle;
 
-    volatile void
+    void
     do_throw(const int error, const char * message = 0)
     {
       std::ostringstream str;
@@ -92,8 +92,10 @@ namespace FreeDV {
     const int result = snd_pcm_writei(handle, array, length);
     if ( result >= 0 )
       return result;
-    else
+    else {
       do_throw(result, "Write");
+      return 0; // do_throw doesn't return.
+    }
   }
 
   AudioOutput *
@@ -115,8 +117,10 @@ namespace FreeDV {
 
     if ( (available = snd_pcm_avail(handle)) >= 0 )
       return available;
-    else
+    else {
       do_throw(available, "Get Available Frames");
+      return 0; // do_throw doesn't return.
+    }
   }
 
   static bool
index b8974241358792176d14330df8955071edc0d4da..252ba07e3f1ca61105e25fc2df7af8301d2c0801 100644 (file)
@@ -25,10 +25,10 @@ namespace FreeDV {
   private:
     const std::size_t  TempSize = 2048;
     Interfaces * const i;
-    bool               begin_transmit;
     bool               begin_receive;
-    FIFO               input_fifo;
+    bool               begin_transmit;
     FIFO               codec_fifo;
+    FIFO               input_fifo;
     FIFO               output_fifo;
     bool               ptt_digital;
     bool               ptt_ssb;
@@ -40,16 +40,16 @@ namespace FreeDV {
     void               transmit_digital();
     void               transmit_ssb();
   public:
-    int                        run();
-
                        Run(Interfaces *);
                        ~Run();
+
+    void               run();
   };
   
   Run::Run(Interfaces * interfaces)
-  : begin_receive(true), begin_transmit(false), i(interfaces),
-    ptt_digital(false), ptt_ssb(false),
-    input_fifo(TempSize * 2), codec_fifo(TempSize * 2), output_fifo(TempSize * 2)
+  : i(interfaces), begin_receive(true), begin_transmit(false),
+    codec_fifo(TempSize * 2), input_fifo(TempSize * 2),
+    output_fifo(TempSize * 2), ptt_digital(false), ptt_ssb(false)
   {
   }
 
@@ -65,53 +65,6 @@ namespace FreeDV {
     output_fifo.reset();
   }
 
-  int
-  Run::run()
-  {
-    while ( true ) {
-      if ( i->ptt_input_digital->ready() ) {
-        bool state = i->ptt_input_digital->state();
-        if ( state && !ptt_digital && !ptt_ssb ) {
-          ptt_digital = true;
-          begin_transmit = true;
-        }
-        else if ( !state && ptt_digital ) {
-          begin_receive = true;
-          ptt_digital = false;
-        }
-      }
-      if ( i->ptt_input_ssb->ready() ) {
-        bool state = i->ptt_input_ssb->state();
-        if ( state && !ptt_digital && !ptt_ssb ) {
-          ptt_ssb = true;
-          begin_transmit = true;
-        }
-        else if ( !state && ptt_ssb ) {
-          begin_receive = true;
-          ptt_ssb = false;
-        }
-      }
-      if ( begin_transmit ) {
-        reset_fifos();
-        key_down();
-      }
-      else if ( begin_receive ) {
-        reset_fifos();
-        key_up();
-      }
-      else if ( ptt_digital ) {
-        transmit_digital();
-      }
-      else if ( ptt_ssb ) {
-        transmit_ssb();
-      }
-      else {
-        receive();
-      }
-      usleep(20100);
-    }
-  }
-
   void
   Run::key_down() {
     if ( i->keying_output->ready() ) {
@@ -141,14 +94,14 @@ namespace FreeDV {
   Run::receive()
   {
     // Drain any data that the loudspeaker can take.
-    const std::size_t  output_samples = std::min(
+    const std::size_t  output_samples = min(
                         i->loudspeaker->ready(),
                         (output_fifo.outgoing_available() / 2));
 
     if ( output_samples ) {
       const std::size_t result = i->loudspeaker->write16(
-                                 (std::int16_t *)output_fifo.outgoing_buffer
-                                  (output_samples * 2),
+                                 (std::int16_t *)output_fifo.outgoing_buffer(
+                                  output_samples * 2),
                                  output_samples);
 
       if ( result > 0 )
@@ -158,7 +111,7 @@ namespace FreeDV {
     }
     
     // Fill any data that the receiver can provide.
-    const std::size_t  input_samples = std::min(
+    const std::size_t  input_samples = min(
                         i->receiver->ready(),
                         (input_fifo.incoming_available() / 2));
 
@@ -168,7 +121,7 @@ namespace FreeDV {
         input_samples);
 
       if ( result > 0 )
-        output_fifo.outgoing_done(result * 2);
+        input_fifo.incoming_done(result * 2);
       else
        std::cerr << "Loudspeaker I/O error: " << strerror(errno) << std::endl;
     }
@@ -193,7 +146,7 @@ namespace FreeDV {
         input_fifo.outgoing_done(samples_to_demodulate * 2);
 
       if ( result > 0 )
-        output_fifo.incoming_done(result * i->modem->bytes_per_frame());
+        codec_fifo.incoming_done(result);
     }
 
     const std::size_t  frames_to_decode = 
@@ -222,6 +175,14 @@ namespace FreeDV {
     }
   }
   
+  void
+  Run::run()
+  {
+    while ( true ) {
+      receive();
+    }
+  }
+
   void
   Run::transmit_digital()
   {
@@ -236,6 +197,7 @@ namespace FreeDV {
   run(Interfaces * i)
   {
     Run * r = new Run(i);
-    return r->run();
+    r->run();
+    return 0;
   }
 }
index 751016fbdb62a6246b63b46f69f0ed7aad47a9ea..af8047e33eed8a790a092f7fc3f1df4b13595534 100644 (file)
@@ -27,5 +27,5 @@ protected:
 };
 
 TEST_F(BlankPanelTest, NeverReady) {
-  EXPECT_EQ(0, u->ready());
+  EXPECT_EQ(0U, u->ready());
 }
index 42794ad603a2c27649fdbdfb6305a5218dc20dd2..5333f5f265d3db24e0a721b07a5d2b5c1da78917 100644 (file)
@@ -24,58 +24,58 @@ protected:
 };
 
 TEST_F(FIFOTest, CanFillAndDrain) {
-  ASSERT_EQ(100, f->incoming_available());
+  ASSERT_EQ(100U, f->incoming_available());
   memset(f->incoming_buffer(100), 255, 100);
-  ASSERT_EQ(0, f->outgoing_available());
+  ASSERT_EQ(0U, f->outgoing_available());
   f->incoming_done(100);
-  ASSERT_EQ(100, f->outgoing_available());
-  ASSERT_EQ(0, f->incoming_available());
+  ASSERT_EQ(100U, f->outgoing_available());
+  ASSERT_EQ(0U, f->incoming_available());
   EXPECT_THROW(f->incoming_buffer(1), std::runtime_error);
-  ASSERT_EQ(100, f->outgoing_available());
+  ASSERT_EQ(100U, f->outgoing_available());
   ASSERT_NE((uint8_t *)0, f->outgoing_buffer(100));
   f->outgoing_done(100);
-  ASSERT_EQ(0, f->outgoing_available());
-  ASSERT_EQ(100, f->incoming_available());
-  ASSERT_EQ(100, f->incoming_available());
+  ASSERT_EQ(0U, f->outgoing_available());
+  ASSERT_EQ(100U, f->incoming_available());
+  ASSERT_EQ(100U, f->incoming_available());
   memset(f->incoming_buffer(100), 255, 100);
-  ASSERT_EQ(0, f->outgoing_available());
+  ASSERT_EQ(0U, f->outgoing_available());
   f->incoming_done(100);
-  ASSERT_EQ(100, f->outgoing_available());
-  ASSERT_EQ(0, f->incoming_available());
+  ASSERT_EQ(100U, f->outgoing_available());
+  ASSERT_EQ(0U, f->incoming_available());
 }
 
 TEST_F(FIFOTest, Reorder) {
   uint8_t * b;
   const uint8_t * r;
 
-  ASSERT_EQ(100, f->incoming_available());
+  ASSERT_EQ(100U, f->incoming_available());
   ASSERT_NE((uint8_t *)0, b = f->incoming_buffer(99));
   memset(b, 0, 98);
   b[98] = 'b';
   f->incoming_done(99);
-  ASSERT_EQ(1, f->incoming_available());
-  ASSERT_EQ(99, f->outgoing_available());
+  ASSERT_EQ(1U, f->incoming_available());
+  ASSERT_EQ(99U, f->outgoing_available());
   ASSERT_NE((uint8_t *)0, f->outgoing_buffer(98));
   f->outgoing_done(98);
-  ASSERT_EQ(1, f->outgoing_available());
-  ASSERT_EQ(99, f->incoming_available());
+  ASSERT_EQ(1U, f->outgoing_available());
+  ASSERT_EQ(99U, f->incoming_available());
   // This should cause reorder().
   ASSERT_NE((uint8_t *)0, b = f->incoming_buffer(2));
   f->incoming_done(0);
-  ASSERT_EQ(99, f->incoming_available());
-  ASSERT_EQ(1, f->outgoing_available());
+  ASSERT_EQ(99U, f->incoming_available());
+  ASSERT_EQ(1U, f->outgoing_available());
   ASSERT_NE((uint8_t *)0, r = f->outgoing_buffer(1));
   ASSERT_EQ('b', *r);
   f->outgoing_done(1);
 }
 
 TEST_F(FIFOTest, CanReset) {
-  ASSERT_EQ(100, f->incoming_available());
-  ASSERT_EQ(0, f->outgoing_available());
+  ASSERT_EQ(100U, f->incoming_available());
+  ASSERT_EQ(0U, f->outgoing_available());
   f->incoming_done(100);
-  ASSERT_EQ(100, f->outgoing_available());
-  ASSERT_EQ(0, f->incoming_available());
+  ASSERT_EQ(100U, f->outgoing_available());
+  ASSERT_EQ(0U, f->incoming_available());
   f->reset();
-  ASSERT_EQ(0, f->outgoing_available());
-  ASSERT_EQ(100, f->incoming_available());
+  ASSERT_EQ(0U, f->outgoing_available());
+  ASSERT_EQ(100U, f->incoming_available());
 }
index d78ea840c07df6108126193283dc0a3acc189c5a..754292195917dd989ffc7267a7c23bcb9ccac434 100644 (file)
@@ -46,19 +46,19 @@ protected:
 };
 
 TEST_F(PTTInputTransmitTest, ReadyAndRead) {
-  EXPECT_EQ(1, i->ready());
-  EXPECT_EQ(1, i->ready());
+  EXPECT_EQ(1U, i->ready());
+  EXPECT_EQ(1U, i->ready());
   EXPECT_TRUE(i->state());
-  EXPECT_EQ(0, i->ready());
-  EXPECT_EQ(0, i->ready());
+  EXPECT_EQ(0U, i->ready());
+  EXPECT_EQ(0U, i->ready());
   EXPECT_THROW(i->state(), std::runtime_error);
 }
 
 TEST_F(PTTInputReceiveTest, ReadyAndRead) {
-  EXPECT_EQ(1, i->ready());
-  EXPECT_EQ(1, i->ready());
+  EXPECT_EQ(1U, i->ready());
+  EXPECT_EQ(1U, i->ready());
   EXPECT_FALSE(i->state());
-  EXPECT_EQ(0, i->ready());
-  EXPECT_EQ(0, i->ready());
+  EXPECT_EQ(0U, i->ready());
+  EXPECT_EQ(0U, i->ready());
   EXPECT_THROW(i->state(), std::runtime_error);
 }
index 0f590e5a928512bda27274fc972836bd8d3f441e..8a01adaa636db95fff212df145544679c8f06365 100644 (file)
@@ -31,11 +31,11 @@ TEST_F(TextConstantTest, ReadyAndRead) {
   char buffer[1024];
 
   EXPECT_EQ(sizeof(text) - 1, i->ready());
-  EXPECT_EQ(10, i->read(buffer, 10));
+  EXPECT_EQ(10U, i->read(buffer, 10));
   EXPECT_EQ(sizeof(text) - 1 - 10, i->ready());
-  EXPECT_EQ(0, i->read(buffer, 0));
+  EXPECT_EQ(0U, i->read(buffer, 0));
   EXPECT_EQ(sizeof(text) - 1 - 10, i->ready());
   EXPECT_EQ(sizeof(text) - 1 - 10, i->read(buffer, sizeof(buffer)));
-  EXPECT_EQ(0, i->ready());
+  EXPECT_EQ(0U, i->ready());
   EXPECT_THROW(i->read(buffer, sizeof(buffer)), std::runtime_error);
 }
index 25e57ad96a9c760d26715ee1d4d8dcdacbf022d5..90f7eea56ca193001367e277d6997f31e835097e 100644 (file)
@@ -8,8 +8,8 @@ namespace FreeDV {
   /// This driver provides constant text.
   class TextConstant : public TextInput {
   private:
-    const std::size_t  length;
     std::size_t                index;
+    const std::size_t  length;
 
   public:
     /// Instantiate the constant text driver.
index e444a0dd3e3f00d79051f30176da39e2242a0ff4..dff8937a704ff9db178650ff5fe9213efeab7067 100644 (file)
@@ -116,6 +116,8 @@ namespace FreeDV {
       array[i] = (std::int16_t)rint(value * master_amplitude * ((1 << 15) - 1));
     }
     clock = (clock + length) % SampleRate;
+
+    return length;
   }
 
   std::size_t
index 5a74388e10e78e1c9c5e3e342d241c1369777639..95497c93b8b14dadf2d44a9bc79a9b50beba5c1a 100644 (file)
@@ -3,7 +3,7 @@
 #include "drivers.h"
 
 namespace FreeDV {
-  UserInterface::UserInterface(const char * name, const char * parameters, Interfaces * interfaces)
+  UserInterface::UserInterface(const char * name, const char * parameters, Interfaces *)
   : IODevice(name, parameters)
   {
   }