버전

menu_open
Wwise SDK 2019.2.15
Wwise 플러그인 XML 설명 파일

Wwise의 오픈 아키텍처는, 사운드를 생성하는 음원 플러그인, 사운드를 향상키기는 효과 플러그인, Wwise에서 소스 컨트롤 소프트웨어를 사용할 수 있게 만드는 소스 컨트롤 플러인, 이렇게 세 가지 플러그인을 지원합니다.

음원 플러그인과 효과 플러그인은, XML 플러그인 설명 파일을 사용해 기본 속성 값과 같은 자신의 플러그인 설정을 코드 재컴파일 없이 빠르게 변경할 수 있도록 합니다. Wwise 플러그인 DLL에는 여러 플러그인이 들어갈 수 있으며, 연관 XML 파일에 설명돼있어야 합니다.

각 Wwise 플러그인 DLL의 XML 설명 파일은, XML 파일 확장자를 제외하고는 해당 DLL과 동일한 이름이어야 합니다. 예를 들어, 자신의 DLL 이름이 "MyPlugin.dll"이라면, 플러그인 설명 파일 또한 "MyPlugin.xml"이라는 이름이어야합니다.

XML 파일의 콘텐츠

XML 설명 파일에는 다음과 같은 Wwise 플러그인 관련 정보가 담겨있습니다.

  • 플러그인 이름
  • Company ID 및 plug-in ID. 더 자세한 정보는 Wwise Plug-in ID 를 참고하세요.
  • 각 플랫폼에서 지원하는 기능
  • 다음을 포함한 속성 설명:
    • 속성 이름 (코드와 유지된 파일의 속성을 식별하는 데 사용되는 문자열)
    • 속성 타입
    • RTPC 지원
    • 기본 값
    • 사운드 엔진 속성 ID (사운드 엔진 플러그인에서 이 속성을 코드에 바인딩)
    • 범위 제한 또는 열거 제한
    • 다른 속성에 대한 종속성
    • 사용자 인터페이스 설명 요소
  • 다음을 포함한 Inner Object Types 설명:
    • Inner Object Type 이름 (내부 오브젝트 타입을 식별하는 데 사용되는 문자열)
    • Inner Object Properties

예시: XML 설명 파일

다음은 플러그인 XML 설명 파일의 간단한 예시입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (C) 2020 Audiokinetic Inc. -->
<PluginModule>
<EffectPlugin Name="Wwise Parametric EQ" CompanyID="0" PluginID="105">
<PluginInfo>
<PlatformSupport>
<Platform Name="Windows">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="Mac">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="iOS">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="XboxOne">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="PS4">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
</PlatformSupport>
</PluginInfo>
<Properties>
<Property Name="OnOffBand1" Type="bool" SupportRTPCType="Exclusive" ForceRTPCCurveSegmentShape="Constant" DisplayName="Band 1 Enable">
<DefaultValue>true</DefaultValue>
<AudioEnginePropertyID>4</AudioEnginePropertyID>
</Property>
<Property Name="FilterTypeBand1" Type="int32" SupportRTPCType="Exclusive" ForceRTPCCurveSegmentShape="Constant" DisplayName="Band 1 Filter Type">
<DefaultValue>5</DefaultValue>
<AudioEnginePropertyID>10</AudioEnginePropertyID>
<Restrictions>
<ValueRestriction>
<Enumeration Type="int32">
<Value DisplayName="Low Pass">0</Value>
<Value DisplayName="High Pass">1</Value>
<Value DisplayName="Band Pass">2</Value>
<Value DisplayName="Notch">3</Value>
<Value DisplayName="Low Shelf">4</Value>
<Value DisplayName="High Shelf">5</Value>
<Value DisplayName="Peaking">6</Value>
</Enumeration>
</ValueRestriction>
</Restrictions>
<Dependencies>
<PropertyDependency Name="OnOffBand1" Action="Enable">
<Condition>
<Enumeration Type="bool">
<Value>1</Value>
</Enumeration>
</Condition>
</PropertyDependency>
</Dependencies>
</Property>
<Property Name="GainBand1" Type="Real32" SupportRTPCType="Exclusive" DataMeaning="Decibels" DisplayName="Band 1 Gain">
<UserInterface Step="0.5" Fine="0.1" Decimals="1" />
<DefaultValue>0</DefaultValue>
<AudioEnginePropertyID>1</AudioEnginePropertyID>
<Restrictions>
<ValueRestriction>
<Range Type="Real32">
<Min>-24</Min>
<Max>24</Max>
</Range>
</ValueRestriction>
</Restrictions>
<Dependencies>
<PropertyDependency Name="OnOffBand1" Action="Enable">
<Condition>
<Enumeration Type="bool">
<Value>1</Value>
</Enumeration>
</Condition>
</PropertyDependency>
</Dependencies>
</Property>
</Properties>
</EffectPlugin>
</PluginModule>

