Version: 2023.2
언어: 한국어
네이티브 오디오 플러그인 SDK
오디오 플러그인용으로 GUI 커스터마이즈

네이티브 DSP 오디오 플러그인 개발

네이티브 DSP(디지털 시그널 프로세싱) 플러그인을 사용하여 오디오를 처리하고 파라미터를 노출하여 사용자가 오디오 효과를 실험하도록 할 수 있습니다. 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 함수를 호출합니다. 이 함수는 null일 수 있습니다.

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;
}

GetEffectData 함수는 상태 변수의 effectdata 필드를 구조의 EffectData::Data에 캐스트하는 헬퍼 함수입니다.

GUI 커스터마이즈 및 Unity에 오디오 플러그인 임포트

Unity에서 플러그인 파라미터를 표시하는 방식을 커스터마이즈하려면 오디오 플러그인용으로 GUI 커스터마이즈를 참조하십시오.

플러그인을 Unity로 임포트하려면 Unity에서 네이티브 DSP 플러그인 및 GUI 사용을 참조하십시오.

추가 리소스


네이티브 오디오 플러그인 SDK
오디오 플러그인용으로 GUI 커스터마이즈