Version: 6000.3
语言: 中文
原生音频插件 SDK
为您的音频插件自定义 GUI

开发原生 DSP 音频插件

您可以使用本机数字信号处理 (DSP)插件在 Unity 外部创建的一组代码,用于在 Unity 中创建功能。可以在 Unity 中使用两种插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。详细信息
请参阅术语表
处理音频并公开参数供用户试验音频效果可以修改混音器组件输出的任何效果,例如过滤声音的频率范围或应用混响。更多信息
请参阅术语表
.Unity 提供的示例插件是试验插件和获取所需参数的好地方。

要为 Unity 开发本机音频插件,请执行以下作:

  1. 创建音频插件文件

  2. 插件文件中定义参数

  3. 实例化插件

  4. 卸载插件

  5. 处理插件的音频处理

1. 创建音频插件文件

若要创建音频插件文件:

  1. 下载最新的音频插件 SDK

  2. 在文件夹中,转到 NativeAudioPlugins > NativeCode。本机示例插件.cpp文件位于此处。

  3. 您可以复制其中一个插件.cpp文件,以便将其用作您自己的插件的模板,直接在其中一个示例插件文件中工作(例如,Plugin_Equalizer.cpp),或创建您自己的.cpp文件。

  4. 包括AudioPluginUtil.h如果文件还没有,则在您的文件中。

2. 在音频插件文件中定义参数

创建一个参数列表,这些参数对用户在使用插件时进行交互很有用。要将参数添加到插件:

  1. 在插件.cpp文件中,将参数定义为枚举值。例如:

    enum Param
    {
        P_FREQ, //Frequency parameter
        P_MIX,  //Mix parameter
        P_NUM   //An extra value to keep track of length of the enum
    };
    
  2. 创建一个数组UnityAudioParameterDefinitions并将其大小设置为您拥有的参数数:

    int numparams = P_NUM;
    definition.paramdefs = new UnityAudioParameterDefinition [numparams];
    
  3. 使用RegisterParameter函数来注册每个枚举值。

    int InternalRegisterEffectDefinition(UnityAudioEffectDefinition& definition)
    {
                int numparams = P_NUM;
            definition.paramdefs = new  UnityAudioParameterDefinition [numparams];
            RegisterParameter(definition, "Frequency", "Hz",
                0.0f, kMaxSampleRate, 1000.0f,
                1.0f, 3.0f,
                P_FREQ);
            RegisterParameter(definition, "Mix amount", "%",
                0.0f, 1.0f, 0.5f,
                100.0f, 1.0f,
                P_MIX);
            return numparams;
    }
    

下表概述了RegisterParameter函数,其参数以及它在上面的代码示例中的使用方式:

参数类型和名称 示例代码中的变量 描述
UnityAudioEffectDefinition definition definition UnityAudioEffectDefinition 结构包含 UnityAudioParameterDefinition 数组。RegisterParameter 函数将参数定义作为条目插入到此数组中。
char* name “Frequency”,“Mix Amount” 要为参数指定的显示名称。
char* unit “Hz”,“%” 值的类型。
float minval 0.0f 参数的最小值。
float maxval kMaxSampleRate,1.0f 参数的最大值。
float defaultval 1000.0f,0.5f 参数的默认值和初始值。
float displayscale 1.0f,100.0f 仅用于显示参数的比例因子。例如,示例代码中的百分比最小值为 0,最大值为 1,比例因子为 100.0f。这意味着,尽管实际值介于 0 和 1 之间,但 Unity 中 GUI 中显示的值介于 0% 和 100% 之间。
float displayexponent 3.0f,1.0f 将参数映射到滑块。
int enumvalue P_FREQ,P_MIX 枚举值。

Unity 根据这些基本参数定义生成默认 GUI。

3. 实例化您的原生音频 DSP 插件

要创建插件的实例,请使用CreateCallback功能。Unity 调用CreateCallback在创建插件后立即运行。它可以是空。

struct EffectData
{
    struct Data
    {
        float p[P_NUM]; // Parameters
        float s;        // Sine output of oscillator
        float c;        // Cosine output of oscillator
    };
    union
    {
        Data data;
        unsigned char pad[(sizeof(Data) + 15) & ~15];
    };
};
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK CreateCallback(
    UnityAudioEffectState* state)
{
    EffectData* effectdata = new EffectData;
    memset(effectdata, 0, sizeof(EffectData));
    effectdata->data.c = 1.0f;
    state->effectdata = effectdata;
    InitParametersFromDefinitions(
        InternalRegisterEffectDefinition, effectdata->data.p);
    return UNITY_AUDIODSP_OK;
}

UnityAudioEffectState对象存储它从主机接收的数据,并将数据传递给所有回调函数。它存储的数据包括:

  • 采样率

  • 处理的样本总数(用于计时)

  • 是否绕过插件

4. 卸载您的原生音频 DSP 插件

要释放插件实例,请使用ReleaseCallback功能。 Unity 调用ReleaseCallback函数,然后释放插件,并释放与插件的这个特定实例关联的任何数据。在此之后,不会再发生与实例相关的回调。

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ReleaseCallback(
    UnityAudioEffectState* state)
{
    EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
    delete data;
    return UNITY_AUDIODSP_OK;
}

5. 处理插件中的音频处理

要处理音频,请使用ProcessCallback功能。Unity 反复调用ProcessCallback函数,其中包含要读取的输入音频块和要写入的输出块。

以下代码给出了正弦波乘以所有通道的示例:

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ProcessCallback(
    UnityAudioEffectState* state,
    float* inbuffer, float* outbuffer,
    unsigned int length,
    int inchannels, int outchannels)
{
    EffectData::Data* data = &state->GetEffectData<EffectData>()->data;

    float w = 2.0f * sinf(kPI * data->p[P_FREQ] / state->samplerate);
    for(unsigned int n = 0; n < length; n++)
    {
        for(int i = 0; i < outchannels; i++)
        {
            outbuffer[n * outchannels + i] =
                inbuffer[n * outchannels + i] *
                (1.0f - data->p[P_MIX] + data->p[P_MIX] * data->s);
        }
        data->s += data->c * w; // cheap way to calculate a sine-wave
        data->c -= data->s * w;
    }

    return UNITY_AUDIODSP_OK;
}

GetEffectDatafunction 是一个辅助函数,它将effectdata字段的状态变量的EffectData::Data在结构中。

自定义 GUI 并将音频插件导入 Unity

如果您想自定义 Unity 显示插件参数的方式,请参阅自定义音频插件的 GUI

要将插件导入 Unity,请参阅在 Unity 中使用本机 DSP 插件和 GUI

其他资源

原生音频插件 SDK
为您的音频插件自定义 GUI