LCOV - code coverage report
Current view: top level - media/libsoundtouch/src - RateTransposer.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 1 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : ////////////////////////////////////////////////////////////////////////////////
       2             : /// 
       3             : /// Sample rate transposer. Changes sample rate by using linear interpolation 
       4             : /// together with anti-alias filtering (first order interpolation with anti-
       5             : /// alias filtering should be quite adequate for this application).
       6             : ///
       7             : /// Use either of the derived classes of 'RateTransposerInteger' or 
       8             : /// 'RateTransposerFloat' for corresponding integer/floating point tranposing
       9             : /// algorithm implementation.
      10             : ///
      11             : /// Author        : Copyright (c) Olli Parviainen
      12             : /// Author e-mail : oparviai 'at' iki.fi
      13             : /// SoundTouch WWW: http://www.surina.net/soundtouch
      14             : ///
      15             : ////////////////////////////////////////////////////////////////////////////////
      16             : //
      17             : // Last changed  : $Date: 2014-04-06 15:57:21 +0000 (Sun, 06 Apr 2014) $
      18             : // File revision : $Revision: 4 $
      19             : //
      20             : // $Id: RateTransposer.h 195 2014-04-06 15:57:21Z oparviai $
      21             : //
      22             : ////////////////////////////////////////////////////////////////////////////////
      23             : //
      24             : // License :
      25             : //
      26             : //  SoundTouch audio processing library
      27             : //  Copyright (c) Olli Parviainen
      28             : //
      29             : //  This library is free software; you can redistribute it and/or
      30             : //  modify it under the terms of the GNU Lesser General Public
      31             : //  License as published by the Free Software Foundation; either
      32             : //  version 2.1 of the License, or (at your option) any later version.
      33             : //
      34             : //  This library is distributed in the hope that it will be useful,
      35             : //  but WITHOUT ANY WARRANTY; without even the implied warranty of
      36             : //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      37             : //  Lesser General Public License for more details.
      38             : //
      39             : //  You should have received a copy of the GNU Lesser General Public
      40             : //  License along with this library; if not, write to the Free Software
      41             : //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
      42             : //
      43             : ////////////////////////////////////////////////////////////////////////////////
      44             : 
      45             : #ifndef RateTransposer_H
      46             : #define RateTransposer_H
      47             : 
      48             : #include <stddef.h>
      49             : #include "AAFilter.h"
      50             : #include "FIFOSamplePipe.h"
      51             : #include "FIFOSampleBuffer.h"
      52             : 
      53             : #include "STTypes.h"
      54             : 
      55             : namespace soundtouch
      56             : {
      57             : 
      58             : /// Abstract base class for transposer implementations (linear, advanced vs integer, float etc)
      59             : class TransposerBase
      60             : {
      61             : public:
      62             :         enum ALGORITHM {
      63             :         LINEAR = 0,
      64             :         CUBIC,
      65             :         SHANNON
      66             :     };
      67             : 
      68             : protected:
      69             :     virtual void resetRegisters() = 0;
      70             : 
      71             :     virtual int transposeMono(SAMPLETYPE *dest, 
      72             :                         const SAMPLETYPE *src, 
      73             :                         int &srcSamples)  = 0;
      74             :     virtual int transposeStereo(SAMPLETYPE *dest, 
      75             :                         const SAMPLETYPE *src, 
      76             :                         int &srcSamples) = 0;
      77             :     virtual int transposeMulti(SAMPLETYPE *dest, 
      78             :                         const SAMPLETYPE *src, 
      79             :                         int &srcSamples) = 0;
      80             : 
      81             :     static ALGORITHM algorithm;
      82             : 
      83             : public:
      84             :     float rate;
      85             :     int numChannels;
      86             : 
      87             :     TransposerBase();
      88             :     virtual ~TransposerBase();
      89             : 
      90             :     virtual int transpose(FIFOSampleBuffer &dest, FIFOSampleBuffer &src);
      91             :     virtual void setRate(float newRate);
      92             :     virtual void setChannels(int channels);
      93             : 
      94             :     // static factory function
      95             :     static TransposerBase *newInstance();
      96             : 
      97             :     // static function to set interpolation algorithm
      98             :     static void setAlgorithm(ALGORITHM a);
      99             : };
     100             : 
     101             : 
     102             : /// A common linear samplerate transposer class.
     103             : ///
     104             : class RateTransposer : public FIFOProcessor
     105             : {
     106             : protected:
     107             :     /// Anti-alias filter object
     108             :     AAFilter *pAAFilter;
     109             :     TransposerBase *pTransposer;
     110             : 
     111             :     /// Buffer for collecting samples to feed the anti-alias filter between
     112             :     /// two batches
     113             :     FIFOSampleBuffer inputBuffer;
     114             : 
     115             :     /// Buffer for keeping samples between transposing & anti-alias filter
     116             :     FIFOSampleBuffer midBuffer;
     117             : 
     118             :     /// Output sample buffer
     119             :     FIFOSampleBuffer outputBuffer;
     120             : 
     121             :     bool bUseAAFilter;
     122             : 
     123             : 
     124             :     /// Transposes sample rate by applying anti-alias filter to prevent folding. 
     125             :     /// Returns amount of samples returned in the "dest" buffer.
     126             :     /// The maximum amount of samples that can be returned at a time is set by
     127             :     /// the 'set_returnBuffer_size' function.
     128             :     void processSamples(const SAMPLETYPE *src, 
     129             :                         uint numSamples);
     130             : 
     131             : public:
     132             :     RateTransposer();
     133             :     virtual ~RateTransposer();
     134             : 
     135             :     /// Operator 'new' is overloaded so that it automatically creates a suitable instance 
     136             :     /// depending on if we're to use integer or floating point arithmetics.
     137             : //    static void *operator new(size_t s);
     138             : 
     139             :     /// Use this function instead of "new" operator to create a new instance of this class. 
     140             :     /// This function automatically chooses a correct implementation, depending on if 
     141             :     /// integer ot floating point arithmetics are to be used.
     142             : //    static RateTransposer *newInstance();
     143             : 
     144             :     /// Returns the output buffer object
     145           0 :     FIFOSamplePipe *getOutput() { return &outputBuffer; };
     146             : 
     147             :     /// Returns the store buffer object
     148             : //    FIFOSamplePipe *getStore() { return &storeBuffer; };
     149             : 
     150             :     /// Return anti-alias filter object
     151             :     AAFilter *getAAFilter();
     152             : 
     153             :     /// Enables/disables the anti-alias filter. Zero to disable, nonzero to enable
     154             :     void enableAAFilter(bool newMode);
     155             : 
     156             :     /// Returns nonzero if anti-alias filter is enabled.
     157             :     bool isAAFilterEnabled() const;
     158             : 
     159             :     /// Sets new target rate. Normal rate = 1.0, smaller values represent slower 
     160             :     /// rate, larger faster rates.
     161             :     virtual void setRate(float newRate);
     162             : 
     163             :     /// Sets the number of channels, 1 = mono, 2 = stereo
     164             :     void setChannels(int channels);
     165             : 
     166             :     /// Adds 'numSamples' pcs of samples from the 'samples' memory position into
     167             :     /// the input of the object.
     168             :     void putSamples(const SAMPLETYPE *samples, uint numSamples);
     169             : 
     170             :     /// Clears all the samples in the object
     171             :     void clear();
     172             : 
     173             :     /// Returns nonzero if there aren't any samples available for outputting.
     174             :     int isEmpty() const;
     175             : };
     176             : 
     177             : }
     178             : 
     179             : #endif

Generated by: LCOV version 1.13