Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > by-pkgid > 1f8d0d1e253a3f5aed78d2096c2df11f > files > 46

audiere-debug-1.9.4-7mdv2009.0.i586.rpm

#ifndef RESAMPLER_H
#define RESAMPLER_H


#include "audiere.h"
#include "debug.h"
#include "dumb_resample.h"
#include "types.h"
#include "utility.h"


namespace audiere {

  class Resampler : public RefImplementation<SampleSource> {
  public:
    Resampler(SampleSource* source, int rate);

    // for now, resamplers always return (2, rate, 16-bit)
    void ADR_CALL getFormat(
      int& channel_count,
      int& sample_rate,
      SampleFormat& sample_format);

    int ADR_CALL read(int frame_count, void* buffer);
    void ADR_CALL reset();

    bool ADR_CALL isSeekable();
    int  ADR_CALL getLength();
    void ADR_CALL setPosition(int position);
    int  ADR_CALL getPosition();

    bool ADR_CALL getRepeat();
    void ADR_CALL setRepeat(bool repeat);

    int ADR_CALL getTagCount();
    const char* ADR_CALL getTagKey(int i);
    const char* ADR_CALL getTagValue(int i);
    const char* ADR_CALL getTagType(int i);

    void  setPitchShift(float shift);
    float getPitchShift();

  private:
    void fillBuffers();
    void resetState();

  private:
    RefPtr<SampleSource> m_source;
    int m_rate;
    int m_native_channel_count;
    int m_native_sample_rate;
    SampleFormat m_native_sample_format;

    enum { BUFFER_SIZE = 4096 };
    sample_t m_native_buffer_l[BUFFER_SIZE];
    sample_t m_native_buffer_r[BUFFER_SIZE];
    DUMB_RESAMPLER m_resampler_l;
    DUMB_RESAMPLER m_resampler_r;
    int m_buffer_length; // number of samples read into each buffer

    float m_shift;
  };

}

#endif