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
|
/*
* AudioScriptBufferManager.cpp
* AllTargets.workspace
*
* Created by Søren Christiansen on 8/22/11.
* Copyright 2011 Unity Technologies. All rights reserved.
*
*/
#include "UnityPrefix.h"
#include "AudioScriptBufferManager.h"
#include "Runtime/Scripting/ScriptingExportUtility.h"
#include "Runtime/Scripting/ScriptingUtility.h"
#include "Runtime/Mono/MonoManager.h"
#include "Runtime/Scripting/Backend/ScriptingBackendApi.h"
#include "Runtime/Scripting/Backend/ScriptingTypeRegistry.h"
#if ENABLE_AUDIO_FMOD
AudioScriptBufferManager::AudioScriptBufferManager(unsigned PCMArraySize, unsigned DSPFilterArraySize) :
m_PCMReadArray(SCRIPTING_NULL)
,m_DSPFilterArray(SCRIPTING_NULL)
,m_PCMReadArrayGCHandle(0)
,m_DSPFilterArrayGCHandle(0)
,m_DSPFilterArrayOrigLength(0)
,m_PCMReadArrayOrigLength(0)
{
Init(PCMArraySize, DSPFilterArraySize);
}
AudioScriptBufferManager::~AudioScriptBufferManager()
{
}
void AudioScriptBufferManager::DidReloadDomain()
{
Cleanup();
Init(m_PCMReadArrayOrigLength, m_DSPFilterArrayOrigLength);
}
void AudioScriptBufferManager::Init(unsigned PCMArraySize, unsigned DSPFilterArraySize)
{
// Create shared MonoArray for callbacks and DSPs
m_PCMReadArrayOrigLength = PCMArraySize;
#if ENABLE_MONO
ScriptingClassPtr klass = mono_class_from_name (mono_get_corlib (), "System", "Single");
m_PCMReadArray = mono_array_new (mono_domain_get (), klass, m_PCMReadArrayOrigLength);
m_PCMReadArrayGCHandle = mono_gchandle_new((MonoObject*)m_PCMReadArray, 1);
#else
ScriptingClassPtr klass = GetScriptingTypeRegistry().GetType("System", "Single");
m_PCMReadArray = CreateScriptingArray<float>(klass, m_PCMReadArrayOrigLength);
m_PCMReadArrayGCHandle = scripting_gchandle_new(m_PCMReadArray);
#endif
m_DSPFilterArrayOrigLength = DSPFilterArraySize;
#if ENABLE_MONO
m_DSPFilterArray = mono_array_new (mono_domain_get (), klass, m_DSPFilterArrayOrigLength );
m_DSPFilterArrayGCHandle = mono_gchandle_new((MonoObject*)m_DSPFilterArray, 1);
#else
m_DSPFilterArray = CreateScriptingArray<float>(klass, m_DSPFilterArrayOrigLength);
m_DSPFilterArrayGCHandle = scripting_gchandle_new(m_DSPFilterArray);
#endif
}
void AudioScriptBufferManager::Cleanup()
{
#if ENABLE_SCRIPTING
// Cleanup mono arrays
if (m_PCMReadArray)
{
#if ENABLE_MONO
PatchLength(m_PCMReadArray, m_PCMReadArrayOrigLength);
#endif
scripting_gchandle_free(m_PCMReadArrayGCHandle);
m_PCMReadArray = SCRIPTING_NULL;
m_PCMReadArrayGCHandle = 0;
}
if (m_DSPFilterArray)
{
#if ENABLE_MONO
PatchLength(m_DSPFilterArray, m_DSPFilterArrayOrigLength);
#endif
scripting_gchandle_free(m_DSPFilterArrayGCHandle);
m_DSPFilterArray = SCRIPTING_NULL;
m_DSPFilterArrayGCHandle = 0;
}
#endif
}
void AudioScriptBufferManager::GetPCMReadArray(unsigned length, ScriptingArrayPtr &array)
{
#if ENABLE_SCRIPTING
Assert(length <= m_PCMReadArrayOrigLength);
unsigned curLength = GetScriptingArraySize(m_PCMReadArray);
if (length != curLength)
{
#if ENABLE_MONO
PatchLength(m_PCMReadArray, length);
#else
ScriptingClassPtr klass = GetMonoManager().GetCommonClasses().floatSingle;
array = CreateScriptingArray(Scripting::GetScriptingArrayStart<float>(m_PCMReadArray), length, klass);
return;
#endif
}
array = m_PCMReadArray;
#endif
}
void AudioScriptBufferManager::GetDSPFilterArray(unsigned length, ScriptingArrayPtr &array)
{
#if ENABLE_SCRIPTING
Assert(length <= m_DSPFilterArrayOrigLength);
unsigned curLength = GetScriptingArraySize(m_DSPFilterArray);
if (length != curLength)
{
#if ENABLE_MONO
PatchLength(m_DSPFilterArray, length);
#else
ScriptingClassPtr klass = GetMonoManager().GetCommonClasses().floatSingle;
array = CreateScriptingArray(Scripting::GetScriptingArrayStart<float>(m_DSPFilterArray), length, klass);
return;
#endif
}
array = m_DSPFilterArray;
#endif
}
#if ENABLE_MONO
void AudioScriptBufferManager::PatchLength(ScriptingArrayPtr array, unsigned newlength)
{
char* pos = sizeof(uintptr_t)*3 + (char*)array;
*((UInt32*)pos) = (UInt32)newlength;
}
#endif
#endif // ENABLE_AUDIO_FMOD
|