aboutsummaryrefslogtreecommitdiff
path: root/include/handling.h
blob: c5e0691ddbda248ebb9cb2c1e97be898d0615afd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
    handling.h
    Copyright (C) 2021 Richard Knight


    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 3 of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program; if not, write to the Free Software Foundation,
    Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 */
#include <plugin.h>

const char* handleIdentifier = "::%s%d";

/*
 * Obtain global object of typename from global variables by handle
 */
template <typename T>
T* getHandle(csnd::Csound* csound, MYFLT handle, const char* name) {
    char buffer[32];
    snprintf(buffer, 32, handleIdentifier, name, (int)handle);
    return (T*) csound->query_global_variable(buffer);  
}


/*
 * Create global object of typename in global variables, returning handle
 */
template <typename T>
MYFLT createHandle(csnd::Csound* csound, T** data, const char* name) {
    char buffer[32];
    int handle = 0;
    snprintf(buffer, 32, handleIdentifier, name, handle);
    while ((*data = (T*) csound->query_global_variable(buffer)) != NULL) {
        snprintf(buffer, 32, handleIdentifier, name, ++handle);
    }
    csound->create_global_variable(buffer, sizeof(T));
    *data = (T*) csound->query_global_variable(buffer);
    
    return FL(handle);
}