버전

menu_open
알림: 고객님의 주요 출시 버전( 2019.2.15.7667 )에 해당하는 최신 설명서로 이동했습니다. 특정 버전의 설명서를 보시려면 Audiokinetic 런처에서 오프라인 설명서를 다운로드하고 Wwise Authoring의 Offline Documentation을 확인하세요.
Wwise SDK 2019.2.15
2차 출력 통합하기

Wwise에서 2차 출력은 일반 TV 오디오 출력이 아닌 모든 물리적 오디오 말단을 지정합니다. 가장 일반적으로 사용하는 2차 출력에는 게임 컨트롤러 스피커와 헤드폰이 있습니다. 2차 출력(Secondary Output) 기능을 이용하면 주요 스피커/TV 믹스에는 아무 영향을 주지 않은 채 이러한 2차 출력 각각에 대해 별도의 믹싱을 정의할 수 있습니다. 이 때 스피커/TV 대신 출력 컨트롤러를 대상으로 한다는 사실 외에는 일반 믹싱과 마찬가지로 동일한 Wwise 기능이 2차 출력에 적용됩니다.

버스 라우팅

저작 측면에는, Audio Device 장치의 믹싱을 따로 정의하려면 새로운 마스터 버스를 만들어야합니다. 그 다음 이 새로운 버스의 Audio Device ShareSet 속성이 다른 장치를 가리키도록 변경합니다. 서드파티에서 만든 Audio Device 플러그인을 사용하고자 할 경우, 먼저 올바른 플러그인 타입의 Audio Device ShareSet를 생성해야 할 수도 있습니다. 그러면 사운드를 새로운 버스 또는 하위 버스에 정상적으로 라우팅할 수 있습니다. Wwise에서 어떤 Audio Device를 사용할 수 있는지에 대해 자세한 정보를 보시려면 Audio Devices를 확인하세요.

2차 출력 인스턴스 하나에만 종속된 사운드의 경우 Output Bus를 직접 설정하는 것이 좋습니다. 예를 들어 플레이어가 쏘는 총소리, 테니스 라켓 휘두는 소리, PDA 소리, 게임플레이 피드백 등이 있습니다. 그러나 그 외 다른 버스 계층 구조에서는 Auxiliary Bus에 User나 Game Send를 사용할 수 있습니다. 이 방법은 스파이 카메라 또는 안내 방송과 같이 동일한 사운드가 다양한 출력과 TV에서 동시에 들릴 경우 선호되는 방법입니다.

동일한 음원으로 복수의 컨트롤러와 TV에 동시에 같은 소리를 재생할 수 있습니다. 설계 측면에서는, 게임 플레이어가 몇 명이 될 지 알 수 없습니다. 버스 계층 구조는, 게임에 등록된 각 출력의 라우팅 템플릿으로 사용됩니다. 따라서 재생되는 음원이나 게임 오브젝트에 대해 활성화돼있는 RTPC 및 Switch 값에 따라 각 출력에는 서로 다른 믹싱과 Effect가 적용될 수 있습니다. 아래 예제 섹션에서 이와 관련한 예제를 참고하세요.

출력 동기화와 관련한 정보

TV와 게임 컨트롤러와 같이 여러 장치에 동일한 오디오를 출력할 때, 두 장치 간 레이턴시가 발생할 것입니다. 오디오 신호의 경로에 서로 다른 하드웨어로 인한 레이턴시는 불가피하게 발생하게 됩니다. 컨트롤러 쪽에서는, 오디오 신호가 무선 채널을 통해 전송되어 유선 컨트롤러와는 다른 지연이 발생합니다. TV의 경우, 신호가 콘솔에서 나와 리시버나 TV로 전송돼 해당 프로세서가 일정량의 지연을 추가시킵니다. 이러한 지연은 각 시스템의 AV 설정이 다르게 돼있어 발생되는 것이기 때문에 스피커/TV와 게임 컨트롤러로 사운드가 동시에 전송되도록 동기화하는 것은 불가능합니다. 이런 제약은 개발하는 사운드 설계 단에서 극복해야 합니다.

복수의 출력에 대해 장치 및 리스너, 게임 오브젝트 설정하기

동일한 타입에 대해 복수의 출력이 있는 경우 (예를 들어 게임 컨트롤러 스피커), 해당 장치의 각 인스턴스를 구별해줘야 합니다. 일반적인 Listener/GameObject 개념을 사용하는데, 그 이유는 특정 리스너/방사체 전송을 허용하기 때문입니다. 더 많은 정보는 리스너 개념 를 참고하세요. 게임 프로그래머는 AK::SoundEngine::AddOutput를 이용해 반드시 출력 장치를 Listener와 연결시켜줘야 합니다. 그리고 프로그래머는 AK::SoundEngine::SetActiveListeners를 이용해 리스너와 게임 오브젝트의 관계를 설정해야 합니다. 복수의 장치에서 사운드를 동시에 재생해야 하는 경우, 복수의 리스너를 지정할 수 있다는 점을 명심하세요 (아래 예제 참고).

