버전

menu_open
Wwise SDK 2023.1.3
오디오 플러그인에 미디어 추가하기

플러그인 미디어 시스템을 이용하면 플러그인(효과, 음원, 싱크, 믹서)에서 Wwise 아키텍처를 활용해 프로젝트 내 이진 데이터 파일을 저장할 수 있습니다.

플러그인에서 커스텀 데이터를 사용하는 대신 플러그인 미디어를 사용하면 다음과 같은 다양한 장점이 있습니다.

  • 데이터 빌트인 지속
  • Source Control 통합 (작업 그룹 기능 사용)
  • 플랫폼별로 허용된 데이터 변환
  • 허용된 데이터를 담을 SoundBank를 최종 사용자가 선택

Wwise 저작 플러그인

플러그인 미디어 관리하기

자신의 플러그인 백엔드에서 AK::Wwise::Plugin::RequestObjectMedia 를 상속받아 Object Media 서비스를 요청할 수 있습니다. 그러면 m_objectMedia 멤버가 제공돼 해당 서비스의 메소드에 접근할 수 있습니다. 오브젝트 미디어를 사용자가 변경하는 등, 관련된 알림을 받으려면 AK::Wwise::Plugin::Notifications::ObjectMedia 로부터 상속받아 AK::Wwise::Plugin::Notifications::ObjectMedia::NotifyPluginMediaChanged() 를 오버라이드합니다.

class MyPluginBackend
{
void NotifyPluginMediaChanged() override
{
// 변경에 따른 반응
// ...
// Wwise에게 데이터가 재변환되어야 한다고 알림.
m_host.NotifyInternalDataChanged(
true /* in_bMakeProjectDirty */
);
}
};

AK::Wwise::Plugin::ObjectMedia::SetMediaSource() 를 호출해 미디어 파일을 가져올 수 있습니다. 미디어를 가져올 때, 해당 미디어는 플러그인의 "Originals" 디렉터리에 복사되어 전적으로 Wwise가 관리하게 됩니다. 인덱스 0에서 플러그인 미디어 파일을 추가하려면:

m_pObjMedia->SetMediaSource( pszFilename, 0, bReplace );

플러그인 데이터가 변경되었을 때 알림을 받기 위해 NotifyPluginMediaChanged 함수를 오버라이드합니다. NotifyPluginMediaChanged is triggered by any modifications to the media source.

void NotifyPluginMediaChanged() override
{
// 변경에 대한 응답
// ...
// Wwise에게 데이터가 내변환되어야 한다고 알림.
m_pPSet->NotifyInternalDataChanged( AK::IAkPluginParam::ALL_PLUGIN_DATA_ID );
}

더 자세한 정보은 AK::Wwise::Plugin::ObjectMedia 함수의 설명 문서를 참고하세요.

런타임을 위한 미디어 변환

If the plug-in definition file uses CanReferenceDataFile, you must convert your imported original WAV media at runtime to an appropriate format for the real-time component.

To implement conversion functions, inherit from AK::Wwise::Plugin::MediaConverter and implement the required functions:

다음은 AK::Wwise::Plugin::MediaConverter 함수의 구현 예시입니다.

#include <filesystem>
#include <ctype.h>
const GUID& in_guidPlatform,
const BasePlatformID& in_basePlatform,
const AkOSChar* in_szSourceFile,
const AkOSChar* in_szDestFile,
AkUInt32 in_uSampleRate,
AkUInt32 in_uBlockLength,
IProgress* in_pProgress,
IWriteString* io_pError)
{
// Convert the original source to a converted file.
// At minimum, copy the original file to converted
std::error_code ec;
std::filesystem::copy(
in_szSourceFile,
in_szDestFile,
std::filesystem::copy_options::overwrite_existing,
ec
);
if (ec)
{
}
}
uint32_t MyPlugin::GetCurrentConversionSettingsHash(
const GUID& in_guidPlatform,
AkUInt32 in_uSampleRate,
AkUInt32 in_uBlockLength)
{
AK::FNVHash32 hashFunc;
// 변환에 영향을 미치는 매개 변수로부터 Hash 생성.
// 원본 파일 이름 가져오기.
char szInputFileName[_MAX_PATH];
auto size = m_pObjMedia->GetMediaSourceFileName(szInputFileName, _MAX_PATH);
if (size == 0)
return 0;
for (int i = 0; i < size; ++i)
{
szInputFileName[i] = tolower(szInputFileName[i]);
}
return hashFunc.Compute(szInputFileName, size);
}

