#ifndef INCLUDED_PORTAUDIO_STREAM_HXX
#define INCLUDED_PORTAUDIO_STREAM_HXX

#include "portaudio.h"

// ---------------------------------------------------------------------------------------

// Forward declaration(s):
namespace portaudio
{
    class StreamParameters;
}

// ---------------------------------------------------------------------------------------

// Declaration(s):
namespace portaudio
{


    //////
    /// @brief A Stream represents an active or inactive input and/or output data
    /// stream in the System.
    ///
    /// Concrete Stream classes should ensure themselves being in a closed state at
    /// destruction (i.e. by calling their own close() method in their deconstructor).
    /// Following good C++ programming practices, care must be taken to ensure no
    /// exceptions are thrown by the deconstructor of these classes. As a consequence,
    /// clients need to explicitly call close() to ensure the stream closed successfully.
    ///
    /// The Stream object can be used to manipulate the Stream's state. Also, time-constant
    /// and time-varying information about the Stream can be retrieved.
    //////
    class Stream
    {
    public:
        // Opening/closing:
        virtual ~Stream();

        virtual void close();
        bool isOpen() const;

        // Additional set up:
        void setStreamFinishedCallback(PaStreamFinishedCallback *callback);

        // State management:
        void start();
        void stop();
        void abort();

        bool isStopped() const;
        bool isActive() const;

        // Stream info (time-constant, but might become time-variant soon):
        PaTime inputLatency() const;
        PaTime outputLatency() const;
        double sampleRate() const;

        // Stream info (time-varying):
        PaTime time() const;

        // Accessors for PortAudio PaStream, useful for interfacing
        // with PortAudio add-ons (such as PortMixer) for instance:
        const PaStream *paStream() const;
        PaStream *paStream();

    protected:
        Stream(); // abstract class

        PaStream *stream_;

    private:
        Stream(const Stream &); // non-copyable
        Stream &operator=(const Stream &); // non-copyable
    };


} // namespace portaudio


#endif // INCLUDED_PORTAUDIO_STREAM_HXX