참고: 특정 타입(System, DVR, 등)의 출력이 하나밖에 없는 경우에는 여러 개의 리스너가 필요하지 않습니다. 이런 경우, Wwise 프로젝트에 지정된 라우팅에만 의존하면 됩니다. 게임에 싱글 플레이어만 있으면 플레이어에 특화된 출력(예: Game Controller Speaker 및 Communication)의 경우에도 위와 동일합니다. 즉, 게임에 활성화된 컨트롤러가 하나뿐이라는 뜻입니다. 리스너 통합하기 에서 리스너와 관련된 더 자세한 정보를 확인하세요.
참고: 플레이어 장치 측면에서는, 게임 컨트롤러가 시스템에 연결되거나 연결 해제될 때마다 게임 코드가 AK::SoundEngine::AddOutputAK::SoundEngine::RemoveOutput를 호출해야 합니다. 어느 장치를 어느 리스너 및 플레이어와 연결되는지에 대해 Wwise가 자동으로 알지는 못합니다. 시스템 장치(예: 주요 출력 및 DVR)는 Wwise에 의해 자동으로 관리됩니다.

예제

이 예제는 PS4를 대상으로 쓰였으나 다른 플랫폼에도 적용할 수 있습니다. AK::SoundEngine::AddOutput 함수에 대한 문서를 확인하세요. Integration Demo 예제 에서 DemoMotion 페이지(멀티 플레이어)와 BGMDemo 페이지(DVR/BGM 관리)에 보면 복수의 출력 관리에 대한 작업 예제를 확인할 수 있습니다.

참고:
가독성을 높이기 위해 이 예제들에는 함수 호출 전에 필요로 하는 AK::SoundEngine이 생략돼있습니다.

UserIDs를 얻는 코드 (PS4에만 해당됨):

SceUserServiceLoginUserIdList list;
sceUserServiceGetLoginUserIdList(&list);

게임 컨트롤러 출력에서 나는 사운드:

// 플레이어 0의 스피커 말단에 연결된 2차 출력을 추가
AkOutputSettings outputSettings("Game Controller Speaker", list.userId[0] /*플레이어 ID (첫 번째 플레이어)*/);
AddOutput(outputSettings);
// Event를 재생합니다. Wwise 프로젝트에서 이 사운드는 반드시 "Game Controller Speaker"(또는 하위 버스)에 출력하도록 설정된 마스터 버스로 라우팅돼야 합니다.
PostEvent("Play_Pow", MY_GAME_OBJECT);

두 개의 서로 다른 컨트롤러에서 나오는 동일한 사운드:

// 리스너 #1과 연관된 플레이어 0의 스피커 출력에 연결된 2차 출력을 추가합니다.
AkOutputSettings outputSettings1("Game Controller Speaker", list.userId[0] /*플레이어 ID (첫 번째 플레이어)*/);
AddOutput(outputSettings1, NULL, listenerArray1, 1);
// 리스너 #2와 연관된 플레이어 1의 스피커 출력에 연결된 2차 출력을 추가합니다.
AkOutputSettings outputSettings2("Game Controller Speaker", list.userId[1] /*플레이어 ID (첫 번째 플레이어)*/);
AddOutput(outputSettings2, NULL, listenerArray2, 1);
// 게임 오브젝트가 리스너 1(플레이어 0)과 리스너 2(플레이어1)에게 사운드를 방사하도록 설정합니다.
SetActiveListeners(EXISTING_GAME_OBJECT, listenerArrayBoth, 2);
// Event를 재생합니다. Wwise 프로젝트에서 이 사운드는 반드시 "Game Controller Speaker"(또는 하위 버스)에 출력하도록 설정된 마스터 버스로 라우팅돼야 합니다.
PostEvent("Play_Pow", EXISTING_GAME_OBJECT);

두 개의 서로 다른 컨트롤러에서 나오는 다른 사운드:

