summaryrefslogtreecommitdiffstats
path: root/flow/resample.h
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-05 00:01:18 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-05 00:01:18 +0000
commit42995d7bf396933ee60c5f89c354ea89cf13df0d (patch)
treecfdcea0ac57420e7baf570bfe435e107bb842541 /flow/resample.h
downloadarts-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.h167
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 */