 165b814f5d
			
		
	
	
		165b814f5d
		
	
	
	
	
		
			
			this is necessary in order to get Furnace to build using CMake 4.0. you should do: git submodule deinit extern/portaudio
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.7 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);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // -----------------------------------------------------------------------------------
 | |
| }
 |