cannam@140: #ifndef INCLUDED_PORTAUDIO_STREAM_HXX cannam@140: #define INCLUDED_PORTAUDIO_STREAM_HXX cannam@140: cannam@140: #include "portaudio.h" cannam@140: cannam@140: // --------------------------------------------------------------------------------------- cannam@140: cannam@140: // Forward declaration(s): cannam@140: namespace portaudio cannam@140: { cannam@140: class StreamParameters; cannam@140: } cannam@140: cannam@140: // --------------------------------------------------------------------------------------- cannam@140: cannam@140: // Declaration(s): cannam@140: namespace portaudio cannam@140: { cannam@140: cannam@140: cannam@140: ////// cannam@140: /// @brief A Stream represents an active or inactive input and/or output data cannam@140: /// stream in the System. cannam@140: /// cannam@140: /// Concrete Stream classes should ensure themselves being in a closed state at cannam@140: /// destruction (i.e. by calling their own close() method in their deconstructor). cannam@140: /// Following good C++ programming practices, care must be taken to ensure no cannam@140: /// exceptions are thrown by the deconstructor of these classes. As a consequence, cannam@140: /// clients need to explicitly call close() to ensure the stream closed successfully. cannam@140: /// cannam@140: /// The Stream object can be used to manipulate the Stream's state. Also, time-constant cannam@140: /// and time-varying information about the Stream can be retreived. cannam@140: ////// cannam@140: class Stream cannam@140: { cannam@140: public: cannam@140: // Opening/closing: cannam@140: virtual ~Stream(); cannam@140: cannam@140: virtual void close(); cannam@140: bool isOpen() const; cannam@140: cannam@140: // Additional set up: cannam@140: void setStreamFinishedCallback(PaStreamFinishedCallback *callback); cannam@140: cannam@140: // State management: cannam@140: void start(); cannam@140: void stop(); cannam@140: void abort(); cannam@140: cannam@140: bool isStopped() const; cannam@140: bool isActive() const; cannam@140: cannam@140: // Stream info (time-constant, but might become time-variant soon): cannam@140: PaTime inputLatency() const; cannam@140: PaTime outputLatency() const; cannam@140: double sampleRate() const; cannam@140: cannam@140: // Stream info (time-varying): cannam@140: PaTime time() const; cannam@140: cannam@140: // Accessors for PortAudio PaStream, useful for interfacing cannam@140: // with PortAudio add-ons (such as PortMixer) for instance: cannam@140: const PaStream *paStream() const; cannam@140: PaStream *paStream(); cannam@140: cannam@140: protected: cannam@140: Stream(); // abstract class cannam@140: cannam@140: PaStream *stream_; cannam@140: cannam@140: private: cannam@140: Stream(const Stream &); // non-copyable cannam@140: Stream &operator=(const Stream &); // non-copyable cannam@140: }; cannam@140: cannam@140: cannam@140: } // namespace portaudio cannam@140: cannam@140: cannam@140: #endif // INCLUDED_PORTAUDIO_STREAM_HXX cannam@140: