Sophie

Sophie

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

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

#ifndef DEVICE_NULL_H
#define DEVICE_NULL_H


#include <list>
#include "audiere.h"
#include "device.h"
#include "internal.h"
#include "threads.h"
#include "types.h"
#include "utility.h"


namespace audiere {

  class NullOutputStream;

  class NullAudioDevice : public AbstractDevice, public Mutex {
  public:
    static NullAudioDevice* create(const ParameterList& parameters);

  private:
    NullAudioDevice();
    ~NullAudioDevice();

  public:
    void ADR_CALL update();
    OutputStream* ADR_CALL openStream(SampleSource* source);
    OutputStream* ADR_CALL openBuffer(
      void* samples, int frame_count,
      int channel_count, int sample_rate, SampleFormat sample_format);
    const char* ADR_CALL getName();

  private:
    void removeStream(NullOutputStream* stream);

    typedef std::list<NullOutputStream*> StreamList;
    StreamList m_streams;

    friend class NullOutputStream;
  };

  class NullOutputStream : public RefImplementation<OutputStream> {
  private:
    NullOutputStream(NullAudioDevice* device, SampleSource* source);
    ~NullOutputStream();

  public:
    void ADR_CALL play();
    void ADR_CALL stop();
    void ADR_CALL reset();
    bool ADR_CALL isPlaying();

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

    void  ADR_CALL setVolume(float volume);
    float ADR_CALL getVolume();
    void  ADR_CALL setPan(float pan);
    float ADR_CALL getPan();
    void  ADR_CALL setPitchShift(float shift);
    float ADR_CALL getPitchShift();

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

  private:
    void doStop(bool internal);
    void resetTimer();
    void update();
    int dummyRead(int samples_to_read);

    RefPtr<NullAudioDevice> m_device;
                          
    SampleSourcePtr m_source;
    int m_channel_count;           //
    int m_sample_rate;             // cached stream format
    SampleFormat m_sample_format;  //

    bool m_is_playing;
    float m_volume;
    float m_pan;
    float m_shift;

    u64 m_last_update;

    friend class NullAudioDevice;
  };

}


#endif