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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
//
// PluginChain.h - MrsWatson
// Created by Nik Reiman on 1/3/12.
// Copyright (c) 2012 Teragon Audio. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
#ifndef MrsWatson_PluginChain_h
#define MrsWatson_PluginChain_h
#include "app/ReturnCodes.h"
#include "base/LinkedList.h"
#include "plugin/Plugin.h"
#include "plugin/PluginPreset.h"
#include "time/TaskTimer.h"
#define MAX_PLUGINS 8
#define CHAIN_STRING_PLUGIN_SEPARATOR ';'
#define CHAIN_STRING_PROGRAM_SEPARATOR ','
typedef struct {
unsigned int numPlugins;
Plugin *plugins;
PluginPreset *presets;
TaskTimer *audioTimers;
TaskTimer *midiTimers;
// Private fields
boolByte _realtime;
TaskTimer _realtimeTimer;
} PluginChainMembers;
/**
* Class which holds multiple plugins which process audio in serial. Only one
* instrument may be present in a plugin chain.
*/
typedef PluginChainMembers *PluginChain;
/**
* Get a reference to the global plugin chain instance.
* @return Reference to global plugin chain, or NULL if the global instance has
* not yet been initialized.
*/
PluginChain getPluginChain(void);
/**
* Initialize the global plugin chain instance. Should be called fairly
* early in the program initialization.
*/
void initPluginChain(void);
/**
* Append a plugin to the end of the chain
* @param self
* @param plugin Plugin to add
* @param preset Preset to be loaded into the plugin. If no preset is desired,
* passed NULL here.
* @return True if the plugin could be added to the end of the chain
*/
boolByte pluginChainAppend(PluginChain self, Plugin plugin, PluginPreset preset);
// TODO: Deprecate and remove this function
boolByte pluginChainAddFromArgumentString(PluginChain self, const CharString argumentString, const CharString userSearchPath);
/**
* Open and initialize all plugins in the chain.
* @param self
* @return RETURN_CODE_SUCCESS on success, other code on failure
*/
ReturnCodes pluginChainInitialize(PluginChain self);
/**
* Inspect each plugin in the chain
* @param self
*/
void pluginChainInspect(PluginChain self);
/**
* Get the maximum amount of tail time (post*processing time with empty input)
* needed for the chain. This is essentially the largest tail time value for any
* plug-in in the chain.
* @param self
* @return Maximum tail time, in milliseconds
*/
int pluginChainGetMaximumTailTimeInMs(PluginChain self);
/**
* Get the total processing delay in frames.
* @param self
* @return Total processing delay, in frames.
*/
unsigned long pluginChainGetProcessingDelay(PluginChain self);
/**
* Set parameters on the first plugin in a chain.
* @param self
* @param parameters List of parameters to be applied
* @return True if all parameters were set, false otherwise
*/
boolByte pluginChainSetParameters(PluginChain self, const LinkedList parameters);
/**
* Set realtime mode for the plugin chain. When set, calls to pluginChainProcessAudio()
* will sleep for the additional time required to process the block in realtime.
* @param realtime True to enable realtime mode, false to disable (default)
* @param self
*/
void pluginChainSetRealtime(PluginChain self, boolByte realtime);
/**
* Prepare each plugin in the chain for processing. This should be called before
* the first block of audio is sent to the chain.
* @param self
*/
void pluginChainPrepareForProcessing(PluginChain self);
/**
* Process a single block of samples through each plugin in the chain.
* @param self
* @param inBuffer Input sample block
* @param outBuffer Output sample block
*/
void pluginChainProcessAudio(PluginChain self, SampleBuffer inBuffer, SampleBuffer outBuffer);
/**
* Send a list of MIDI events to be processed by the chain. Currently, only the
* first plugin in the chain will receive these events.
* @param self
* @param midiEvents List of events to process
*/
void pluginChainProcessMidi(PluginChain self, LinkedList midiEvents);
/**
* Close all plugins in the chain
* @param self
*/
void pluginChainShutdown(PluginChain self);
/**
* Free the plugin chain and all associated resources (including all plugins)
* @param self
*/
void freePluginChain(PluginChain self);
#endif
|