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