블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

FMOD 사이트는

 

http://www.fmod.org/

 

입니다. 접속하시면 다운을 받을 수 있습니다.

 

사운드 라이브러리 FOMD_API 입니다. Direct_Sound가 쓰기엔 불편한 점이 있습니다. 일단 FMOD를 직접 사용해 보시면 꽤나 편하다는 것을 느끼실 수 있을겁니다. FMOD를 설치를 하면 추가 해야 할 사항이 3가지가 있습니다.

 

1. 디렉터리 추가

상단 메뉴에서 프로젝트 -> 클릭 하시면 제일 아래 메뉴 Projectname속성 클릭 -> 속성 창이 뜹니다. 그러면 메뉴중에

c/c++ -> 일반 -> 추가 포함 디렉터리 -> 경로를 지정해주면 되는데 확장자가 inc를 지정해주셔야 합니다. 
저의 경로는 "C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api\inc" 입니다.""를 잊지 맙시다.

2. 라이브러리 추가.

마찬가지로 상단메뉴 프로젝트 -> ProjcetName속성 클릭 -> 속성 창이 뜹니다. 그러면 메뉴중에 링커 클릭-> 일반 ->
오른쪽 메뉴 중에서 추가 라이브러리 디렉터리 경로를 적으시면 됩니다. 저의 경로는 
"C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api\lib" 입니다. 이번 건 확장자  lib입니다.

3. FMOD 설치 하시면 설치 폴더 안에 api폴더가 있는데 api폴더 안으로 들어가셔서 fmodex.dll 복사.


그 다음에 진행중인 프로젝트 폴더 안에 fmodex.dll 붙여넣기 하시고 실행 시켰을 때 창이 뜨면서fmodex.dll 파일을 찾을 수 없다고 메시지가 뜨면 디버그 안에다가 복사를 한번 해주세요. 아마 이러면 잘 돌아갈 겁니다.

자 이렇게 세 가지 사항을 추가를 하시고 본격적으로 진행중인 프로젝트에 사운드를 틀어봅시다.

 

우선 코드에 기본적으로 선언해야 할 해더파일이 있습니다.

 

#include <fmod.hpp>
#include <fmod_errors.h>
#pragma  comment( lib, "fmodex_vc.lib" )

 

위 해더파일들을 기본적으로 선언해 주시고요.

 

 FMOD::System   * System;

 FMOD::Sound*     SoundName;
 FMOD::Channel*  channel;

 

윗 세 줄이 기본적으로 사운드를 틀기 위해 선언한 타입별 변수입니다. 

 

::를 봐서 아시겠지만 FMOD안에 포함이 된 System, Sound, Channel 들 입니다.

 

FMOD::System

System은 음악을 틀기 위한 기기라고 생각하시면 됩니다.

 

FMOD::Sound

 효과음의 갯수만큼 선언해주시면 됩니다. 폭발음, 탄을 쏠 때이 효과음이라던가 그 효과음의 갯수만큼 선언을 해 주시면 됩니다.

FMOD::Channel

채널을 컨트롤 하여 사운드의 볼륨을 설정해 줄 수 있습니다.

 

자 그럼 본격적으로 소스 한번 적어볼게요.

먼저 사운드를 생성하는 겁니다.

저의 경우

LOADSoundAll() 이라는 함수에서 사운드를 생성합니다.

함수안의 내용은

 

LOADSoundAll()

{

FMOD_RESULT result;

 result = FMOD::System_Create( &System );
 ERRCHECK( result );

 result= System->init( 100, FMOD_INIT_NORMAL, 0 );
 ERRCHECK( result );

 result = System->createSound( "../data/sound/stage1.wav", FMOD_DEFAULT, 0, &initSound );
 ERRCHECK( result );
 
 result = System->createSound("../data/sound/stage1.wav", FMOD_DEFAULT, 0, &Stage_1_Sound );
 ERRCHECK( result );
 
 result = System->createSound("../data/sound/Type1.wav", FMOD_DEFAULT, 0, &fireSound );
 ERRCHECK( result );

 result = System->createSound("../data/sound/Type2.wav", FMOD_DEFAULT, 0, &laserSound );
 ERRCHECK( result );
 
 result = System->createSound( "../data/sound/Destroy.wav", FMOD_DEFAULT, 0, &DestroySound );
 ERRCHECK( result );

 result = System->createSound("../data/sound/Stage2.wav", FMOD_DEFAULT, 0, &explosionSound );
 ERRCHECK( result );

}

