media/libsoundtouch/src/FIFOSamplePipe.h

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:d30d7f18b5aa
1 ////////////////////////////////////////////////////////////////////////////////
2 ///
3 /// 'FIFOSamplePipe' : An abstract base class for classes that manipulate sound
4 /// samples by operating like a first-in-first-out pipe: New samples are fed
5 /// into one end of the pipe with the 'putSamples' function, and the processed
6 /// samples are received from the other end with the 'receiveSamples' function.
7 ///
8 /// 'FIFOProcessor' : A base class for classes the do signal processing with
9 /// the samples while operating like a first-in-first-out pipe. When samples
10 /// are input with the 'putSamples' function, the class processes them
11 /// and moves the processed samples to the given 'output' pipe object, which
12 /// may be either another processing stage, or a fifo sample buffer object.
13 ///
14 /// Author : Copyright (c) Olli Parviainen
15 /// Author e-mail : oparviai 'at' iki.fi
16 /// SoundTouch WWW: http://www.surina.net/soundtouch
17 ///
18 ////////////////////////////////////////////////////////////////////////////////
19 //
20 // Last changed : $Date: 2012-06-13 14:29:53 -0500 (Wed, 13 Jun 2012) $
21 // File revision : $Revision: 4 $
22 //
23 // $Id: FIFOSamplePipe.h 143 2012-06-13 19:29:53Z oparviai $
24 //
25 ////////////////////////////////////////////////////////////////////////////////
26 //
27 // License :
28 //
29 // SoundTouch audio processing library
30 // Copyright (c) Olli Parviainen
31 //
32 // This library is free software; you can redistribute it and/or
33 // modify it under the terms of the GNU Lesser General Public
34 // License as published by the Free Software Foundation; either
35 // version 2.1 of the License, or (at your option) any later version.
36 //
37 // This library is distributed in the hope that it will be useful,
38 // but WITHOUT ANY WARRANTY; without even the implied warranty of
39 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
40 // Lesser General Public License for more details.
41 //
42 // You should have received a copy of the GNU Lesser General Public
43 // License along with this library; if not, write to the Free Software
44 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
45 //
46 ////////////////////////////////////////////////////////////////////////////////
47
48 #ifndef FIFOSamplePipe_H
49 #define FIFOSamplePipe_H
50
51 #include <assert.h>
52 #include <stdlib.h>
53 #include "STTypes.h"
54
55 namespace soundtouch
56 {
57
58 /// Abstract base class for FIFO (first-in-first-out) sample processing classes.
59 class FIFOSamplePipe
60 {
61 public:
62 // virtual default destructor
63 virtual ~FIFOSamplePipe() {}
64
65
66 /// Returns a pointer to the beginning of the output samples.
67 /// This function is provided for accessing the output samples directly.
68 /// Please be careful for not to corrupt the book-keeping!
69 ///
70 /// When using this function to output samples, also remember to 'remove' the
71 /// output samples from the buffer by calling the
72 /// 'receiveSamples(numSamples)' function
73 virtual SAMPLETYPE *ptrBegin() = 0;
74
75 /// Adds 'numSamples' pcs of samples from the 'samples' memory position to
76 /// the sample buffer.
77 virtual void putSamples(const SAMPLETYPE *samples, ///< Pointer to samples.
78 uint numSamples ///< Number of samples to insert.
79 ) = 0;
80
81
82 // Moves samples from the 'other' pipe instance to this instance.
83 void moveSamples(FIFOSamplePipe &other ///< Other pipe instance where from the receive the data.
84 )
85 {
86 int oNumSamples = other.numSamples();
87
88 putSamples(other.ptrBegin(), oNumSamples);
89 other.receiveSamples(oNumSamples);
90 };
91
92 /// Output samples from beginning of the sample buffer. Copies requested samples to
93 /// output buffer and removes them from the sample buffer. If there are less than
94 /// 'numsample' samples in the buffer, returns all that available.
95 ///
96 /// \return Number of samples returned.
97 virtual uint receiveSamples(SAMPLETYPE *output, ///< Buffer where to copy output samples.
98 uint maxSamples ///< How many samples to receive at max.
99 ) = 0;
100
101 /// Adjusts book-keeping so that given number of samples are removed from beginning of the
102 /// sample buffer without copying them anywhere.
103 ///
104 /// Used to reduce the number of samples in the buffer when accessing the sample buffer directly
105 /// with 'ptrBegin' function.
106 virtual uint receiveSamples(uint maxSamples ///< Remove this many samples from the beginning of pipe.
107 ) = 0;
108
109 /// Returns number of samples currently available.
110 virtual uint numSamples() const = 0;
111
112 // Returns nonzero if there aren't any samples available for outputting.
113 virtual int isEmpty() const = 0;
114
115 /// Clears all the samples.
116 virtual void clear() = 0;
117
118 /// allow trimming (downwards) amount of samples in pipeline.
119 /// Returns adjusted amount of samples
120 virtual uint adjustAmountOfSamples(uint numSamples) = 0;
121
122 };
123
124
125
126 /// Base-class for sound processing routines working in FIFO principle. With this base
127 /// class it's easy to implement sound processing stages that can be chained together,
128 /// so that samples that are fed into beginning of the pipe automatically go through
129 /// all the processing stages.
130 ///
131 /// When samples are input to this class, they're first processed and then put to
132 /// the FIFO pipe that's defined as output of this class. This output pipe can be
133 /// either other processing stage or a FIFO sample buffer.
134 class FIFOProcessor :public FIFOSamplePipe
135 {
136 protected:
137 /// Internal pipe where processed samples are put.
138 FIFOSamplePipe *output;
139
140 /// Sets output pipe.
141 void setOutPipe(FIFOSamplePipe *pOutput)
142 {
143 assert(output == NULL);
144 assert(pOutput != NULL);
145 output = pOutput;
146 }
147
148
149 /// Constructor. Doesn't define output pipe; it has to be set be
150 /// 'setOutPipe' function.
151 FIFOProcessor()
152 {
153 output = NULL;
154 }
155
156
157 /// Constructor. Configures output pipe.
158 FIFOProcessor(FIFOSamplePipe *pOutput ///< Output pipe.
159 )
160 {
161 output = pOutput;
162 }
163
164
165 /// Destructor.
166 virtual ~FIFOProcessor()
167 {
168 }
169
170
171 /// Returns a pointer to the beginning of the output samples.
172 /// This function is provided for accessing the output samples directly.
173 /// Please be careful for not to corrupt the book-keeping!
174 ///
175 /// When using this function to output samples, also remember to 'remove' the
176 /// output samples from the buffer by calling the
177 /// 'receiveSamples(numSamples)' function
178 virtual SAMPLETYPE *ptrBegin()
179 {
180 return output->ptrBegin();
181 }
182
183 public:
184
185 /// Output samples from beginning of the sample buffer. Copies requested samples to
186 /// output buffer and removes them from the sample buffer. If there are less than
187 /// 'numsample' samples in the buffer, returns all that available.
188 ///
189 /// \return Number of samples returned.
190 virtual uint receiveSamples(SAMPLETYPE *outBuffer, ///< Buffer where to copy output samples.
191 uint maxSamples ///< How many samples to receive at max.
192 )
193 {
194 return output->receiveSamples(outBuffer, maxSamples);
195 }
196
197
198 /// Adjusts book-keeping so that given number of samples are removed from beginning of the
199 /// sample buffer without copying them anywhere.
200 ///
201 /// Used to reduce the number of samples in the buffer when accessing the sample buffer directly
202 /// with 'ptrBegin' function.
203 virtual uint receiveSamples(uint maxSamples ///< Remove this many samples from the beginning of pipe.
204 )
205 {
206 return output->receiveSamples(maxSamples);
207 }
208
209
210 /// Returns number of samples currently available.
211 virtual uint numSamples() const
212 {
213 return output->numSamples();
214 }
215
216
217 /// Returns nonzero if there aren't any samples available for outputting.
218 virtual int isEmpty() const
219 {
220 return output->isEmpty();
221 }
222
223 /// allow trimming (downwards) amount of samples in pipeline.
224 /// Returns adjusted amount of samples
225 virtual uint adjustAmountOfSamples(uint numSamples)
226 {
227 return output->adjustAmountOfSamples(numSamples);
228 }
229
230 };
231
232 }
233
234 #endif

mercurial