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 / source / portaudiocpp / CppFunCallbackStream.cxx @ 164:9fa11135915a

History | View | Annotate | Download (2.38 KB)

1
#include "portaudiocpp/CppFunCallbackStream.hxx"
2

    
3
#include "portaudiocpp/StreamParameters.hxx"
4
#include "portaudiocpp/Exception.hxx"
5

    
6
namespace portaudio
7
{
8
        namespace impl
9
        {
10
                //////
11
                /// Adapts any a C++ callback to a C-callable function (ie this function). A 
12
                /// pointer to a struct with the C++ function pointer and the actual user data should be 
13
                /// passed as the ``userData'' parameter when setting up the callback.
14
                //////
15
                int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, 
16
                        const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
17
                {
18
                        FunCallbackStream::CppToCCallbackData *data = static_cast<FunCallbackStream::CppToCCallbackData *>(userData);
19
                        return data->funPtr(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags, data->userData);
20
                }
21
        }
22

    
23
        // -----------------------------------------------------------------------------------
24

    
25
        FunCallbackStream::CppToCCallbackData::CppToCCallbackData()
26
        {
27
        }
28

    
29
        FunCallbackStream::CppToCCallbackData::CppToCCallbackData(CallbackFunPtr funPtr, void *userData) : funPtr(funPtr), userData(userData)
30
        {
31
        }
32

    
33
        void FunCallbackStream::CppToCCallbackData::init(CallbackFunPtr funPtr, void *userData)
34
        {
35
                this->funPtr = funPtr;
36
                this->userData = userData;
37
        }
38

    
39
        // -----------------------------------------------------------------------------------
40

    
41
        FunCallbackStream::FunCallbackStream()
42
        {
43
        }
44

    
45
        FunCallbackStream::FunCallbackStream(const StreamParameters &parameters, CallbackFunPtr funPtr, void *userData) : adapterData_(funPtr, userData)
46
        {
47
                open(parameters);
48
        }
49

    
50
        FunCallbackStream::~FunCallbackStream()
51
        {
52
                try
53
                {
54
                        close();
55
                }
56
                catch (...)
57
                {
58
                        // ignore all errors
59
                }
60
        }
61

    
62
        void FunCallbackStream::open(const StreamParameters &parameters, CallbackFunPtr funPtr, void *userData)
63
        {
64
                adapterData_.init(funPtr, userData);
65
                open(parameters);
66
        }
67

    
68
        void FunCallbackStream::open(const StreamParameters &parameters)
69
        {
70
                PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), 
71
                        parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::cppCallbackToPaCallbackAdapter, 
72
                        static_cast<void *>(&adapterData_));
73

    
74
                if (err != paNoError)
75
                {
76
                        throw PaException(err);
77
                }
78
        }
79

    
80
        // -----------------------------------------------------------------------------------
81
}