summaryrefslogtreecommitdiff
path: root/Runtime/Audio/AudioScriptBufferManager.cpp
blob: 4ec57dad5b2802fc3f82cf180ad38bbabc055bd2 (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
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