-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPlugin_Routing.cpp
109 lines (92 loc) · 3.9 KB
/
Plugin_Routing.cpp
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
#include "AudioPluginUtil.h"
namespace Routing
{
const int MAXINDEX = 16;
enum Param
{
P_TARGET,
P_NUM
};
int bufferchannels[MAXINDEX];
RingBuffer<65536> buffer[MAXINDEX];
struct EffectData
{
float p[P_NUM];
};
int InternalRegisterEffectDefinition(UnityAudioEffectDefinition& definition)
{
int numparams = P_NUM;
definition.paramdefs = new UnityAudioParameterDefinition[numparams];
RegisterParameter(definition, "Target", "", 0.0f, MAXINDEX - 1, 0.0f, 1.0f, 1.0f, P_TARGET, "Specifies the output that the input signal is routed to. This can be read by scripts via RoutingDemo_GetData");
for (int i = 0; i < MAXINDEX; i++)
buffer[i].Clear();
return numparams;
}
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK CreateCallback(UnityAudioEffectState* state)
{
EffectData* effectdata = new EffectData;
memset(effectdata, 0, sizeof(EffectData));
state->effectdata = effectdata;
InitParametersFromDefinitions(InternalRegisterEffectDefinition, effectdata->p);
return UNITY_AUDIODSP_OK;
}
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ReleaseCallback(UnityAudioEffectState* state)
{
EffectData* data = state->GetEffectData<EffectData>();
delete data;
return UNITY_AUDIODSP_OK;
}
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK SetFloatParameterCallback(UnityAudioEffectState* state, int index, float value)
{
EffectData* data = state->GetEffectData<EffectData>();
if (index >= P_NUM)
return UNITY_AUDIODSP_ERR_UNSUPPORTED;
data->p[index] = value;
return UNITY_AUDIODSP_OK;
}
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK GetFloatParameterCallback(UnityAudioEffectState* state, int index, float* value, char *valuestr)
{
EffectData* data = state->GetEffectData<EffectData>();
if (index >= P_NUM)
return UNITY_AUDIODSP_ERR_UNSUPPORTED;
if (value != NULL)
*value = data->p[index];
if (valuestr != NULL)
valuestr[0] = 0;
return UNITY_AUDIODSP_OK;
}
int UNITY_AUDIODSP_CALLBACK GetFloatBufferCallback(UnityAudioEffectState* state, const char* name, float* buffer, int numsamples)
{
return UNITY_AUDIODSP_OK;
}
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ProcessCallback(UnityAudioEffectState* state, float* inbuffer, float* outbuffer, unsigned int length, int inchannels, int outchannels)
{
EffectData* data = state->GetEffectData<EffectData>();
memcpy(outbuffer, inbuffer, sizeof(float) * length * inchannels);
int target = (int)data->p[P_TARGET];
if (!(state->flags & UnityAudioEffectStateFlags_IsPlaying) && (state->flags & (UnityAudioEffectStateFlags_IsMuted | UnityAudioEffectStateFlags_IsPaused)))
Routing::buffer[target].SyncWritePos();
bufferchannels[target] = inchannels;
for (unsigned int n = 0; n < length; n++)
for (int i = 0; i < inchannels; i++)
buffer[target].Feed(inbuffer[n * inchannels + i]);
return UNITY_AUDIODSP_OK;
}
}
extern "C" UNITY_AUDIODSP_EXPORT_API void RoutingDemo_GetData(int target, float* data, int numsamples, int numchannels)
{
if (target < 0 || target >= Routing::MAXINDEX)
return;
int skipchannels = Routing::bufferchannels[target] - numchannels; if (skipchannels < 0)
skipchannels = 0;
int zerochannels = numchannels - Routing::bufferchannels[target]; if (zerochannels < 0)
zerochannels = 0;
for (int n = 0; n < numsamples; n++)
{
for (int i = 0; i < numchannels; i++)
Routing::buffer[target].Read(data[n * numchannels + i]);
Routing::buffer[target].Skip(skipchannels);
for (int i = 0; i < zerochannels; i++)
data[n * numchannels + i + numchannels - zerochannels] = 0.0f;
}
}