diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-05 00:01:18 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-05 00:01:18 +0000 |
commit | 42995d7bf396933ee60c5f89c354ea89cf13df0d (patch) | |
tree | cfdcea0ac57420e7baf570bfe435e107bb842541 /flow/resample.h | |
download | arts-42995d7bf396933ee60c5f89c354ea89cf13df0d.tar.gz arts-42995d7bf396933ee60c5f89c354ea89cf13df0d.zip |
Copy of aRts for Trinity modifications
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/dependencies/arts@1070145 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'flow/resample.h')
-rw-r--r-- | flow/resample.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/flow/resample.h b/flow/resample.h new file mode 100644 index 0000000..3cb99e3 --- /dev/null +++ b/flow/resample.h @@ -0,0 +1,167 @@ + /* + + Copyright (C) 2000 Stefan Westerfeld + stefan@space.twc.de + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + */ + + +#ifndef ARTS_FLOW_RESAMPLE_H +#define ARTS_FLOW_RESAMPLE_H + +#include "arts_export.h" + +/* + * BC - Status (2002-03-08): Resampler / Refiller. + * + * These classes will be kept binary compatible. Resampler has a private + * data pointer for this purpose. + */ + +namespace Arts { + +/** + * Refiller interface + * + * this is used by the resampler class + */ +class ARTS_EXPORT Refiller { +public: + /** + * callback method to supply data to the Resampler + * + * here you supply data in the encoding specified in the Resampler class + * (bits, channels, endianness) to the Resampler + * + * @param buffer a pointer to a buffer where the data can be filled to + * @param len the size of the buffer in bytes + * + * @returns the number of bytes really available + */ + virtual unsigned long read(unsigned char *buffer, unsigned long len) = 0; + virtual ~Refiller(); +}; + +class ResamplerPrivate; + +/** + * The Resampler class resamples data from an input stream, which is read + * through the Refiller interface, and renders it into the float format which + * aRts usually uses, converting the sampling rate and format as needed. + */ +class ARTS_EXPORT Resampler { +protected: + static const unsigned int bufferSize = 256; // 64 samples in buffer + static const unsigned int bufferWrap = 64; // + "wrap around" + /* + * BC: bufferWrap just needs channels * (filtersize - 1) * bytes per sample + * bytes wrap around - this used to be 4: 2 channels, linear interpolation, + * 16bit. However, for supporting float resampling and/or better filters, + * we'll make this 64 to be safe. + */ + + int bufferSamples; + int sampleSize; + int dropBytes; + + Refiller *refiller; + double pos, step; + int channels,bits; + + unsigned char buffer[bufferSize+bufferWrap]; + float fbuffer[bufferSize+bufferWrap]; + long block, haveBlock; + + class ResamplerPrivate *d; + + void updateSampleSize(); + void ensureRefill(); +public: + /** + * constructor + * + */ + Resampler(Refiller *refiller); + ~Resampler(); + + /** + * sets the resampling step in the input stream + * + * for instance, settings step to 2.0, the file would be played twice as + * fast - you can calculate the resampling step from the sampling rate + * the stream you resample was recorded at, and the sampling rate you want + * it to be resampled to, using + * + * step = originalSamplingRate / desiredSamplingRate + * + * for instance, if a stream recorded at 22050 Hz is to be played at 48000 + * Hz, step would be + * + * step = 22050 / 48000 = 0.46 + */ + void setStep(double step); + + /** + * sets the number of channels in the input stream + * + * the channels are expected to be interleaved, thus if you have two + * channels, you will have one sample for the left stream, one for the + * right, one for the left, ... and so on + * + * currently only either mono (channels = 1) or stereo (channels = 2) + * streams are supported + */ + void setChannels(int channels); + + /** + * sets the number of bits in the input stream + * + * currently, only 16 bit and 8 bit streams are supported + */ + void setBits(int bits); + + enum Endianness { bigEndian, littleEndian }; + + /** + * sets the endianess of the input stream + * + * supported are bigEndian and littleEndian + */ + void setEndianness(Endianness endianness); + + /** + * renders a buffer of float samples from the input stream + * + * the data is obtained by querying the refiller for data from the + * input stream and filling them into the float array pointed to by + * left and right - if reading data fails, the underrun flag is set + */ + void run(float *left, float *right, unsigned long samples); + + /** + * query the underrun flag + * + * underruns occur if run is called, but no data is available from the + * Refiller object + */ + bool underrun(); +}; + +} + +#endif /* ARTS_FLOW_RESAMPLE_H */ |