196 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | #include "portaudiocpp/Stream.hxx"
 | ||
|  | 
 | ||
|  | #include <cstddef>
 | ||
|  | 
 | ||
|  | #include "portaudiocpp/Exception.hxx"
 | ||
|  | #include "portaudiocpp/System.hxx"
 | ||
|  | 
 | ||
|  | namespace portaudio | ||
|  | { | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     Stream::Stream() : stream_(NULL) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     Stream::~Stream() | ||
|  |     { | ||
|  |         // (can't call close here,
 | ||
|  |         // the derived class should atleast call
 | ||
|  |         // close() in it's deconstructor)
 | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Closes the Stream if it's open, else does nothing.
 | ||
|  |     //////
 | ||
|  |     void Stream::close() | ||
|  |     { | ||
|  |         if (isOpen() && System::exists()) | ||
|  |         { | ||
|  |             PaError err = Pa_CloseStream(stream_); | ||
|  |             stream_ = NULL; | ||
|  | 
 | ||
|  |             if (err != paNoError) | ||
|  |                 throw PaException(err); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Returns true if the Stream is open.
 | ||
|  |     //////
 | ||
|  |     bool Stream::isOpen() const | ||
|  |     { | ||
|  |         return (stream_ != NULL); | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     void Stream::setStreamFinishedCallback(PaStreamFinishedCallback *callback) | ||
|  |     { | ||
|  |         PaError err = Pa_SetStreamFinishedCallback(stream_, callback); | ||
|  | 
 | ||
|  |         if (err != paNoError) | ||
|  |             throw PaException(err); | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     void Stream::start() | ||
|  |     { | ||
|  |         PaError err = Pa_StartStream(stream_); | ||
|  | 
 | ||
|  |         if (err != paNoError) | ||
|  |             throw PaException(err); | ||
|  |     } | ||
|  | 
 | ||
|  |     void Stream::stop() | ||
|  |     { | ||
|  |         PaError err = Pa_StopStream(stream_); | ||
|  | 
 | ||
|  |         if (err != paNoError) | ||
|  |             throw PaException(err); | ||
|  |     } | ||
|  | 
 | ||
|  |     void Stream::abort() | ||
|  |     { | ||
|  |         PaError err = Pa_AbortStream(stream_); | ||
|  | 
 | ||
|  |         if (err != paNoError) | ||
|  |             throw PaException(err); | ||
|  |     } | ||
|  | 
 | ||
|  |     bool Stream::isStopped() const | ||
|  |     { | ||
|  |         PaError ret = Pa_IsStreamStopped(stream_); | ||
|  | 
 | ||
|  |         if (ret < 0) | ||
|  |             throw PaException(ret); | ||
|  | 
 | ||
|  |         return (ret == 1); | ||
|  |     } | ||
|  | 
 | ||
|  |     bool Stream::isActive() const | ||
|  |     { | ||
|  |         PaError ret = Pa_IsStreamActive(stream_); | ||
|  | 
 | ||
|  |         if (ret < 0) | ||
|  |             throw PaException(ret); | ||
|  | 
 | ||
|  |         return (ret == 1); | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Returns the best known input latency for the Stream. This value may differ from the
 | ||
|  |     /// suggested input latency set in the StreamParameters. Includes all sources of
 | ||
|  |     /// latency known to PortAudio such as internal buffering, and Host API reported latency.
 | ||
|  |     /// Doesn't include any estimates of unknown latency.
 | ||
|  |     //////
 | ||
|  |     PaTime Stream::inputLatency() const | ||
|  |     { | ||
|  |         const PaStreamInfo *info = Pa_GetStreamInfo(stream_); | ||
|  |         if (info == NULL) | ||
|  |         { | ||
|  |             throw PaException(paInternalError); | ||
|  |             return PaTime(0.0); | ||
|  |         } | ||
|  | 
 | ||
|  |         return info->inputLatency; | ||
|  |     } | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Returns the best known output latency for the Stream. This value may differ from the
 | ||
|  |     /// suggested output latency set in the StreamParameters. Includes all sources of
 | ||
|  |     /// latency known to PortAudio such as internal buffering, and Host API reported latency.
 | ||
|  |     /// Doesn't include any estimates of unknown latency.
 | ||
|  |     //////
 | ||
|  |     PaTime Stream::outputLatency() const | ||
|  |     { | ||
|  |         const PaStreamInfo *info = Pa_GetStreamInfo(stream_); | ||
|  |         if (info == NULL) | ||
|  |         { | ||
|  |             throw PaException(paInternalError); | ||
|  |             return PaTime(0.0); | ||
|  |         } | ||
|  | 
 | ||
|  |         return info->outputLatency; | ||
|  |     } | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Returns the sample rate of the Stream. Usually this will be the
 | ||
|  |     /// best known estimate of the used sample rate. For instance when opening a
 | ||
|  |     /// Stream setting 44100.0 Hz in the StreamParameters, the actual sample
 | ||
|  |     /// rate might be something like 44103.2 Hz (due to imperfections in the
 | ||
|  |     /// sound card hardware).
 | ||
|  |     //////
 | ||
|  |     double Stream::sampleRate() const | ||
|  |     { | ||
|  |         const PaStreamInfo *info = Pa_GetStreamInfo(stream_); | ||
|  |         if (info == NULL) | ||
|  |         { | ||
|  |             throw PaException(paInternalError); | ||
|  |             return 0.0; | ||
|  |         } | ||
|  | 
 | ||
|  |         return info->sampleRate; | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     PaTime Stream::time() const | ||
|  |     { | ||
|  |         return Pa_GetStreamTime(stream_); | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Accessor (const) for PortAudio PaStream pointer, useful for interfacing with
 | ||
|  |     /// PortAudio add-ons such as PortMixer for instance. Normally accessing this
 | ||
|  |     /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's
 | ||
|  |     /// functionality.
 | ||
|  |     //////
 | ||
|  |     const PaStream *Stream::paStream() const | ||
|  |     { | ||
|  |         return stream_; | ||
|  |     } | ||
|  | 
 | ||
|  |     //////
 | ||
|  |     /// Accessor (non-const) for PortAudio PaStream pointer, useful for interfacing with
 | ||
|  |     /// PortAudio add-ons such as PortMixer for instance. Normally accessing this
 | ||
|  |     /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's
 | ||
|  |     /// functionality.
 | ||
|  |     //////
 | ||
|  |     PaStream *Stream::paStream() | ||
|  |     { | ||
|  |         return stream_; | ||
|  |     } | ||
|  | 
 | ||
|  |     // -----------------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  | } // namespace portaudio
 |