// 리스너 #1과 연관된 플레이어 0의 스피커 출력에 연결된 2차 출력을 추가합니다.
AkOutputSettings outputSettings1("Game Controller Speaker", list.userId[0] /*플레이어 ID (첫 번째 플레이어)*/);
AddOutput(outputSettings1, NULL, listenerArray1, 1);
AkOutputSettings outputSettings2("Game Controller Speaker", list.userId[1] /*플레이어 ID (첫 번째 플레이어)*/);
AddOutput(outputSettings2, NULL, listenerArray2, 1);
// 게임 오브젝트가 올바른 리스너에게 사운드를 방사하도록 설정합니다.
RegisterGameObj(MY_GAME_OBJECT1, listenerArray1, 1);
SetActiveListeners(MY_GAME_OBJECT1, listenerArray1, 1);
RegisterGameObj(MY_GAME_OBJECT2, listenerArray2, 1);
SetActiveListeners(MY_GAME_OBJECT2, listenerArray2, 1);
// Event를 재생합니다. Wwise 프로젝트에서 이 사운드는 반드시 "Game Controller Speaker"(또는 하위 버스)에 출력하도록 설정된 마스터 버스로 라우팅돼야 합니다.
PostEvent("Play_Pow", MY_GAME_OBJECT1);
PostEvent("Play_Pif", MY_GAME_OBJECT2);

한 개의 게임 컨트롤러 출력과 TV에서 나는 동일한 사운드:

// 리스너 #1과 연관된 플레이어 0의 스피커 출력에 연결된 2차 출력을 추가합니다.
AkOutputSettings outputSettings1("Game Controller Speaker", list.userId[0] /*플레이어 ID (첫 번째 플레이어)*/);
AddOutput(outputSettings1, NULL, listenerArray1, 1);
// 게임 오브젝트가 리스너 0(TV)와 리스너 1(플레이어 0의 컨트롤러)에게 사운드를 방사하도록 설정합니다.
AkGameObjectID [] listenerArrayWithDefault = {MY_MAIN_LISTENER, MY_LISTENER1}; // MY_MAIN_LISTENER는 일반적으로 사용하는 리스너로, AK::SoundEngine::SetDefaultListeners 에 의해 정의됨.
RegisterGameObj(MY_GAME_OBJECT);
SetActiveListeners(MY_GAME_OBJECT, listenerArrayWithDefault, 2);
// Event를 재생합니다.
Wwise 프로젝트에서 이 사운드는 반드시 "Game Controller Speaker"(또는 하위 버스)에 출력하도록 설정된 마스터 버스로 라우팅돼야 합니다.
// 또한, 이 사운드에는 마스터 Audio Bus로 라우팅되는 Auxiliary 전송이 있어야 합니다.
PostEvent("Play_Pow", MY_GAME_OBJECT);

아래는 Windows에서 2차 출력, 즉 헤드폰을 추가하는 예제입니다.

참고: Windows에서 모든 장치는 "System" 장치입니다. 따라서 장치를 하나 추가할 때에는, 각각의 장치를 구별해줘야 합니다 (더 많은 정보는 복수의 출력에 대해 장치 및 리스너, 게임 오브젝트 설정하기 를 확인하세요). 이에 따라 다른 리스너가 필요합니다.
// 이름에 "Headphones"가 들어있는 장치를 검색합니다.
uDeviceID = AK::GetDeviceIDFromName("Headphones");
// 이전에 찾은 장치에 연결된 2차 출력을 리스너 1과 연결해 추가합니다.
AkOutputSettings outputSettings1("System", uDeviceID);
AddOutput(uoutputSettings1, NULL, listenerArray1, 1);
// 리스너 1에만 연결된 게임 오브젝트를 등록합니다.
RegisterGameObj(MY_GAME_OBJECT, listenerArray1, 1);
// Event를 재생합니다. Wwise 프로젝트에서 이 사운드는 반드시 "System"(또는 하위 버스)에 출력하도록 설정된 마스터 버스로 라우팅돼야 합니다.
PostEvent("Play_Pow", MY_GAME_OBJECT);
참고
AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypes.h:65
AKSOUNDENGINE_API AKRESULT RegisterGameObj(AkGameObjectID in_gameObjectID)
Platform-independent initialization settings of output devices.
Definition: AkSoundEngine.h:129
#define NULL
Definition: AkTypes.h:49
AKSOUNDENGINE_API AKRESULT AddOutput(const AkOutputSettings &in_Settings, AkOutputDeviceID *out_pDeviceID=NULL, const AkGameObjectID *in_pListenerIDs=NULL, AkUInt32 in_uNumListeners=0)
AKSOUNDENGINE_API AkUInt32 GetDeviceIDFromName(wchar_t *in_szToken)
AKSOUNDENGINE_API AkPlayingID PostEvent(AkUniqueID in_eventID, AkGameObjectID in_gameObjectID, AkUInt32 in_uFlags=0, AkCallbackFunc in_pfnCallback=NULL, void *in_pCookie=NULL, AkUInt32 in_cExternals=0, AkExternalSourceInfo *in_pExternalSources=NULL, AkPlayingID in_PlayingID=AK_INVALID_PLAYING_ID)

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

지원이 필요하신가요?

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

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

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

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

Wwise를 시작해 보세요