AudioPluginUtil.h头文件
#pragma once
#include "AudioPluginInterface.h"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#if UNITY_WIN
# include <windows.h>
#else
# if UNITY_SPU
# include <stdint.h>
# include "ps3/AudioPluginInterfacePS3.h"
# else
# include <pthread.h>
# endif
# define strcpy_s strcpy
#endif
typedef int (*InternalEffectDefinitionRegistrationCallback)(UnityAudioEffectDefinition& desc);
const float kMaxSampleRate = 22050.0f;
const float kPI = 3.141592653589f;
inline float FastClip(float x, float minval, float maxval) { return (fabsf(x - minval) - fabsf(x - maxval) + (minval + maxval)) * 0.5f; }
inline float FastMin(float a, float b) { return (a + b - fabsf(a - b)) * 0.5f; }
inline float FastMax(float a, float b) { return (a + b + fabsf(a - b)) * 0.5f; }
inline int FastFloor(float x) { return (int)floorf(x); } // TODO: Optimize
char* strnew(const char* src);
char* tmpstr(int index, const char* fmtstr, ...);
class UnityComplexNumber
{
public:
// No constructor because we want to be able to define this inside anonymous unions (this is also why we don't use std::complex<T> here)
inline void Set(float _re, float _im)
{
re = _re;
im = _im;
}
inline void Set(const UnityComplexNumber& c)
{
re = c.re;
im = c.im;
}
inline static void Mul(const UnityComplexNumber& a, float b, UnityComplexNumber& result)
{
result.re = a.re * b;
result.im = a.im * b;
}
inline static void Mul(const UnityComplexNumber& a, const UnityComplexNumber& b, UnityComplexNumber& result)
{
// Store temporarily in case a or b reference the same memory as result
float t = a.re * b.im + a.im * b.re;
result.re = a.re * b.re - a.im * b.im;
result.im = t;
}
inline static void Add(const UnityComplexNumber& a, const UnityComplexNumber& b, UnityComplexNumber& result)
{
result.re = a.re + b.re;
result.im = a.im + b.im;
}
inline static void Sub(const UnityComplexNumber& a, const UnityComplexNumber& b, UnityComplexNumber& result)
{
result.re = a.re - b.re;
result.im = a.im - b.im;
}
inline const UnityComplexNumber operator *(float c) const
{
UnityComplexNumber result;
result.re = re * c;
result.im = im * c;
return result;
}
inline const UnityComplexNumber operator *(const UnityComplexNumber& c) const
{
UnityComplexNumber result;
result.re = re * c.re - im * c.im;
result.im = re * c.im + im * c.re;
return result;
}
inline const UnityComplexNumber operator +(const UnityComplexNumber& c) const
{
UnityComplexNumber result;
result.re = re + c.re;
result.im = im + c.im;
return result;
}
inline const UnityComplexNumber operator -(const UnityComplexNumber& c) const
{
UnityComplexNumber result;
result.re = re - c.re;
result.im = im - c.im;
return result;
}
inline float Magnitude() const
{
return sqrtf(re * re + im * im);
}
inline float Magnitude2() const
{
return re * re + im * im;
}
public:
float re, im;
};
class FFT
{
public:
static void Forward(UnityComplexNumber* data, int numsamples);
static void Backward(UnityComplexNumber* data, int numsamples);
};
class FFTAnalyzer : public FFT
{
public:
void Cleanup(); // Assumes zero-initialization
void AnalyzeInput(float* data, int numchannels, int numsamples, float specAlpha);
void AnalyzeOutput(float* data, int numchannels, int numsamples, float specAlpha);
void CheckInitialized();
bool CanBeRead() const;
void ReadBuffer(float* buffer, int numsamples, bool readInputBuffer);
public:
float* window;
float* ibuffer;
float* obuffer;
UnityComplexNumber* cspec;
float* ispec1;
float* ispec2;
float* ospec1;
float* ospec2;
int spectrumSize;
int numSpectraReady;
};