플러그인 정의

In the plug-in definition file (the plug-in XML file), ensure that the CanReferenceDataFile element is set to true.

<PluginModule>
<EffectPlugin Name="YOUR_PLUGIN" CompanyID="???" PluginID="???">
<PluginInfo MenuPath="???">
<PlatformSupport>
<Platform Name="Windows">
...
<CanReferenceDataFile>true</CanReferenceDataFile>
</Platform>
<Platform Name="XboxOne">
...
<CanReferenceDataFile>true</CanReferenceDataFile>
</Platform>

런타임 플러그인

런타임에 플러그인 미디어 사용하기

자신의 플러그인의 Sound Engine 부분에서, AK::IAkEffectPlugin 을 구현하면 Init(...) 함수에서 AK::IAkEffectPluginContext 포인터를 받게 됩니다. AK::IAkEffectPluginContext 로부터 AK::IAkPluginContextBase::GetPluginMedia 를 호출하여 Wwise SoundBank에 패키징된 변환된 미디어를 구할 수 있습니다.

AK::IAkPluginMemAlloc* in_pAllocator, // 메모리 할당 인터페이스
AK::IAkEffectPluginContext* in_pFXCtx, // FX 컨텍스트
const AkAudioFormat& in_rFormat // 오디오 입력 형식 )
{
AkUInt8 * pPluginData = NULL;
AkUInt32 uPluginDataSize;
in_pFXCtx->GetPluginMedia( 0, pPluginData, uPluginDataSize );
if ( pPluginData == NULL )
return AK_Fail; // 임펄스 응답 없이 플러그인을 인스턴스화 하면 포인터가 없음.
...
}
참고: 이 예제에서는 런타임 때 effect 플러그인 미디어를 사용하는 방법을 설명합니다. 그러나 source plug-in 과 같이 다른 플러그인 타입을 사용하는 방법도 보여줍니다. 이 경우, AK::IAkSourcePlugin 을 구현하고 AK::IAkSourcePluginContex 포인터를 받게 됩니다.

Wwise 내에서의 사용

Bus Effect에서 플러그인 미디어 사용하기

Wwise에서, 모든 Effect는 Init.bnk에 저장됩니다. Init.bnk의 크기를 최소화하기 위해 플러그인 미디어는 Init.bnk에 자동으로 추가되지 않습니다. Effect ShareSet나 버스를 각각 별개의 SoundBank에 직접 추가해줘야 합니다.

Audiokinetic namespace
@ AK_Fail
The operation failed.
Definition: AkTypes.h:216
@ ConversionFailed
Definition: Utilities.h:192
AKRESULT
Standard function call result.
Definition: AkTypes.h:213
char AkOSChar
Generic character string
Definition: AkTypes.h:60
uint8_t AkUInt8
Unsigned 8-bit integer
virtual void GetPluginMedia(AkUInt32 in_dataIndex, AkUInt8 *&out_rpData, AkUInt32 &out_rDataSize)=0
AKSOUNDENGINE_API AKRESULT Init(const AkCommSettings &in_settings)
#define NULL
Definition: AkTypes.h:46
CPluginInfo PluginInfo
Definition: PluginDef.h:997
Wwise API for general Audio Plug-in's backend.
Definition: AudioPlugin.h:133
ConversionResult
Conversion error code.
Definition: PluginDef.h:147
virtual void NotifyPluginMediaChanged()
This function is called by Wwise when any of the plug-in media changes.
uint32_t AkUInt32
Unsigned 32-bit integer
HashParams::HashType Compute(const void *in_pData, typename HashParams::SizeType in_dataSize)
Definition: AkFNVHash.h:105
static const AkPluginParamID ALL_PLUGIN_DATA_ID
Definition: IAkPlugin.h:684
Defines the parameters of an audio buffer format.
Definition: AkCommonDefs.h:63

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

지원이 필요하신가요?

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

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

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

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

Wwise를 시작해 보세요