XML 파일의 다양한 부분을 자세히 살펴보겠습니다.

XML 설명 파일의 헤더

이 XML 파일의 헤더 부분을 살펴보고 자세한 내용을 알아봅시다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (C) 2020 Audiokinetic Inc. -->

어떤 XML 파일이든 첫 번째 라인에서는 XML 버전과 인코딩을 정의합니다. 여기서는, XML 버전은 1.0이고 인코딩은 UTF-8 입니다. 모든 Wwise 플러그인 설명 파일의 첫 번째 라인은 항상 위의 것과 같은 양식이어야 합니다. 두 번째 라인은 XML 주석으로, 여기서는 저작권 공고입니다. 필요에 따라 XML 파일 안 다양한 곳에 주석을 입력할 수 있습니다.

PluginModule 구성 요소

<PluginModule>
...
</PluginModule>

이 문서의 주요 XML 요소는 PluginModule 라고 이름 붙였으며, 파일 안에 정의된 다양한 플러그인의 모든 정보를 담고 있습니다.

EffectPlugin 및 SourcePlugin 구성 요소

<EffectPlugin Name="Wwise Parametric EQ" CompanyID="0" PluginID="105" SupportsIsSendModeEffect="false">
...
</EffectPlugin>

EffectPlugin 구성 요소가 단일 효과 플러그인 정의의 주요 구성 요소이며, SourcePlugin 은 음원 플러그인의 구성 요소 이름입니다.

이들 구성 요소에는 다음과 같이 세 가지 속성이 필요합니다.

  • Name (필수): 이 문자열은 Wwise에서 보여지게 될 플러그인 이름을 지정합니다.
  • CompanyID (필수): 이 문자열은 다음 범위 안에 드는 양의 정수를 나타내야 합니다.
    • 64-255: 내부적으로 개발해 사용하는 플러그인용으로 자유롭게 사용할 수 있습니다. 외부로 배포하는 플러그인에는 해당되지 않습니다.
    • 256-4095: 상업용 플러그인 전용입니다. 이 숫자는 Audiokinetic이 공식 서드 파티 개발자에게 부여합니다. 만약 공식 서드 파티로 지정되었다면, 64-255 범위를 사용하지 말고 이 범위 내 숫자를 사용하세요. 반대로 그렇지 않은 경우, 이 범위를 사용하지 마시기 바랍니다.
    • 0-63: 사용 불가. Audiokinetic 전용.
  • PluginID (필수): 이 문자열은 0-32767 범위 내 양의 정수여야 합니다. 각 PluginID는 지정된 CompanyID에 대해 고유해야 합니다.
  • SupportsIsSendModeEffect (선택 사항): (Effect 플러그인에만 해당) 이 boolean 값은 초기화 부분에서 AK::IAkEffectPluginContext::IsSendModeEffect() 를 쿼리함으로써 플러그인이 전송 모드(send mode)를 지원할지 나타냅니다. IsSendModeEffect() 가 true를 반환하면, 플러그인은 원본 신호(dry signal)를 출력해서는 안 되며 원본 레벨(dry level) 속성을 무시해야 합니다.
  • EngineDllName (선택 사항): 이 문자열 값은 게임 런타임 때 어느 동적 라이브러리를 로드할 것인지를 나타냅니다 (기본 설정은 XML과 동일한 이름). EngineDllName 이 지정된 경우, 자신의 플러그인에서 만든 정적 및 동적 라이브러리 모두 같은 이름이어야 합니다. Unity나 Unreal 4와 같은 상업용 게임 엔진에서 지원될 수 있도록 하려면 반드시 자신의 플러그인과 함께 DLL/so 파일을 제공해야합니다. 게임에는 불필요한 모든 Property Pages UI가 들어있는 XML 옆에 놓인 DLL과는 다른 파일이라는 것에 주의하시기 바랍니다.

예를 들어, 내부적으로만 사용할 목적으로 음원 플러그인 두 개와 효과 플러그인 하나를 개발할 경우, 64에서 255 사이 중 아무 숫자나 CompanyID로 사용할 수 있으며, 0과 32767 사이 중 아무거나 세 개의 숫자를 PluginID로 사용할 수 있습니다. 이 숫자들은 연속된 숫자가 아니어도 상관 없습니다.

