From 7152ddfafbd264568ccca8e30c041b855d05b74e Mon Sep 17 00:00:00 2001 From: bruceperens Date: Wed, 22 Jan 2014 05:33:43 +0000 Subject: [PATCH] FIFO implemented but not tested. git-svn-id: https://svn.code.sf.net/p/freetel/code@1390 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/parameters/cxx-flags.txt | 2 +- freedv-server/source/drivers.h | 8 ++++---- freedv-server/source/fifo.cpp | 27 +++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/freedv-server/parameters/cxx-flags.txt b/freedv-server/parameters/cxx-flags.txt index 3df231ea..4208c7b0 100644 --- a/freedv-server/parameters/cxx-flags.txt +++ b/freedv-server/parameters/cxx-flags.txt @@ -1 +1 @@ --std=c++11 -g -pedantic +-std=c++11 -g -pedantic -DDEBUG diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index 0a5cf5e9..98cb614a 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -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; diff --git a/freedv-server/source/fifo.cpp b/freedv-server/source/fifo.cpp index 7ab06e62..5d094dd2 100644 --- a/freedv-server/source/fifo.cpp +++ b/freedv-server/source/fifo.cpp @@ -1,14 +1,39 @@ #include "drivers.h" +#include +#include 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."); } } -- 2.25.1