FIFO implemented but not tested.
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 22 Jan 2014 05:33:43 +0000 (05:33 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 22 Jan 2014 05:33:43 +0000 (05:33 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1390 01035d8c-6547-0410-b346-abe4f91aad63

freedv-server/parameters/cxx-flags.txt
freedv-server/source/drivers.h
freedv-server/source/fifo.cpp

index 3df231eac10c37692b1df31c68125bc320aa2755..4208c7b040e6fd12f6de4225fea48c47d3476a1e 100644 (file)
@@ -1 +1 @@
--std=c++11 -g -pedantic
+-std=c++11 -g -pedantic -DDEBUG
index 0a5cf5e9b814c607262bc0970876a86d7f6f61e2..98cb614af1c50edd5aa20a1e3667278bc408bc0d 100644 (file)
@@ -19,15 +19,15 @@ namespace FreeDV {
   ///  or a memory leak will occurr.
   char *       copy_string(const char * s);
 
-  /// Simple C++ fifo buffer class with zero copy (most of the time).
+  /// Simple C++ FIFO buffer class with zero copy (most of the time).
   /// Not thread-safe on its own, you must have a mutex for access to it.
+  /// Doesn't grow, size is specified at instantiation.
   /// Written to avoid STL templates, Boost, etc. in order to keep down the
   /// size of the embedded version of this program. 
   class FIFO {
   private:
-    char *             buffer;
-    char *             buffer_end;
-    std::size_t                buffer_length;
+    char * const       buffer;
+    const char * const buffer_end;
     char *             in;
     const char *       out;
 
index 7ab06e629ec0f5e104fc39e640e16d762c3e8ba9..5d094dd2ef751ea8edb50ab889eddd8175af7517 100644 (file)
@@ -1,14 +1,39 @@
 #include "drivers.h"
+#include <stdexcept>
+#include <cstring>
 
 namespace FreeDV {
+  FIFO::FIFO(std::size_t size)
+  : buffer(new char[size]), buffer_end(buffer + size)
+  {
+    
+  }
+
   char *
   FIFO::reorder(std::size_t size)
   {
-    return 0;
+    const std::size_t bytes = in - out;
+
+    if ( bytes > 0 ) {
+
+      // memmove() is specified to handle overlap properly.
+      memmove(buffer, out, bytes);
+#ifdef DEBUG
+      std::cerr << "FIFO reorder with copy." << std::endl;
+#endif
+    }
+    out = buffer;
+    in = buffer + bytes;
+
+    if ( size > buffer_end - in )
+      throw std::runtime_error("FIFO incoming data overrun.");
+
+    return in;
   }
 
   void
   FIFO::out_overrun(std::size_t size) const
   {
+    throw std::runtime_error("FIFO outgoing data overrun.");
   }
 }