경고: Audiokinetic에서 제공하는 예제 플러그인 (예제 플러그인)을 기반으로 만든 플러그인의 경우, CompanyID와 PluginID를 자신에 맞게 변경하는 것을 잊지 마세요. 공식 CompanyID를 부여 받은 경우 그것을 사용하고, 그렇지 않은 경우 64에서 255 사이 숫자를 사용하면 됩니다. PluginID에 사용됐던 숫자가 CompanyID에 중복되지 않도록 주의하세요.

하나의 CampanyID에 대해 둘 이상의 PluginID가 동일한 경우, Wwise가 시작할 때 오류 메시지가 뜹니다. 이 경우, 새로운 플러그인의 ID를 변경하세요.

경고: 절대로 기존 플러그인의 CompanyID나 PluginID를 변경해서는 안됩니다 . 이 플러그인을 사용하는 프로젝트가 더 이상 해당 플러그인을 인식하지 못하게 됩니다. CompanyID와 PluginID는 음원 플러그인이나 효과 플러그인의 각 인스턴스로 유지되며, 파일이 로드될 때 올바른 플러그인의 인스턴스를 재생성하는 데 사용됩니다.

ComapnyID와 PluginID 속성은 플러그인을 식별하는 아래의 함수들로 전달된 매개 변수와 일치합니다.

참고: DLL에 둘 이상의 플러그인이 구현된 경우, XML 파일에는 여러 개의 EffectPluginSourcePlugin 항목이 포함됩니다.

PluginInfo 구성 요소

<PlatformSupport>
<Platform Name="Windows">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="Mac">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="iOS">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="XboxOne">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
<Platform Name="PS4">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
</PlatformSupport>

PluginInfo/PlatformSupport 섹션에서 자신의 플러그인이 지원하는 플랫폼을 정의합니다. 여기에는 하나 이상의 Platform 구성 요소가 들어있으며, 이 각각의 구성 요소는 각 플랫폼에서 플러그인이 지원하는 다양한 기능을 명시하고 있습니다. 다음과 같은 기능이 명시됩니다.

  • CanBeInsertOnBusses 는 효과가 버스 제어에 적용될 수 있는지를 결정합니다. 대부분의 경우 효과가 서라운드 오디오 환경 설정을 지원해야 합니다.
  • CanBeInsertOnAuxBusses 는 효과가 보조 버스를 제어하는 데 적용될 수 있는지를 결정합니다. 대부분의 경우 효과가 서라운드 오디오 환경 설정을 지원해야 합니다. CanBeInsertOnBusses 가 이미 설정돼있는 경우, 해당 효과는 이미 Aux 버스에 사용할 수 있습니다.
  • CanBeInsertOnAudioObjects 는 효과가 SFX에 삽입으로 적용될 수 있는지를 결정합니다 (모노와 스테레오 처리 둘 다 지원해야 함).
  • CanBeRendered 는 효과가 오프라인 렌더링에 사용될 수 있는지를 결정합니다.
  • CanBeInsertEndOfPipeline 은 효과가 오디오 파이프라인의 마지막, 즉 상위 레벨 Audio Bus의 마지막 효과가 있는 자리에만 추가될 수 있는지를 결정합니다 (Audiokinetic 전용).

자신의 플러그인은 Wwise 안에서 지정된 플랫폼에 대해서만 사용 가능합니다.

모든 지원 플랫폼을 나열하는 대신 "Any (모든)" 플랫폼을 추가할 수도 있습니다. 단, 이 플러그인은 Wwise 안에서 모든 플랫폼에서 사용 가능한 것으로 소개된다는 점을 기억하세요. 또한, 일치하는 런타임 라이브러리가 플러그인에 없는 경우 사용자는 해당 플랫폼으로 가져올 때에야 이 사실을 알게 되다는 점에 유의하세요.

<PlatformSupport>
<Platform Name="Any">
<CanBeInsertOnBusses>true</CanBeInsertOnBusses>
<CanBeInsertOnAudioObjects>true</CanBeInsertOnAudioObjects>
<CanBeRendered>true</CanBeRendered>
</Platform>
</PlatformSupport>

속성 구성 요소

각 효과나 음원 플러그인은 속성 및 레퍼런스를 정의할 수 있습니다. 속성과 레퍼런스에 대한 더 자세한 정보는 플러그인 속성 및 커스텀 속성 XML 설명 을(를) 참고하세요.

내부 오브젝트

InnerTypes 섹션은 자신의 플러그인 안에서 인스턴스화하고 사용할 수 있는 Inner Object Types를 정의합니다. InnerTypes 섹션 안에 여러 개의 InnerType 을 정의할 수 있습니다. 각 InnerType 은 고유의 이름과 플러그인 ID를 갖고있어야 합니다. InnerType 섹션에는 Properties 섹션이 포함돼있으며, 여기에서 플러그인 속성을 정의하는 방식과 동일하게 속성을 정의할 수 있습니다.

