To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

The primary repository for this project is hosted at https://github.com/sonic-visualiser/sv-dependency-builds .
This repository is a read-only copy which is updated automatically every hour.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / src / portaudio_20161030_catalina_patch / bindings / cpp / include / portaudiocpp / MemFunCallbackStream.hxx @ 162:d43aab368df9

History | View | Annotate | Download (3.24 KB)

1
#ifndef INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
2
#define INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX
3

    
4
// ---------------------------------------------------------------------------------------
5

    
6
#include "portaudio.h"
7

    
8
#include "portaudiocpp/CallbackStream.hxx"
9
#include "portaudiocpp/CallbackInterface.hxx"
10
#include "portaudiocpp/StreamParameters.hxx"
11
#include "portaudiocpp/Exception.hxx"
12
#include "portaudiocpp/InterfaceCallbackStream.hxx"
13

    
14
// ---------------------------------------------------------------------------------------
15

    
16
namespace portaudio
17
{
18

    
19

    
20
	//////
21
	/// @brief Callback stream using a class's member function as a callback. Template argument T is the type of the 
22
	/// class of which a member function is going to be used.
23
	///
24
	/// Example usage:
25
	/// @verbatim MemFunCallback<MyClass> stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim
26
	//////
27
	template<typename T>
28
	class MemFunCallbackStream : public CallbackStream
29
	{
30
	public:
31
		typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, 
32
			PaStreamCallbackFlags);
33

    
34
		// -------------------------------------------------------------------------------
35

    
36
		MemFunCallbackStream()
37
		{
38
		}
39

    
40
		MemFunCallbackStream(const StreamParameters &parameters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun)
41
		{
42
			open(parameters);
43
		}
44

    
45
		~MemFunCallbackStream()
46
		{
47
			close();
48
		}
49

    
50
		void open(const StreamParameters &parameters, T &instance, CallbackFunPtr memFun)
51
		{
52
			// XXX:	need to check if already open?
53

    
54
			adapter_.init(instance, memFun);
55
			open(parameters);
56
		}
57

    
58
	private:
59
		MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable
60
		MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable
61

    
62
		//////
63
		/// @brief Inner class which adapts a member function callback to a CallbackInterface compliant 
64
		/// class (so it can be adapted using the paCallbackAdapter function).
65
		//////
66
		class MemFunToCallbackInterfaceAdapter : public CallbackInterface
67
		{
68
		public:
69
			MemFunToCallbackInterfaceAdapter() {}
70
			MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {}
71

    
72
			void init(T &instance, CallbackFunPtr memFun)
73
			{
74
				instance_ = &instance;
75
				memFun_ = memFun;
76
			}
77

    
78
			int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, 
79
				const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
80
			{
81
				return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags);
82
			}
83

    
84
		private:
85
			T *instance_;
86
			CallbackFunPtr memFun_;
87
		};
88

    
89
		MemFunToCallbackInterfaceAdapter adapter_;
90

    
91
		void open(const StreamParameters &parameters)
92
		{
93
			PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), 
94
				parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, 
95
				static_cast<void *>(&adapter_));
96

    
97
			if (err != paNoError)
98
				throw PaException(err);
99
		}
100
	};
101

    
102

    
103
} // portaudio
104

    
105
// ---------------------------------------------------------------------------------------
106

    
107
#endif // INCLUDED_PORTAUDIO_MEMFUNCALLBACKSTREAM_HXX