버전

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

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

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

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

Wwise 저작 플러그인

플러그인 미디어 관리하기

자신의 플러그인 백엔드에서 AK::Wwise::Plugin::RequestObjectMedia 를 상속받아 Object Media 서비스를 요청할 수 있습니다. 그러면 m_objectMedia 멤버가 제공돼 해당 서비스의 메소드에 접근할 수 있습니다. To receive notifications about the object media, such as when it has been changed by the user, derive from AK::Wwise::Plugin::Notifications::ObjectMedia and override the AK::Wwise::Plugin::Notifications::ObjectMedia::NotifyPluginMediaChanged() method.

class MyPluginBackend
: public AK::Wwise::Plugin::AudioPlugin
, public AK::Wwise::Plugin::RequestObjectMedia
, public AK::Wwise::Plugin::Notifications::ObjectMedia
, public AK::Wwise::Plugin::RequestHost
{
void NotifyPluginMediaChanged() override
{
// React to change
// ...
// Wwise에게 데이터가 재변환되어야 한다고 알림.
m_host.NotifyInternalDataChanged(
true /* in_bMakeProjectDirty */
);
}
};

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

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

해당 코드 다음으로, AK::Wwise::Plugin::ObjectMedia::InvalidateMediaSource() 를 호출해 미디어 파일 변환을 요청합니다.

플러그인 데이터가 변경되었을 때 알림을 받기 위해 NotifyPluginMediaChanged 함수를 오버라이드합니다.

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

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

런타임을 위한 미디어 변환

가져온 원본 WAV 미디어를 실시간 컴포넌트에 적합한 형식으로 런타임 때 변환해야할 경우가 있습니다. 변환 함수를 구현하기 위해서는 AK::Wwise::Plugin::MediaConverter 로부터 상속하여 필요한 함수를 구현합니다.

  • AK::Wwise::Plugin::MediaConverter::ConvertFile
  • AK::Wwise::Plugin::MediaConverter::GetCurrentConversionSettingsHash
class MyPlugin
: public AK::Wwise::Plugin::AudioPlugin,
, public AK::Wwise::Plugin::MediaConverter

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

#include <filesystem>
#include <ctype.h>
AK::Wwise::Plugin::ConversionResult MyPlugin::ConvertFile(
const GUID& in_guidPlatform,
const BasePlatformID& in_basePlatform,
const char* in_szSourceFile,
const char* in_szDestFile,
AkUInt32 in_uSampleRate,
AkUInt32 in_uBlockLength,
IProgress* in_pProgress,
IWriteString* io_pError)
{
// 원본 소스를 변환된 파일로 변환.
// 최소한, 원본 파일을 변환 파일로 복사
std::filesystem::copy(in_szSourceFile, in_szDestFile);
}
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);
}

플러그인 정의

플러그인 정의 파일에 (예: 플러그인 XML 파일), CanReferenceDataFile 요소가 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에 직접 추가해줘야 합니다.

@ AK_Fail
The operation failed.
Definition: AkTypes.h:135
AKRESULT
Standard function call result.
Definition: AkTypes.h:132
uint8_t AkUInt8
Unsigned 8-bit integer
Definition: AkTypes.h:57
virtual void GetPluginMedia(AkUInt32 in_dataIndex, AkUInt8 *&out_rpData, AkUInt32 &out_rDataSize)=0
AKSOUNDENGINE_API AKRESULT Init(const AkCommSettings &in_settings)
ConversionResult
Conversion error code.
Definition: Utilities.h:190
#define NULL
Definition: AkTypes.h:47
@ ConversionSuccess
Definition: Utilities.h:191
uint32_t AkUInt32
Unsigned 32-bit integer
Definition: AkTypes.h:59
HashParams::HashType Compute(const void *in_pData, typename HashParams::SizeType in_dataSize)
Definition: AkFNVHash.h:106
static const AkPluginParamID ALL_PLUGIN_DATA_ID
Definition: IAkPlugin.h:666
Defines the parameters of an audio buffer format.
Definition: AkCommonDefs.h:63

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

지원이 필요하신가요?

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

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

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

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

Wwise를 시작해 보세요