cannam@140: #include "portaudiocpp/BlockingStream.hxx"
cannam@140: 
cannam@140: #include "portaudio.h"
cannam@140: 
cannam@140: #include "portaudiocpp/StreamParameters.hxx"
cannam@140: #include "portaudiocpp/Exception.hxx"
cannam@140: 
cannam@140: namespace portaudio
cannam@140: {
cannam@140: 
cannam@140: 	// --------------------------------------------------------------------------------------
cannam@140: 
cannam@140: 	BlockingStream::BlockingStream()
cannam@140: 	{
cannam@140: 	}
cannam@140: 
cannam@140: 	BlockingStream::BlockingStream(const StreamParameters &parameters)
cannam@140: 	{
cannam@140: 		open(parameters);
cannam@140: 	}
cannam@140: 
cannam@140: 	BlockingStream::~BlockingStream()
cannam@140: 	{
cannam@140: 		try
cannam@140: 		{
cannam@140: 			close();
cannam@140: 		}
cannam@140: 		catch (...)
cannam@140: 		{
cannam@140: 			// ignore all errors
cannam@140: 		}
cannam@140: 	}
cannam@140: 
cannam@140: 	// --------------------------------------------------------------------------------------
cannam@140: 
cannam@140: 	void BlockingStream::open(const StreamParameters &parameters)
cannam@140: 	{
cannam@140: 		PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), 
cannam@140: 			parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), NULL, NULL);
cannam@140: 
cannam@140: 		if (err != paNoError)
cannam@140: 		{
cannam@140: 			throw PaException(err);
cannam@140: 		}
cannam@140: 	}
cannam@140: 
cannam@140: 	// --------------------------------------------------------------------------------------
cannam@140: 
cannam@140: 	void BlockingStream::read(void *buffer, unsigned long numFrames)
cannam@140: 	{
cannam@140: 		PaError err = Pa_ReadStream(stream_, buffer, numFrames);
cannam@140: 
cannam@140: 		if (err != paNoError)
cannam@140: 		{
cannam@140: 			throw PaException(err);
cannam@140: 		}
cannam@140: 	}
cannam@140: 
cannam@140: 	void BlockingStream::write(const void *buffer, unsigned long numFrames)
cannam@140: 	{
cannam@140: 		PaError err = Pa_WriteStream(stream_, buffer, numFrames);
cannam@140: 
cannam@140: 		if (err != paNoError)
cannam@140: 		{
cannam@140: 			throw PaException(err);
cannam@140: 		}
cannam@140: 	}
cannam@140: 
cannam@140: 	// --------------------------------------------------------------------------------------
cannam@140: 
cannam@140: 	signed long BlockingStream::availableReadSize() const
cannam@140: 	{
cannam@140: 		signed long avail = Pa_GetStreamReadAvailable(stream_);
cannam@140: 
cannam@140: 		if (avail < 0)
cannam@140: 		{
cannam@140: 			throw PaException(avail);
cannam@140: 		}
cannam@140: 
cannam@140: 		return avail;
cannam@140: 	}
cannam@140: 
cannam@140: 	signed long BlockingStream::availableWriteSize() const
cannam@140: 	{
cannam@140: 		signed long avail = Pa_GetStreamWriteAvailable(stream_);
cannam@140: 
cannam@140: 		if (avail < 0)
cannam@140: 		{
cannam@140: 			throw PaException(avail);
cannam@140: 		}
cannam@140: 
cannam@140: 		return avail;
cannam@140: 	}
cannam@140: 
cannam@140: 	// --------------------------------------------------------------------------------------
cannam@140: 
cannam@140: } // portaudio
cannam@140: 
cannam@140: 
cannam@140: