mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@249 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "portaudiocpp/CppFunCallbackStream.hxx"
 | 
						|
 | 
						|
#include "portaudiocpp/StreamParameters.hxx"
 | 
						|
#include "portaudiocpp/Exception.hxx"
 | 
						|
 | 
						|
namespace portaudio
 | 
						|
{
 | 
						|
	namespace impl
 | 
						|
	{
 | 
						|
		//////
 | 
						|
		/// Adapts any a C++ callback to a C-callable function (ie this function). A 
 | 
						|
		/// pointer to a struct with the C++ function pointer and the actual user data should be 
 | 
						|
		/// passed as the ``userData'' parameter when setting up the callback.
 | 
						|
		//////
 | 
						|
		int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, 
 | 
						|
			const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
 | 
						|
		{
 | 
						|
			FunCallbackStream::CppToCCallbackData *data = static_cast<FunCallbackStream::CppToCCallbackData *>(userData);
 | 
						|
			return data->funPtr(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags, data->userData);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// -----------------------------------------------------------------------------------
 | 
						|
 | 
						|
	FunCallbackStream::CppToCCallbackData::CppToCCallbackData()
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	FunCallbackStream::CppToCCallbackData::CppToCCallbackData(CallbackFunPtr funPtr, void *userData) : funPtr(funPtr), userData(userData)
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	void FunCallbackStream::CppToCCallbackData::init(CallbackFunPtr funPtr, void *userData)
 | 
						|
	{
 | 
						|
		this->funPtr = funPtr;
 | 
						|
		this->userData = userData;
 | 
						|
	}
 | 
						|
 | 
						|
	// -----------------------------------------------------------------------------------
 | 
						|
 | 
						|
	FunCallbackStream::FunCallbackStream()
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	FunCallbackStream::FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) : adapterData_(funPtr, userData)
 | 
						|
	{
 | 
						|
		open(parameters);
 | 
						|
	}
 | 
						|
 | 
						|
	FunCallbackStream::~FunCallbackStream()
 | 
						|
	{
 | 
						|
		try
 | 
						|
		{
 | 
						|
			close();
 | 
						|
		}
 | 
						|
		catch (...)
 | 
						|
		{
 | 
						|
			// ignore all errors
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	void FunCallbackStream::open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData)
 | 
						|
	{
 | 
						|
		adapterData_.init(funPtr, userData);
 | 
						|
		open(parameters);
 | 
						|
	}
 | 
						|
 | 
						|
	void FunCallbackStream::open(const StreamParameters ¶meters)
 | 
						|
	{
 | 
						|
		PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), 
 | 
						|
			parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::cppCallbackToPaCallbackAdapter, 
 | 
						|
			static_cast<void *>(&adapterData_));
 | 
						|
 | 
						|
		if (err != paNoError)
 | 
						|
		{
 | 
						|
			throw PaException(err);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// -----------------------------------------------------------------------------------
 | 
						|
}
 |