Program Listing for File audio_source.h

Return to documentation for file (rootex/core/audio/audio_source.h)

#pragma once

#include "al.h"

class StreamingAudioBuffer;
class StaticAudioBuffer;

typedef unsigned int ALuint;
typedef float ALfloat;

#define MIN_TO_S 60.0f

class AudioSource
{
protected:
    ALuint m_SourceID;

    bool m_IsStreaming;
    AudioSource(bool isStreaming);
    virtual ~AudioSource();

public:
    enum class AttenuationModel
    {
        Linear = AL_LINEAR_DISTANCE,
        Inverse = AL_INVERSE_DISTANCE,
        Exponential = AL_EXPONENT_DISTANCE,
        LinearClamped = AL_LINEAR_DISTANCE_CLAMPED,
        InverseClamped = AL_INVERSE_DISTANCE_CLAMPED,
        ExponentialClamped = AL_EXPONENT_DISTANCE_CLAMPED
    };

    virtual void setLooping(bool enabled);
    virtual void queueNewBuffers();

    void play();
    void pause();
    void stop();

    bool isPlaying() const;
    bool isPaused() const;
    bool isStopped() const;
    virtual bool isLooping() const;
    ALuint getSourceID() const;
    virtual float getDuration() const = 0;

    void setVelocity(const Vector3& velocity);
    void setVolume(float volume);
    void setPosition(Vector3& position);
    void setModel(AttenuationModel distanceModel);
    void setRollOffFactor(ALfloat rolloffFactor);
    void setReferenceDistance(ALfloat referenceDistance);
    void setMaxDistance(ALfloat maxDistance);
};

class StaticAudioSource : public AudioSource
{
    Ref<StaticAudioBuffer> m_StaticAudio;

public:
    StaticAudioSource(Ref<StaticAudioBuffer> audio);
    ~StaticAudioSource();

    void unqueueBuffers();

    float getDuration() const override;
    float getElapsedTimeS();
};

class StreamingAudioSource : public AudioSource
{
    Ref<StreamingAudioBuffer> m_StreamingAudio;

    bool m_IsLooping;

public:
    StreamingAudioSource(Ref<StreamingAudioBuffer> audio);
    ~StreamingAudioSource();

    bool isLooping() const override;
    void setLooping(bool enabled) override;
    void queueNewBuffers() override;
    void unqueueBuffers();

    virtual float getDuration() const override;
};