이렇게 사운드를 생성합니다.

 

중요한 부분은 함수 안의 변수 선언부.

 

FMOD_RESULT result;

result = FMOD::System_Create( &System );

 

이렇게 해야지만 사운드를 생성할 수 있습니다.

한마디로 사운드를 생성하는 변수 타입이 FMOD_RESULT 라는 녀석이죠.

 

함수안의 윗 두줄 밑으로는 이해하기가 편합니다.

createSound안에 경로 적어주시면 되고 createSound의 3번째 인자는 FMOD::Sound의 변수명입니다. 효과음 이름이죠. 반드시 주소값( & )과 함께 써야합니다.

 

그리고 사운드 파일이 없다거나 잘못된 사운드 파일일 경우에 에러체크를 해줘야 합니다.

 

ERRCHECK( result )가 있는데

 

이녀석은 제가 따로 만든 함수입니다.

 

함수를 보면

 

ERRCHECH( FMOD_RESULT result )

{

  if( result != FMOD_OK )

{

  char str 256;

  sprintf( str, "FMOD error! (%d) %s\n", reuslt, FMOD_ErrorSting( result ) );

  MessageBox( NULL, str, "TEST", MB_OK );

}

}

이렇게 에러를 체크합니다. 에러체크는 안해줘도 별 상관은 없지만, 사운드 파일이 없다거나 그럴 때 메시지를 띄워주는게  좋은 습관이 아닌가 생각을 합니다.

 

저 함수안에서는 문자열 str 의 크기를 반드시 256으로 선언해줘야 합니다. 안 그러면 에러가 납니다.

 

다음으로 사운드를 재생시켜야 합니다.

전 PlaySound()라는 함수에서 재생을 합니다.

 

소스를 살펴보면

PlaySounc( char* sound_name )

{

 FMOD_RESULT result;

if ( sound_name == "stage_1" )
 {
  initSound->release();
  result = System->playSound( FMOD_CHANNEL_FREE, Stage_1_Sound, FALSE,  &channel );
  channel->setVolume( 1.f );
  ERRCHECK( result );
 }
 
 else if ( sound_name == "normal_bullet" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, fireSound, FALSE,  &channel );
  channel->setVolume( 0.5f );
  ERRCHECK( result );
 }
 
 else if ( sound_name == "user_laser" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, laserSound, FALSE,  &channel );
  channel->setVolume( 0.5f );
  ERRCHECK( result );
 }
  
 else if ( sound_name == "destroy" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, DestroySound, FALSE,  &channel );
  channel->setVolume( 0.25f );
  ERRCHECK( result );
 }

 else if ( sound_name == "explosion_sound" )
 {
  result = System->playSound( FMOD_CHANNEL_FREE, explosionSound, FALSE,  &channel );
  channel->setVolume( 1.f );
  ERRCHECK( result );
 }

}

이렇게 사운드를 재생해주는 함수에서 재생을 해 줍니다.

 

위 코드를 보면 chnnel->setVolume( 1.f );

이렇게 되어있습니다. 괄호안의 수치는 0.1f부터 1.0까지 수치를 주면 됩니다.

당연한 말이지만 수치가 크면 클수록 사운드의 크기도 커집니다. 프로젝트 안의 옵션중에 사운드 크기를 조절하는 기능을 추가할려면 저 안의 수치에 변수를 두면 좋겠죠^^.

 

에레체크는 항상 해 줍시다. 항상입니다. 항상~~~


[출처]
 FMODEX (SOUND_LIBRARY) FMOD DLL 다운 및 오류 수정.|작성자 파란

반응형
Posted by blueasa
, |