media/libsoundtouch/src/RateTransposer.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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 10:57:21 -0500 (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 ////////////////////////////////////////////////////////////////////////////////
    45 #ifndef RateTransposer_H
    46 #define RateTransposer_H
    48 #include <stddef.h>
    49 #include "AAFilter.h"
    50 #include "FIFOSamplePipe.h"
    51 #include "FIFOSampleBuffer.h"
    53 #include "STTypes.h"
    55 namespace soundtouch
    56 {
    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     };
    68 protected:
    69     virtual void resetRegisters() = 0;
    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;
    81     static ALGORITHM algorithm;
    83 public:
    84     float rate;
    85     int numChannels;
    87     TransposerBase();
    88     virtual ~TransposerBase();
    90     virtual int transpose(FIFOSampleBuffer &dest, FIFOSampleBuffer &src);
    91     virtual void setRate(float newRate);
    92     virtual void setChannels(int channels);
    94     // static factory function
    95     static TransposerBase *newInstance();
    97     // static function to set interpolation algorithm
    98     static void setAlgorithm(ALGORITHM a);
    99 };
   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;
   111     /// Buffer for collecting samples to feed the anti-alias filter between
   112     /// two batches
   113     FIFOSampleBuffer inputBuffer;
   115     /// Buffer for keeping samples between transposing & anti-alias filter
   116     FIFOSampleBuffer midBuffer;
   118     /// Output sample buffer
   119     FIFOSampleBuffer outputBuffer;
   121     bool bUseAAFilter;
   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);
   131 public:
   132     RateTransposer();
   133     virtual ~RateTransposer();
   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);
   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();
   144     /// Returns the output buffer object
   145     FIFOSamplePipe *getOutput() { return &outputBuffer; };
   147     /// Returns the store buffer object
   148 //    FIFOSamplePipe *getStore() { return &storeBuffer; };
   150     /// Return anti-alias filter object
   151     AAFilter *getAAFilter();
   153     /// Enables/disables the anti-alias filter. Zero to disable, nonzero to enable
   154     void enableAAFilter(bool newMode);
   156     /// Returns nonzero if anti-alias filter is enabled.
   157     bool isAAFilterEnabled() const;
   159     /// Sets new target rate. Normal rate = 1.0, smaller values represent slower 
   160     /// rate, larger faster rates.
   161     virtual void setRate(float newRate);
   163     /// Sets the number of channels, 1 = mono, 2 = stereo
   164     void setChannels(int channels);
   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);
   170     /// Clears all the samples in the object
   171     void clear();
   173     /// Returns nonzero if there aren't any samples available for outputting.
   174     int isEmpty() const;
   175 };
   177 }
   179 #endif

mercurial