네이티브 DSP(디지털 시그널 프로세싱) 플러그인을 사용하여 오디오를 처리하고 파라미터를 노출하여 사용자가 오디오 효과를 실험하도록 할 수 있습니다. Unity에서 제공하는 예시 플러그인 에서 플러그인을 실험하고 필요한 파라미터에 대한 아이디어를 얻을 수 있습니다.
Unity용 네이티브 오디오 플러그인을 개발하려면 다음 단계를 따르십시오.
오디오 플러그인 파일을 생성합니다.
플러그인을 인스턴스화합니다.
플러그인을 언로드합니다.
오디오 플러그인 파일을 생성하려면 다음 단계를 따르십시오.
최신 오디오 플러그인 SDK를 다운로드합니다.
폴더에서 NativeAudioPlugins > NativeCode로 이동합니다. 네이티브 예시 플러그인 .cpp 파일이 여기에 있습니다.
플러그인 .cpp 파일 중 하나를 복제하여 자체 플러그인의 템플릿으로 사용하거나, 예시 플러그인 파일(예: Plugin_Equalizer.cpp
)에서 직접 작업하거나, 자체 .cpp 파일을 생성할 수 있습니다.
AudioPluginUtil.h
가 없는 경우 파일에 포함합니다.
사용자가 플러그인을 사용할 때 상호작용하는 데 유용한 파라미터 목록을 만듭니다. 플러그인에 파라미터를 추가하려면 다음 단계를 따르십시오.
플러그인 .cpp 파일에서 파라미터를 열거형 값으로 정의합니다. 예시:
enum Param
{
P_FREQ, //Frequency parameter
P_MIX, //Mix parameter
P_NUM //An extra value to keep track of length of the enum
};
UnityAudioParameterDefinitions
의 배열을 생성하고 크기를 파라미터의 수로 설정합니다.
int numparams = P_NUM;
definition.paramdefs = new UnityAudioParameterDefinition [numparams];
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를 생성합니다.
플러그인 인스턴스를 생성하려면 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
오브젝트는 호스트에서 수신한 데이터를 저장하고 모든 콜백 함수에 데이터를 전달합니다. 저장되는 데이터에는 다음이 포함됩니다.
샘플링 속도
처리된 총 샘플 수(타이밍용)
플러그인의 바이패스 여부
플러그인 인스턴스를 해제하려면 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;
}
오디오 프로세싱을 처리하려면 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
에 캐스트하는 헬퍼 함수입니다.
Unity에서 플러그인 파라미터를 표시하는 방식을 커스터마이즈하려면 오디오 플러그인용으로 GUI 커스터마이즈를 참조하십시오.
플러그인을 Unity로 임포트하려면 Unity에서 네이티브 DSP 플러그인 및 GUI 사용을 참조하십시오.