this is necessary in order to get Furnace to build using CMake 4.0. you should do: git submodule deinit extern/portaudio
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
 | 
						|
#define INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------------------
 | 
						|
 | 
						|
#include "portaudio.h"
 | 
						|
 | 
						|
#include "portaudiocpp/CallbackStream.hxx"
 | 
						|
#include "portaudiocpp/CallbackInterface.hxx"
 | 
						|
#include "portaudiocpp/StreamParameters.hxx"
 | 
						|
#include "portaudiocpp/Exception.hxx"
 | 
						|
#include "portaudiocpp/InterfaceCallbackStream.hxx"
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------------------
 | 
						|
 | 
						|
namespace portaudio
 | 
						|
{
 | 
						|
 | 
						|
 | 
						|
    //////
 | 
						|
    /// @brief Callback stream using a class's member function as a callback. Template argument T is the type of the
 | 
						|
    /// class of which a member function is going to be used.
 | 
						|
    ///
 | 
						|
    /// Example usage:
 | 
						|
    /// @verbatim MemFunCallback<MyClass> stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim
 | 
						|
    //////
 | 
						|
    template<typename T>
 | 
						|
    class MemFunCallbackStream : public CallbackStream
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *,
 | 
						|
            PaStreamCallbackFlags);
 | 
						|
 | 
						|
        // -------------------------------------------------------------------------------
 | 
						|
 | 
						|
        MemFunCallbackStream()
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun)
 | 
						|
        {
 | 
						|
            open(parameters);
 | 
						|
        }
 | 
						|
 | 
						|
        ~MemFunCallbackStream()
 | 
						|
        {
 | 
						|
            close();
 | 
						|
        }
 | 
						|
 | 
						|
        void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun)
 | 
						|
        {
 | 
						|
            // XXX: need to check if already open?
 | 
						|
 | 
						|
            adapter_.init(instance, memFun);
 | 
						|
            open(parameters);
 | 
						|
        }
 | 
						|
 | 
						|
    private:
 | 
						|
        MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable
 | 
						|
        MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable
 | 
						|
 | 
						|
        //////
 | 
						|
        /// @brief Inner class which adapts a member function callback to a CallbackInterface compliant
 | 
						|
        /// class (so it can be adapted using the paCallbackAdapter function).
 | 
						|
        //////
 | 
						|
        class MemFunToCallbackInterfaceAdapter : public CallbackInterface
 | 
						|
        {
 | 
						|
        public:
 | 
						|
            MemFunToCallbackInterfaceAdapter() {}
 | 
						|
            MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {}
 | 
						|
 | 
						|
            void init(T &instance, CallbackFunPtr memFun)
 | 
						|
            {
 | 
						|
                instance_ = &instance;
 | 
						|
                memFun_ = memFun;
 | 
						|
            }
 | 
						|
 | 
						|
            int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames,
 | 
						|
                const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
 | 
						|
            {
 | 
						|
                return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags);
 | 
						|
            }
 | 
						|
 | 
						|
        private:
 | 
						|
            T *instance_;
 | 
						|
            CallbackFunPtr memFun_;
 | 
						|
        };
 | 
						|
 | 
						|
        MemFunToCallbackInterfaceAdapter adapter_;
 | 
						|
 | 
						|
        void open(const StreamParameters ¶meters)
 | 
						|
        {
 | 
						|
            PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(),
 | 
						|
                parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter,
 | 
						|
                static_cast<void *>(&adapter_));
 | 
						|
 | 
						|
            if (err != paNoError)
 | 
						|
                throw PaException(err);
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
} // portaudio
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------------------
 | 
						|
 | 
						|
#endif // INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
 |