248 lines
6.0 KiB
C
248 lines
6.0 KiB
C
|
/* FAudio - XAudio Reimplementation for FNA
|
||
|
*
|
||
|
* Copyright (c) 2011-2021 Ethan Lee, Luigi Auriemma, and the MonoGame Team
|
||
|
*
|
||
|
* This software is provided 'as-is', without any express or implied warranty.
|
||
|
* In no event will the authors be held liable for any damages arising from
|
||
|
* the use of this software.
|
||
|
*
|
||
|
* Permission is granted to anyone to use this software for any purpose,
|
||
|
* including commercial applications, and to alter it and redistribute it
|
||
|
* freely, subject to the following restrictions:
|
||
|
*
|
||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||
|
* claim that you wrote the original software. If you use this software in a
|
||
|
* product, an acknowledgment in the product documentation would be
|
||
|
* appreciated but is not required.
|
||
|
*
|
||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||
|
* misrepresented as being the original software.
|
||
|
*
|
||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||
|
*
|
||
|
* Ethan "flibitijibibo" Lee <flibitijibibo@flibitijibibo.com>
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "FAPOFX.h"
|
||
|
#include "FAudio_internal.h"
|
||
|
|
||
|
/* FXMasteringLimiter FAPO Implementation */
|
||
|
|
||
|
const FAudioGUID FAPOFX_CLSID_FXMasteringLimiter =
|
||
|
{
|
||
|
0xC4137916,
|
||
|
0x2BE1,
|
||
|
0x46FD,
|
||
|
{
|
||
|
0x85,
|
||
|
0x99,
|
||
|
0x44,
|
||
|
0x15,
|
||
|
0x36,
|
||
|
0xF4,
|
||
|
0x98,
|
||
|
0x56
|
||
|
}
|
||
|
};
|
||
|
|
||
|
static FAPORegistrationProperties FXMasteringLimiterProperties =
|
||
|
{
|
||
|
/* .clsid = */ {0},
|
||
|
/* .FriendlyName = */
|
||
|
{
|
||
|
'F', 'X', 'M', 'a', 's', 't', 'e', 'r', 'i', 'n', 'g', 'L', 'i', 'm', 'i', 't', 'e', 'r', '\0'
|
||
|
},
|
||
|
/*.CopyrightInfo = */
|
||
|
{
|
||
|
'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', ' ', '(', 'c', ')',
|
||
|
'E', 't', 'h', 'a', 'n', ' ', 'L', 'e', 'e', '\0'
|
||
|
},
|
||
|
/*.MajorVersion = */ 0,
|
||
|
/*.MinorVersion = */ 0,
|
||
|
/*.Flags = */(
|
||
|
FAPO_FLAG_FRAMERATE_MUST_MATCH |
|
||
|
FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |
|
||
|
FAPO_FLAG_BUFFERCOUNT_MUST_MATCH |
|
||
|
FAPO_FLAG_INPLACE_SUPPORTED |
|
||
|
FAPO_FLAG_INPLACE_REQUIRED
|
||
|
),
|
||
|
/*.MinInputBufferCount = */ 1,
|
||
|
/*.MaxInputBufferCount = */ 1,
|
||
|
/*.MinOutputBufferCount = */ 1,
|
||
|
/*.MaxOutputBufferCount =*/ 1
|
||
|
};
|
||
|
|
||
|
const FAudioGUID FAPOFX_CLSID_FXMasteringLimiter_LEGACY =
|
||
|
{
|
||
|
0xA90BC001,
|
||
|
0xE897,
|
||
|
0xE897,
|
||
|
{
|
||
|
0x74,
|
||
|
0x39,
|
||
|
0x43,
|
||
|
0x55,
|
||
|
0x00,
|
||
|
0x00,
|
||
|
0x00,
|
||
|
0x01
|
||
|
}
|
||
|
};
|
||
|
|
||
|
static FAPORegistrationProperties FXMasteringLimiterProperties_LEGACY =
|
||
|
{
|
||
|
/* .clsid = */ {0},
|
||
|
/* .FriendlyName = */
|
||
|
{
|
||
|
'F', 'X', 'M', 'a', 's', 't', 'e', 'r', 'i', 'n', 'g', 'L', 'i', 'm', 'i', 't', 'e', 'r', '\0'
|
||
|
},
|
||
|
/*.CopyrightInfo = */
|
||
|
{
|
||
|
'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', ' ', '(', 'c', ')',
|
||
|
'E', 't', 'h', 'a', 'n', ' ', 'L', 'e', 'e', '\0'
|
||
|
},
|
||
|
/*.MajorVersion = */ 0,
|
||
|
/*.MinorVersion = */ 0,
|
||
|
/*.Flags = */(
|
||
|
FAPO_FLAG_FRAMERATE_MUST_MATCH |
|
||
|
FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |
|
||
|
FAPO_FLAG_BUFFERCOUNT_MUST_MATCH |
|
||
|
FAPO_FLAG_INPLACE_SUPPORTED |
|
||
|
FAPO_FLAG_INPLACE_REQUIRED
|
||
|
),
|
||
|
/*.MinInputBufferCount = */ 1,
|
||
|
/*.MaxInputBufferCount = */ 1,
|
||
|
/*.MinOutputBufferCount = */ 1,
|
||
|
/*.MaxOutputBufferCount =*/ 1
|
||
|
};
|
||
|
|
||
|
typedef struct FAPOFXMasteringLimiter
|
||
|
{
|
||
|
FAPOBase base;
|
||
|
|
||
|
/* TODO */
|
||
|
} FAPOFXMasteringLimiter;
|
||
|
|
||
|
uint32_t FAPOFXMasteringLimiter_Initialize(
|
||
|
FAPOFXMasteringLimiter *fapo,
|
||
|
const void* pData,
|
||
|
uint32_t DataByteSize
|
||
|
) {
|
||
|
#define INITPARAMS(offset) \
|
||
|
FAudio_memcpy( \
|
||
|
fapo->base.m_pParameterBlocks + DataByteSize * offset, \
|
||
|
pData, \
|
||
|
DataByteSize \
|
||
|
);
|
||
|
INITPARAMS(0)
|
||
|
INITPARAMS(1)
|
||
|
INITPARAMS(2)
|
||
|
#undef INITPARAMS
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void FAPOFXMasteringLimiter_Process(
|
||
|
FAPOFXMasteringLimiter *fapo,
|
||
|
uint32_t InputProcessParameterCount,
|
||
|
const FAPOProcessBufferParameters* pInputProcessParameters,
|
||
|
uint32_t OutputProcessParameterCount,
|
||
|
FAPOProcessBufferParameters* pOutputProcessParameters,
|
||
|
int32_t IsEnabled
|
||
|
) {
|
||
|
FAPOBase_BeginProcess(&fapo->base);
|
||
|
|
||
|
/* TODO */
|
||
|
|
||
|
FAPOBase_EndProcess(&fapo->base);
|
||
|
}
|
||
|
|
||
|
void FAPOFXMasteringLimiter_Free(void* fapo)
|
||
|
{
|
||
|
FAPOFXMasteringLimiter *limiter = (FAPOFXMasteringLimiter*) fapo;
|
||
|
limiter->base.pFree(limiter->base.m_pParameterBlocks);
|
||
|
limiter->base.pFree(fapo);
|
||
|
}
|
||
|
|
||
|
/* Public API */
|
||
|
|
||
|
uint32_t FAPOFXCreateMasteringLimiter(
|
||
|
FAPO **pEffect,
|
||
|
const void *pInitData,
|
||
|
uint32_t InitDataByteSize,
|
||
|
FAudioMallocFunc customMalloc,
|
||
|
FAudioFreeFunc customFree,
|
||
|
FAudioReallocFunc customRealloc,
|
||
|
uint8_t legacy
|
||
|
) {
|
||
|
const FAPOFXMasteringLimiterParameters fxdefault =
|
||
|
{
|
||
|
FAPOFXMASTERINGLIMITER_DEFAULT_RELEASE,
|
||
|
FAPOFXMASTERINGLIMITER_DEFAULT_LOUDNESS
|
||
|
};
|
||
|
|
||
|
/* Allocate... */
|
||
|
FAPOFXMasteringLimiter *result = (FAPOFXMasteringLimiter*) customMalloc(
|
||
|
sizeof(FAPOFXMasteringLimiter)
|
||
|
);
|
||
|
uint8_t *params = (uint8_t*) customMalloc(
|
||
|
sizeof(FAPOFXMasteringLimiterParameters) * 3
|
||
|
);
|
||
|
if (pInitData == NULL)
|
||
|
{
|
||
|
FAudio_zero(params, sizeof(FAPOFXMasteringLimiterParameters) * 3);
|
||
|
#define INITPARAMS(offset) \
|
||
|
FAudio_memcpy( \
|
||
|
params + sizeof(FAPOFXMasteringLimiterParameters) * offset, \
|
||
|
&fxdefault, \
|
||
|
sizeof(FAPOFXMasteringLimiterParameters) \
|
||
|
);
|
||
|
INITPARAMS(0)
|
||
|
INITPARAMS(1)
|
||
|
INITPARAMS(2)
|
||
|
#undef INITPARAMS
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
FAudio_assert(InitDataByteSize == sizeof(FAPOFXMasteringLimiterParameters));
|
||
|
FAudio_memcpy(params, pInitData, InitDataByteSize);
|
||
|
FAudio_memcpy(params + InitDataByteSize, pInitData, InitDataByteSize);
|
||
|
FAudio_memcpy(params + (InitDataByteSize * 2), pInitData, InitDataByteSize);
|
||
|
}
|
||
|
|
||
|
/* Initialize... */
|
||
|
FAudio_memcpy(
|
||
|
&FXMasteringLimiterProperties_LEGACY.clsid,
|
||
|
&FAPOFX_CLSID_FXMasteringLimiter_LEGACY,
|
||
|
sizeof(FAudioGUID)
|
||
|
);
|
||
|
FAudio_memcpy(
|
||
|
&FXMasteringLimiterProperties.clsid,
|
||
|
&FAPOFX_CLSID_FXMasteringLimiter,
|
||
|
sizeof(FAudioGUID)
|
||
|
);
|
||
|
CreateFAPOBaseWithCustomAllocatorEXT(
|
||
|
&result->base,
|
||
|
legacy ? &FXMasteringLimiterProperties_LEGACY : &FXMasteringLimiterProperties,
|
||
|
params,
|
||
|
sizeof(FAPOFXMasteringLimiterParameters),
|
||
|
0,
|
||
|
customMalloc,
|
||
|
customFree,
|
||
|
customRealloc
|
||
|
);
|
||
|
|
||
|
/* Function table... */
|
||
|
result->base.base.Initialize = (InitializeFunc)
|
||
|
FAPOFXMasteringLimiter_Initialize;
|
||
|
result->base.base.Process = (ProcessFunc)
|
||
|
FAPOFXMasteringLimiter_Process;
|
||
|
result->base.Destructor = FAPOFXMasteringLimiter_Free;
|
||
|
|
||
|
/* Finally. */
|
||
|
*pEffect = &result->base.base;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */
|