aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext/tutorial/lib1/main.cpp
blob: 1f0a3120b625f5d02c69c5f7620f9abf2eee41dd (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* 
flext tutorial - library 1 

Copyright (c) 2002 Thomas Grill (xovo@gmx.net)
For information on usage and redistribution, and for a DISCLAIMER OF ALL
WARRANTIES, see the file, "license.txt," in this distribution.  

-------------------------------------------------------------------------

This is an example of an external library containing a few simple objects

It uses attributes, so be sure that you've already worked through attr1 and attr2

*/

// Enable attribute processing 
// For clarity, this is done here, but you'd better specify it as a compiler definition
#define FLEXT_ATTRIBUTES 1

// include flext header
#include <flext.h>

// check for appropriate flext version
#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 400)
#error You need at least flext version 0.4.0
#endif


// -------------------------------------------------------------------------------------
// Define the base class 
// Note that you don't have to instantiate the base class (with FLEXT_NEW or variants)

class libbase:
	// inherit from basic flext class
	public flext_base
{
	// obligatory flext header (class name,base class name)
	FLEXT_HEADER(libbase,flext_base)
 
public:
	// constructor
	libbase();

protected:
	void Output(float f) const { ToOutFloat(0,f); }

	// method for floats into left inlet
	virtual void m_trigger(float f) = 0;  

	float arg;  // argument variable
private:
	FLEXT_CALLBACK_F(m_trigger)  // callback for method "m_trigger" (with one float argument)
	FLEXT_ATTRVAR_F(arg)
};

libbase::libbase():
	arg(0)  // initialize argument
{ 
	// define inlets:
	// first inlet must always by of type anything (or signal for dsp objects)
	AddInAnything();  // add one inlet for any message
	
	// define outlets:
	AddOutFloat();  // add one float outlet (has index 0)
	
	// register methods
	FLEXT_ADDMETHOD(0,m_trigger);  // register method (for float messages) "m_float" for inlet 0

	// register attributes
	FLEXT_ADDATTR_VAR1("arg",arg);  // register attribute "arg"
} 


// ------------------------------------------------------------------
// Define the actual library objects (derived from the base class)
// These classes have an implementation of the virtual function m_trigger 

class libadd:
	public libbase
{
	// obligatory flext header, inherit from libbase
	FLEXT_HEADER(libadd,libbase)
public:
	virtual void m_trigger(float f) { Output(f+arg); }
};

FLEXT_LIB("lib1.+",libadd);



class libsub:
	public libbase
{
	// obligatory flext header, inherit from libbase
	FLEXT_HEADER(libsub,libbase)
public:
	virtual void m_trigger(float f) { Output(f-arg); }
};

FLEXT_LIB("lib1.-",libsub);



class libmul:
	public libbase
{
	// obligatory flext header, inherit from libbase
	FLEXT_HEADER(libmul,libbase)
public:
	virtual void m_trigger(float f) { Output(f*arg); }
};

FLEXT_LIB("lib1.*",libmul);


// ------------------------------------------------
// Do the library setup

static void lib_setup()
{
	post("flext tutorial lib1, (C)2002 Thomas Grill");
	post("lib1: lib1.+ lib1.- lib1.*");
	post("");

	// call the objects' setup routines
	FLEXT_SETUP(libadd);
	FLEXT_SETUP(libsub);
	FLEXT_SETUP(libmul);
}

// setup the library
FLEXT_LIB_SETUP(lib1,lib_setup)