1 /* FAudio - XAudio Reimplementation for FNA
2  *
3  * Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
4  *
5  * This software is provided 'as-is', without any express or implied warranty.
6  * In no event will the authors be held liable for any damages arising from
7  * the use of this software.
8  *
9  * Permission is granted to anyone to use this software for any purpose,
10  * including commercial applications, and to alter it and redistribute it
11  * freely, subject to the following restrictions:
12  *
13  * 1. The origin of this software must not be misrepresented; you must not
14  * claim that you wrote the original software. If you use this software in a
15  * product, an acknowledgment in the product documentation would be
16  * appreciated but is not required.
17  *
18  * 2. Altered source versions must be plainly marked as such, and must not be
19  * misrepresented as being the original software.
20  *
21  * 3. This notice may not be removed or altered from any source distribution.
22  *
23  * Ethan "flibitijibibo" Lee <flibitijibibo@flibitijibibo.com>
24  *
25  */
26 
27 #include "FAPOFX.h"
28 #include "FAudio_internal.h"
29 
30 /* FXEQ FAPO Implementation */
31 
32 const FAudioGUID FAPOFX_CLSID_FXEQ =
33 {
34 	0xF5E01117,
35 	0xD6C4,
36 	0x485A,
37 	{
38 		0xA3,
39 		0xF5,
40 		0x69,
41 		0x51,
42 		0x96,
43 		0xF3,
44 		0xDB,
45 		0xFA
46 	}
47 };
48 
49 static FAPORegistrationProperties FXEQProperties =
50 {
51 	/* .clsid = */ {0},
52 	/* .FriendlyName = */
53 	{
54 		'F', 'X', 'E', 'Q', '\0'
55 	},
56 	/*.CopyrightInfo = */
57 	{
58 		'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', ' ', '(', 'c', ')',
59 		'E', 't', 'h', 'a', 'n', ' ', 'L', 'e', 'e', '\0'
60 	},
61 	/*.MajorVersion = */ 0,
62 	/*.MinorVersion = */ 0,
63 	/*.Flags = */(
64 		FAPO_FLAG_FRAMERATE_MUST_MATCH |
65 		FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |
66 		FAPO_FLAG_BUFFERCOUNT_MUST_MATCH |
67 		FAPO_FLAG_INPLACE_SUPPORTED |
68 		FAPO_FLAG_INPLACE_REQUIRED
69 	),
70 	/*.MinInputBufferCount = */ 1,
71 	/*.MaxInputBufferCount = */  1,
72 	/*.MinOutputBufferCount = */ 1,
73 	/*.MaxOutputBufferCount =*/ 1
74 };
75 
76 const FAudioGUID FAPOFX_CLSID_FXEQ_LEGACY =
77 {
78 	0xA90BC001,
79 	0xE897,
80 	0xE897,
81 	{
82 		0x74,
83 		0x39,
84 		0x43,
85 		0x55,
86 		0x00,
87 		0x00,
88 		0x00,
89 		0x00
90 	}
91 };
92 
93 static FAPORegistrationProperties FXEQProperties_LEGACY =
94 {
95 	/* .clsid = */ {0},
96 	/* .FriendlyName = */
97 	{
98 		'F', 'X', 'E', 'Q', '\0'
99 	},
100 	/*.CopyrightInfo = */
101 	{
102 		'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', ' ', '(', 'c', ')',
103 		'E', 't', 'h', 'a', 'n', ' ', 'L', 'e', 'e', '\0'
104 	},
105 	/*.MajorVersion = */ 0,
106 	/*.MinorVersion = */ 0,
107 	/*.Flags = */(
108 		FAPO_FLAG_FRAMERATE_MUST_MATCH |
109 		FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |
110 		FAPO_FLAG_BUFFERCOUNT_MUST_MATCH |
111 		FAPO_FLAG_INPLACE_SUPPORTED |
112 		FAPO_FLAG_INPLACE_REQUIRED
113 	),
114 	/*.MinInputBufferCount = */ 1,
115 	/*.MaxInputBufferCount = */  1,
116 	/*.MinOutputBufferCount = */ 1,
117 	/*.MaxOutputBufferCount =*/ 1
118 };
119 
120 typedef struct FAPOFXEQ
121 {
122 	FAPOBase base;
123 
124 	/* TODO */
125 } FAPOFXEQ;
126 
FAPOFXEQ_Initialize(FAPOFXEQ * fapo,const void * pData,uint32_t DataByteSize)127 uint32_t FAPOFXEQ_Initialize(
128 	FAPOFXEQ *fapo,
129 	const void* pData,
130 	uint32_t DataByteSize
131 ) {
132 	#define INITPARAMS(offset) \
133 		FAudio_memcpy( \
134 			fapo->base.m_pParameterBlocks + DataByteSize * offset, \
135 			pData, \
136 			DataByteSize \
137 		);
138 	INITPARAMS(0)
139 	INITPARAMS(1)
140 	INITPARAMS(2)
141 	#undef INITPARAMS
142 	return 0;
143 }
144 
FAPOFXEQ_Process(FAPOFXEQ * fapo,uint32_t InputProcessParameterCount,const FAPOProcessBufferParameters * pInputProcessParameters,uint32_t OutputProcessParameterCount,FAPOProcessBufferParameters * pOutputProcessParameters,int32_t IsEnabled)145 void FAPOFXEQ_Process(
146 	FAPOFXEQ *fapo,
147 	uint32_t InputProcessParameterCount,
148 	const FAPOProcessBufferParameters* pInputProcessParameters,
149 	uint32_t OutputProcessParameterCount,
150 	FAPOProcessBufferParameters* pOutputProcessParameters,
151 	int32_t IsEnabled
152 ) {
153 	FAPOBase_BeginProcess(&fapo->base);
154 
155 	/* TODO */
156 
157 	FAPOBase_EndProcess(&fapo->base);
158 }
159 
FAPOFXEQ_Free(void * fapo)160 void FAPOFXEQ_Free(void* fapo)
161 {
162 	FAPOFXEQ *eq = (FAPOFXEQ*) fapo;
163 	eq->base.pFree(eq->base.m_pParameterBlocks);
164 	eq->base.pFree(fapo);
165 }
166 
167 /* Public API */
168 
FAPOFXCreateEQ(FAPO ** pEffect,const void * pInitData,uint32_t InitDataByteSize,FAudioMallocFunc customMalloc,FAudioFreeFunc customFree,FAudioReallocFunc customRealloc,uint8_t legacy)169 uint32_t FAPOFXCreateEQ(
170 	FAPO **pEffect,
171 	const void *pInitData,
172 	uint32_t InitDataByteSize,
173 	FAudioMallocFunc customMalloc,
174 	FAudioFreeFunc customFree,
175 	FAudioReallocFunc customRealloc,
176 	uint8_t legacy
177 ) {
178 	const FAPOFXEQParameters fxdefault =
179 	{
180 		FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_0,
181 		FAPOFXEQ_DEFAULT_GAIN,
182 		FAPOFXEQ_DEFAULT_BANDWIDTH,
183 		FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_1,
184 		FAPOFXEQ_DEFAULT_GAIN,
185 		FAPOFXEQ_DEFAULT_BANDWIDTH,
186 		FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_2,
187 		FAPOFXEQ_DEFAULT_GAIN,
188 		FAPOFXEQ_DEFAULT_BANDWIDTH,
189 		FAPOFXEQ_DEFAULT_FREQUENCY_CENTER_3,
190 		FAPOFXEQ_DEFAULT_GAIN,
191 		FAPOFXEQ_DEFAULT_BANDWIDTH
192 	};
193 
194 	/* Allocate... */
195 	FAPOFXEQ *result = (FAPOFXEQ*) customMalloc(
196 		sizeof(FAPOFXEQ)
197 	);
198 	uint8_t *params = (uint8_t*) customMalloc(
199 		sizeof(FAPOFXEQParameters) * 3
200 	);
201 	if (pInitData == NULL)
202 	{
203 		FAudio_zero(params, sizeof(FAPOFXEQParameters) * 3);
204 		#define INITPARAMS(offset) \
205 			FAudio_memcpy( \
206 				params + sizeof(FAPOFXEQParameters) * offset, \
207 				&fxdefault, \
208 				sizeof(FAPOFXEQParameters) \
209 			);
210 		INITPARAMS(0)
211 		INITPARAMS(1)
212 		INITPARAMS(2)
213 		#undef INITPARAMS
214 	}
215 	else
216 	{
217 		FAudio_assert(InitDataByteSize == sizeof(FAPOFXEQParameters));
218 		FAudio_memcpy(params, pInitData, InitDataByteSize);
219 		FAudio_memcpy(params + InitDataByteSize, pInitData, InitDataByteSize);
220 		FAudio_memcpy(params + (InitDataByteSize * 2), pInitData, InitDataByteSize);
221 	}
222 
223 	/* Initialize... */
224 	FAudio_memcpy(
225 		&FXEQProperties_LEGACY.clsid,
226 		&FAPOFX_CLSID_FXEQ_LEGACY,
227 		sizeof(FAudioGUID)
228 	);
229 	FAudio_memcpy(
230 		&FXEQProperties.clsid,
231 		&FAPOFX_CLSID_FXEQ,
232 		sizeof(FAudioGUID)
233 	);
234 	CreateFAPOBaseWithCustomAllocatorEXT(
235 		&result->base,
236 		legacy ? &FXEQProperties_LEGACY : &FXEQProperties,
237 		params,
238 		sizeof(FAPOFXEQParameters),
239 		0,
240 		customMalloc,
241 		customFree,
242 		customRealloc
243 	);
244 
245 	/* Function table... */
246 	result->base.base.Initialize = (InitializeFunc)
247 		FAPOFXEQ_Initialize;
248 	result->base.base.Process = (ProcessFunc)
249 		FAPOFXEQ_Process;
250 	result->base.Destructor = FAPOFXEQ_Free;
251 
252 	/* Finally. */
253 	*pEffect = &result->base.base;
254 	return 0;
255 }
256 
257 /* vim: set noexpandtab shiftwidth=8 tabstop=8: */
258