summaryrefslogtreecommitdiff
path: root/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gme/game-music-emu-0.6pre/gme/Resampler.h')
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Resampler.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h b/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h
new file mode 100644
index 00000000..c8f96f72
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h
@@ -0,0 +1,110 @@
+// Common interface for resamplers
+
+// Game_Music_Emu 0.6-pre
+#ifndef RESAMPLER_H
+#define RESAMPLER_H
+
+#include "blargg_common.h"
+
+class Resampler {
+public:
+
+ virtual ~Resampler();
+
+ // Sets input/output resampling ratio
+ blargg_err_t set_rate( double );
+
+ // Current input/output ratio
+ double rate() const { return rate_; }
+
+ // Samples are 16-bit signed
+ typedef short sample_t;
+
+// One of two different buffering schemes can be used, as decided by the caller:
+
+// External buffering (caller provides input buffer)
+
+ // Resamples in to at most n out samples and returns number of samples actually
+ // written. Sets *in_size to number of input samples that aren't needed anymore
+ // and should be removed from input.
+ int resample( sample_t out [], int n, sample_t const in [], int* in_size );
+
+// Internal buffering (resampler manages buffer)
+
+ // Resizes input buffer to n samples, then clears it
+ blargg_err_t resize_buffer( int n );
+
+ // Clears input buffer
+ void clear();
+
+ // Writes at most n samples to input buffer and returns number actually written.
+ // Result will be less than n if there isn't enough free space in buffer.
+ int write( sample_t const in [], int n );
+
+ // Number of input samples in buffer
+ int written() const { return write_pos; }
+
+ // Removes first n input samples from buffer, fewer if there aren't that many.
+ // Returns number of samples actually removed.
+ int skip_input( int n );
+
+ // Resamples input to at most n output samples. Returns number of samples
+ // actually written to out. Result will be less than n if there aren't
+ // enough input samples in buffer.
+ int read( sample_t out [], int n );
+
+// Direct writing to input buffer, instead of using write( in, n ) above
+
+ // Pointer to place to write input samples
+ sample_t* buffer() { return &buf [write_pos]; }
+
+ // Number of samples that can be written to buffer()
+ int buffer_free() const { return buf.size() - write_pos; }
+
+ // Notifies resampler that n input samples have been written to buffer().
+ // N must not be greater than buffer_free().
+ void write( int n );
+
+// Derived interface
+protected:
+ virtual blargg_err_t set_rate_( double rate ) BLARGG_PURE( ; )
+
+ virtual void clear_() { }
+
+ // Resample as many available in samples as will fit within out_size and
+ // return pointer past last input sample read and set *out just past
+ // the last output sample.
+ virtual sample_t const* resample_( sample_t** out, sample_t const* out_end,
+ sample_t const in [], int in_size ) BLARGG_PURE( { return in; } )
+
+// Implementation
+public:
+ Resampler();
+
+private:
+ blargg_vector<sample_t> buf;
+ int write_pos;
+ double rate_;
+
+ int resample_wrapper( sample_t out [], int* out_size,
+ sample_t const in [], int in_size );
+};
+
+inline void Resampler::write( int count )
+{
+ write_pos += count;
+ assert( (unsigned) write_pos <= buf.size() );
+}
+
+inline blargg_err_t Resampler::set_rate_( double r )
+{
+ rate_ = r;
+ return blargg_ok;
+}
+
+inline blargg_err_t Resampler::set_rate( double r )
+{
+ return set_rate_( r );
+}
+
+#endif