Path: blob/master/libs/faudio/src/FAPOFX_masteringlimiter.c
4389 views
/* FAudio - XAudio Reimplementation for FNA1*2* Copyright (c) 2011-2024 Ethan Lee, Luigi Auriemma, and the MonoGame Team3*4* This software is provided 'as-is', without any express or implied warranty.5* In no event will the authors be held liable for any damages arising from6* the use of this software.7*8* Permission is granted to anyone to use this software for any purpose,9* including commercial applications, and to alter it and redistribute it10* freely, subject to the following restrictions:11*12* 1. The origin of this software must not be misrepresented; you must not13* claim that you wrote the original software. If you use this software in a14* product, an acknowledgment in the product documentation would be15* appreciated but is not required.16*17* 2. Altered source versions must be plainly marked as such, and must not be18* misrepresented as being the original software.19*20* 3. This notice may not be removed or altered from any source distribution.21*22* Ethan "flibitijibibo" Lee <[email protected]>23*24*/2526#include "FAPOFX.h"27#include "FAudio_internal.h"2829/* FXMasteringLimiter FAPO Implementation */3031const FAudioGUID FAPOFX_CLSID_FXMasteringLimiter =32{330xC4137916,340x2BE1,350x46FD,36{370x85,380x99,390x44,400x15,410x36,420xF4,430x98,440x5645}46};4748static FAPORegistrationProperties FXMasteringLimiterProperties =49{50/* .clsid = */ {0},51/* .FriendlyName = */52{53'F', 'X', 'M', 'a', 's', 't', 'e', 'r', 'i', 'n', 'g', 'L', 'i', 'm', 'i', 't', 'e', 'r', '\0'54},55/*.CopyrightInfo = */56{57'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', ' ', '(', 'c', ')',58'E', 't', 'h', 'a', 'n', ' ', 'L', 'e', 'e', '\0'59},60/*.MajorVersion = */ 0,61/*.MinorVersion = */ 0,62/*.Flags = */(63FAPO_FLAG_FRAMERATE_MUST_MATCH |64FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |65FAPO_FLAG_BUFFERCOUNT_MUST_MATCH |66FAPO_FLAG_INPLACE_SUPPORTED |67FAPO_FLAG_INPLACE_REQUIRED68),69/*.MinInputBufferCount = */ 1,70/*.MaxInputBufferCount = */ 1,71/*.MinOutputBufferCount = */ 1,72/*.MaxOutputBufferCount =*/ 173};7475const FAudioGUID FAPOFX_CLSID_FXMasteringLimiter_LEGACY =76{770xA90BC001,780xE897,790xE897,80{810x74,820x39,830x43,840x55,850x00,860x00,870x00,880x0189}90};9192static FAPORegistrationProperties FXMasteringLimiterProperties_LEGACY =93{94/* .clsid = */ {0},95/* .FriendlyName = */96{97'F', 'X', 'M', 'a', 's', 't', 'e', 'r', 'i', 'n', 'g', 'L', 'i', 'm', 'i', 't', 'e', 'r', '\0'98},99/*.CopyrightInfo = */100{101'C', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', ' ', '(', 'c', ')',102'E', 't', 'h', 'a', 'n', ' ', 'L', 'e', 'e', '\0'103},104/*.MajorVersion = */ 0,105/*.MinorVersion = */ 0,106/*.Flags = */(107FAPO_FLAG_FRAMERATE_MUST_MATCH |108FAPO_FLAG_BITSPERSAMPLE_MUST_MATCH |109FAPO_FLAG_BUFFERCOUNT_MUST_MATCH |110FAPO_FLAG_INPLACE_SUPPORTED |111FAPO_FLAG_INPLACE_REQUIRED112),113/*.MinInputBufferCount = */ 1,114/*.MaxInputBufferCount = */ 1,115/*.MinOutputBufferCount = */ 1,116/*.MaxOutputBufferCount =*/ 1117};118119typedef struct FAPOFXMasteringLimiter120{121FAPOBase base;122123/* TODO */124} FAPOFXMasteringLimiter;125126uint32_t FAPOFXMasteringLimiter_Initialize(127FAPOFXMasteringLimiter *fapo,128const void* pData,129uint32_t DataByteSize130) {131#define INITPARAMS(offset) \132FAudio_memcpy( \133fapo->base.m_pParameterBlocks + DataByteSize * offset, \134pData, \135DataByteSize \136);137INITPARAMS(0)138INITPARAMS(1)139INITPARAMS(2)140#undef INITPARAMS141return 0;142}143144void FAPOFXMasteringLimiter_Process(145FAPOFXMasteringLimiter *fapo,146uint32_t InputProcessParameterCount,147const FAPOProcessBufferParameters* pInputProcessParameters,148uint32_t OutputProcessParameterCount,149FAPOProcessBufferParameters* pOutputProcessParameters,150int32_t IsEnabled151) {152FAPOBase_BeginProcess(&fapo->base);153154/* TODO */155156FAPOBase_EndProcess(&fapo->base);157}158159void FAPOFXMasteringLimiter_Free(void* fapo)160{161FAPOFXMasteringLimiter *limiter = (FAPOFXMasteringLimiter*) fapo;162limiter->base.pFree(limiter->base.m_pParameterBlocks);163limiter->base.pFree(fapo);164}165166/* Public API */167168uint32_t FAPOFXCreateMasteringLimiter(169FAPO **pEffect,170const void *pInitData,171uint32_t InitDataByteSize,172FAudioMallocFunc customMalloc,173FAudioFreeFunc customFree,174FAudioReallocFunc customRealloc,175uint8_t legacy176) {177const FAPOFXMasteringLimiterParameters fxdefault =178{179FAPOFXMASTERINGLIMITER_DEFAULT_RELEASE,180FAPOFXMASTERINGLIMITER_DEFAULT_LOUDNESS181};182183/* Allocate... */184FAPOFXMasteringLimiter *result = (FAPOFXMasteringLimiter*) customMalloc(185sizeof(FAPOFXMasteringLimiter)186);187uint8_t *params = (uint8_t*) customMalloc(188sizeof(FAPOFXMasteringLimiterParameters) * 3189);190if (pInitData == NULL)191{192FAudio_zero(params, sizeof(FAPOFXMasteringLimiterParameters) * 3);193#define INITPARAMS(offset) \194FAudio_memcpy( \195params + sizeof(FAPOFXMasteringLimiterParameters) * offset, \196&fxdefault, \197sizeof(FAPOFXMasteringLimiterParameters) \198);199INITPARAMS(0)200INITPARAMS(1)201INITPARAMS(2)202#undef INITPARAMS203}204else205{206FAudio_assert(InitDataByteSize == sizeof(FAPOFXMasteringLimiterParameters));207FAudio_memcpy(params, pInitData, InitDataByteSize);208FAudio_memcpy(params + InitDataByteSize, pInitData, InitDataByteSize);209FAudio_memcpy(params + (InitDataByteSize * 2), pInitData, InitDataByteSize);210}211212/* Initialize... */213FAudio_memcpy(214&FXMasteringLimiterProperties_LEGACY.clsid,215&FAPOFX_CLSID_FXMasteringLimiter_LEGACY,216sizeof(FAudioGUID)217);218FAudio_memcpy(219&FXMasteringLimiterProperties.clsid,220&FAPOFX_CLSID_FXMasteringLimiter,221sizeof(FAudioGUID)222);223CreateFAPOBaseWithCustomAllocatorEXT(224&result->base,225legacy ? &FXMasteringLimiterProperties_LEGACY : &FXMasteringLimiterProperties,226params,227sizeof(FAPOFXMasteringLimiterParameters),2280,229customMalloc,230customFree,231customRealloc232);233234/* Function table... */235result->base.base.Initialize = (InitializeFunc)236FAPOFXMasteringLimiter_Initialize;237result->base.base.Process = (ProcessFunc)238FAPOFXMasteringLimiter_Process;239result->base.Destructor = FAPOFXMasteringLimiter_Free;240241/* Finally. */242*pEffect = &result->base.base;243return 0;244}245246/* vim: set noexpandtab shiftwidth=8 tabstop=8: */247248249