Inner Types 는 플러그인에 여러 오브젝트 인스턴스가 필요할 때 매우 유용합니다. 예를 들어, 가변수의 EQ 밴드가 있을 경우, EQ 플러그인의 Inner Type Band 를 정의할 수 있습니다. 각 밴드에는, 각 밴드의 서로 다른 값과 함께 동일한 속성 정의가 있습니다.

<PluginModule>
<EffectPlugin ...>
<PluginInfo ...>
...
</PluginInfo>
<Properties>
...
</Properties>
<InnerTypes>
<InnerType Name="Band" CompanyID="X" PluginID="Y">
<Properties>
...
</Properties>
</InnerType>
</InnerTypes>
</EffectPlugin>
참고: Inner Types의 속성은 RTPC를 지원하지 않습니다. 따라서 SupportRTPCType 속성과 AudioEnginePropertyID 구성 요소를 사용할 수 없습니다.
참고: InnerTypes 는 Source 플러그인과 Effect 플러그인 안에서만 지원됩니다.

자신의 플러그인 코드에서 Inner Type 인스턴스 (Inner Objects)를 수정하려면, 플러그인 초기화에 AK::Wwise::IAudioPlugin::SetPluginObjectStore() 가 호출될 때 프레임워크가 제공하는 AK::Wwise::IPluginObjectStore 포인터를 사용해야 합니다. AK::Wwise::IPluginObjectStore 인터페이스는 Inner Object를 생성하고 삭제하는 함수를 제공합니다. 오브젝트가 생성될 때, 삽입 함수 및 삭제 함수를 사용하여 명시된 목록에 저장돼야 합니다.

예를 들어, 다음과 같이 Band 타입의 Inner Object를 생성하고, 이를 BandList에 저장할 수 있습니다.

// 새로운 밴드 생성
AK::Wwise::IPluginPropertySet* pBand = GetObjectStore()->CreateObject( L"Band" );
// "BandList" 안에 이 새로운 밴드 삽입 (맨 끝에)
GetObjectStore()->InsertObject( L"BandList", (unsigned int)-1, pBand );
참고: Inner Object는 하나의 목록에만 저장될 수 있습니다.

다음 내용을 확인하세요.

오브젝트 저장소에 Inner Object를 추가할 때, 연관 Undo 체계가 Wwise에 자동으로 생성됩니다. 실행 취소 시스템을 별도로 구현할 필요가 없습니다. 그러나 실행 취소 이벤트를 올바르게 지원하려면 프레임워크로부터 알림을 받는 때에만 자신의 사용자 인터페이스를 업데이트해야 합니다. 예를 들면, IPluginObjectStoreInsertObject 를 호출한 후, 곧바로 UI를 업데이트하지 않는 것입니다. AK::Wwise::IAudioPlugin::NotifyInnerObjectAddedRemoved 알림이 플러그인에서 호출되기를 기다리세요. 이 알림은, 오브젝트가 목록에 추가 또는 삭제되었다고 알려줍니다. 이 알림은 사용자의 동작으로 인해 발생할 수도 있고, Undo 체계에 의해서도 발생할 수 있습니다.

Inner Object에서 속성 값이 변경될 때 호출되는 AK::Wwise::IAudioPlugin::NotifyInnerObjectPropertyChanged 도 확인해보세요.

프로젝트 워크 유닛 내 유지는 Wwise에 의해 자동으로 처리됩니다. 그러나 Sound Engine 데이터와 SoundBank 내 Inner Object의 직렬화를 구현해줘야 합니다. AK::Wwise::IAudioPlugin::GetPluginDataAK::Wwise::IAudioPlugin::GetBankParameters 안에 Inner Object를 직렬화해야 합니다.

문제 해결

문제가 발생할 경우 Wwise 음원 플러그인 및 효과 플러그인 문제 해결 안내 을 참고하세요.

AkForceInline void Max(AkReal32 *in_pVolumesDst, const AkReal32 *in_pVolumesSrc, AkUInt32 in_uNumChannels)
Get max for all elements of two volume vectors, independently.
AkForceInline void Min(AkReal32 *in_pVolumesDst, const AkReal32 *in_pVolumesSrc, AkUInt32 in_uNumChannels)
Get min for all elements of two volume vectors, independently.

이 페이지가 도움이 되었나요?

지원이 필요하신가요?

질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!

지원 페이지를 방문해 주세요

작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.

프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.

Wwise를 시작해 보세요