(CGP) 4장. 사운드

 

[학습 목표]

 

FMOD 사운드 시스템을 다운로드 받아 설치와 경로 설정을 할 수 있다.

FMOD 사운드를 이용하여 사운드를 출력할 수 있다.

FMOD 사운드 시스템을 이용한 MP3 플레이어를 프로그래밍할 수 있다.

 

 

01 FMOD 소개 및 설치

02 FMOD 라이브러리 및 헤더 경로 등록

03 프로젝트에 FMOD 사운드 라이브러리 설정

04 FMOD 사운드 DLL 파일 복사

05 FMOD 사운드 프로그래밍

 

 

 

 

 

 

분노2유튜브 동영상 강의 주소

 

(1) http://youtu.be/B3Bv4kUSi0Y
(2) http://youtu.be/F32Q1SK8MKk

 

 

 


 

01 FMOD 소개 및 설치

 

FMOD 사운드 시스템은 www.fmod.org 에서 무료로 다운받을 수 있다.

이 사이트에는 다운받을 수 있는 여러 버전이 있지만 Stable 항목의 최신 버전을 받도록 한다. 또한 OS 버전에 따라 각기 다른 FMOD를 설치하게 되어 있지만 윈도우 XP와 Vista, 윈도우7 32비트/64비트는 모두 ‘FMOD 사운드 시스템 32비트’ 를 받아서 설치하면 된다.

 

 

 커피한잔해 현재(2013년 5월 21일)를 기준으로 윈도우8 이 출시되어 있습니다.

FMOD가 윈도우 8용도 있지만 테스트를 해 보지 못한 상태여서 등록 라이브러리와 경로가 약간 달라지는 점을 감안하고

FMOD를 사용하시기 바랍니다. 윈도우 8 에 대한 내용은 차후에 테스트하여 업로드 하겠습니다.

현재 게임 엔진 중에서 유니티(Unity) 게임 엔진 FMOD를 사용하고 있습니다. 

 

 

 

 

FMOD 사운드 시스템을 설치하게 되면 기본적으로 [그림 4-1]과 같이 설치된다. 이 폴더 안에는 FMOD 사운드 시스템에 대한 각종 샘플과 도움말이 있으므로 이 내용을 참조하여 프로그래밍하면 된다.

 

[그림 4-1] 윈도우 XP, Vista, 윈도우7 32비트 설치 경로

 

윈도우7 64비트 OS는 [그림 4-1]의 Program File 폴더가 아닌 Program Files(x86)폴더 안에 FMOD 사운드 시스템이 설치된다.

위의 [그림 4-1] documentation 폴더 안에 있는 fmodex.chm 파일에는 FMOD 사운드 시스템에 관한 사용 방법과 함수에 대한 자세한 설명이 나와 있다.

 

 

[그림 4-2] FMOD 설명 파일 (fmodex.chm): 해당 파일명은 제작사의 의도에 따라 변동될 수 있다.

 

 


 

02 FMOD 라이브러리 및 헤더 경로 등록

 

FMOD 사운드 시스템을 사용하기 위해서는 FMOD 라이브러리와 헤더를 프로그래밍 툴에 등록해야 한다.

 

Visual Studio 6.0 (Visual C++ 6.0)

 

[그림 4-3] 헤더 파일과 라이브러리 경로 등록

 

Visual Studio 2008

 

[그림 4-4] 헤더 파일과 라이브러리 경로 등록

 

 

Visual Studio 2010

 

Visual Studio 2008에서 헤더와 라이브러리 설정은 [도구]->[옵션]->[프로젝트 및 솔루션]->[VC++ 디렉토리]에서 설정했지만 Visual Studio 2010은 프로젝트를 생성한 후에 [그림 4-5]와 같이 프로젝트 속성에서 헤더와 라이브러리를 설정한다.

 

[그림 4-5] 헤더 파일과 라이브러리 경로 등록

 

 


03 프로젝트에 FMOD 사운드 라이브러리 설정

 

이제 FMOD 사운드 라이브러리 fmodex_vc.lib 파일을 프로젝트 생성 후에 아래와 같이 설정해 보자. (참고: fmodex_vc.lib 파일명은 fmod 제작회사의 변동에 따라 바뀔 수 있다)

 

Visual Studio 6.0 (Visual C++ 6.0)

 

[그림 4-6] FMOD 사운드 라이브러리 설정

 

Visual Studio 2008

[그림 4-7] FMOD 사운드 라이브러리 설정

 

Visual Studio 2010

 

[그림 4-8] FMOD 사운드 라이브러리 설정

 

 


04 FMOD 사운드 DLL 파일 복사

 

fmodex.dll 파일은 FMOD 사운드 시스템이 실행될 때 사용되는 파일로써 프로그램의 실행 파일과 함께 있어야 한다.

[표 4-1]은 fmodex.dll 파일이 있는 폴더의 위치이다.

(참고: fmodex.dll 파일 경로는 fmod 제작 회사의 변동에 따라 바뀔 수 있다 )

 

 

OS

경로

윈도우XP, Vista 윈도우7 32비트

C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\api

윈도우7 64비트

C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Win32\api

 

[표 4-1] fmodex.dll 파일 경로

 

 


05 FMOD 사운드 프로그래밍

 

FMOD를 이용하여 다음과 같은 순서로 프로그래밍 한다.

 

■ FMOD 시스템의 기본 설정과 초기화

 

FMOD 사운드 함수를 사용하기 위해서는 먼저 헤더 파일을 선언해야 한다.

 

 

#include <fmod.h>

 

[소스 4-1] FMOD 헤더 선언

 

헤더 파일에 < >을 사용할 수 있는 것은 헤더 파일의 경로를 프로그래밍 툴에 등록했기 때문이다.

 

FMOD 시스템을 생성하기 위한 초기화는 아래와 같다.

 

 

FMOD_SYSTEM       *g_System;  // FMOD system 변수 선언

 

[소스 4-2] FMOD 사운드 시스템 변수 선언

 

FMOD 시스템은 FMOD_SYSTEM으로 선언된 포인터 변수를 통해 다루어진다.

특히 FMOD_SYSTEM 포인터 변수는 다른 함수에서도 자주 사용되므로 전역변수로 선언한다.

 

 

FMOD_System_Create(&g_System); // FMOD system 객체 생성

FMOD_System_Init( g_System, 32, FMOD_INIT_NORMAL,  NULL); // FMOD system 초기화

 

[소스 4-3] FMMOD 생성 및 초기화

 

FMOD 시스템은 FMOD_System_Create() 함수를 통해 생성되며 FMOD_System_Init() 함수에 의해 초기화된다.

여기서는 기본 설정으로 초기화하는 것이므로 위와 동일하게 설정한다.

 

 

FMOD_RESULT FMOD_System_Create(

  FMOD_SYSTEM **  system

);

FMOD_RESULT FMOD_System_Init(

  FMOD_SYSTEM *  system,

  int  maxchannels,

  FMOD_INITFLAGS  flags,

  void *  extradriverdata

);

 

[표 4-2] FMOD 사운드 시스템 함수의 원형

 

■ 사운드 로딩 및 객체 생성

 

FMOD에서 출력할 수 있는 사운드 파일 형식은 [표 4-3]과 같다.

 

 

AIFF, ASF, ASX, DLS, FLAC, FSB, IT, M3U, MID, MOD, MP2, MP3, OGG, PLS, RAW, S3M, VAG, WAV, WMA, XM, XMA

 

[표 4-3] 출력 가능한 사운드 파일 형식

 

사운드를 출력하기 위해서는 사운드마다 각각의 사운드 객체를 대응시켜야 하는데, 이것을 위한 변수 선언과 함수는 다음과 같다.

 

 

FMOD_SOUND  *sound;

 

[소스 4-4] FMOD 사운드 선언

 

사운드는 FMOD_SOUND 포인터 변수로 다루며 사운드와 일대일 대응된다.

만약 사운드 파일이 10개 있다면 FMOD_SOUND 포인터도 10개가 있어야 한다.

그리고 프로그램이 종료될 때까지 사용되는 사운드가 있다면 해당 FMOD_SOUND 포인터 변수는 static 또는 전역 변수로 선언해야 한다.

 

 

FMOD_System_CreateSound( g_System, “파일경로 및 파일명", FMOD_DEFAULT , 0, &sound);

 

[소스 4-5] 사운드 파일 로딩

 

FMOD_System_CreateSound() 함수의 3번째 매개변수에는 다양한 옵션을 설정할 수 있지만 여기에서는 두 가지만 소개한다. 나머지 옵션에 대해서는 Help 파일(fmodex.chm)을 참고하여 보자. FMOD_DEFAULT는 사운드를 한번만 출력하는 값으로 주로 효과 사운드(effect sound)를 출력할 때 설정한다.

FMOD_LOOP_NORMAL은 사운드를 반복적으로 출력할 때 설정하며 주로 배경 사운드(background sound)를 출력할 때 설정한다.

 

 

FMOD_MODE

역할

FMOD_DEFAULT

FMOD_LOOP_OFF | FMOD_2D | FMOD_HARDWARE의 설정과 같으며 사운드를 1번만 출력한다.

FMOD_LOOP_NORMAL

사운드를 반복적으로 출력한다.

 

[표 4-4] FMOD 사운드 출력 모드

 

 

FMOD_RESULT FMOD_System_CreateSound(

  FMOD_SYSTEM *  system,

  const char *  name_or_data,

  FMOD_MODE  mode,

  FMOD_CREATESOUNDEXINFO *  exinfo,

  FMOD_SOUND **  sound

);

 

[표 4-5] FMOD 함수의 원형

 

■ 사운드 출력

 

사운드 객체(FMOD_SOUND *sound)를 통해 읽혀진 사운드는 채널(channel)을 통해 출력된다. 따라서 하나의 사운드 파일은 여러 개의 채널을 통해 출력할 수 있다.

 

 

FMOD_CHANNEL *channel;

 

[소스 4-6] 채널 선언

 

채널은 FMOD_CHANNEL 포인터 변수로 선언하며 채널을 통해 사운드를 출력 및 정지시킬 수 있다. 그러므로 효과 사운드를 출력하는 경우에는 채널을 지역 변수로 선언할 수 있지만 배경 사운드를 출력하는 경우에는 static 또는 전역 변수로 선언해야 한다.

 

 

FMOD_System_PlaySound( g_System, FMOD_CHANNEL_FREE, sound, 0, &channel);

 

[소스 4-7] 사운드 출력

 

사운드는 FMOD_System_PlaySound() 함수에 의해 채널을 통해 출력되며 이 함수는 사운드 출력이 끝날 때까지 함수 안에서 대기하지 않는다.

 

 

FMOD_RESULT FMOD_System_PlaySound( 

  FMOD_SYSTEM *  system,

  FMOD_CHANNELINDEX  channelid,  

  FMOD_SOUND *  sound,  

  FMOD_BOOL  paused,

  FMOD_CHANNEL **  channel);

 

[표 4-6] FMOD 함수의 원형

 

■ 사운드 출력 정지

 

아래의 함수를 사용하면 채널을 통해 출력 중인 사운드를 언제든지 정지시킬 수 있다.

 

 

FMOD_Channel_Stop( channel );

 

[소스 4-8] 사운드 출력 정지

 

 

FMOD_RESULT FMOD_Channel_Stop(

    FMOD_CHANNEL *  channel);

 

[표 4-7] FMOD 함수의 원형

 

■ 사운드 출력 확인

 

FMOD_Channel_IsPlaying() 함수는 채널을 통해 사운드가 출력되는지를 확인하는 함수이다. 사운드 출력 상태는 isplaying 값이 1이면 사운드가 출력 중이며 그 외의 값은 대기 또는 준비 상태를 의미한다.

 

 

FMOD_Channel_IsPlaying(  FMOD_CHANNEL *  channel,  FMOD_BOOL *  isplaying);

 

[소스 4-9] 사운드 출력 확인

 

위의 함수에서 주의 깊게 살펴봐야 하는 것은 사운드 상태를 확인하기 위해서 사운드를 설정하는 것이 아니라 사운드를 출력하고 있는 채널을 설정한다는 것이다. 그래서 채널을 선언할 때는 변수의 사용 범위(지역, 전역, static) 설정에 신중해야 한다.

 

 

FMOD_RESULT FMOD_Channel_IsPlaying(

  FMOD_CHANNEL *  channel,

  FMOD_BOOL *  isplaying);

 

[표 4-8] FMOD 사운드 시스템 함수의 원형

 

■ 볼륨 조절

 

볼륨 조절은 아래 함수의 volume 변수로 조절하며 볼륨 범위는 0.0f부터 1.0f까지이다.

 

 

FMOD_Channel_SetVolume( FMOD_CHANNEL *  channel, float  volume );

 

[소스 4-10] 볼륨 조절

 

위의 함수에서 주의할 점은 볼륨 대상이 채널이라는 것이다.

 

 

FMOD_RESULT FMOD_Channel_SetVolume(  FMOD_CHANNEL *  channel,   float  volume);

 

[표 4-9] FMOD 함수의 원형

 

■ 출력 사운드의 데이터 갱신

 

FMOD를 이용하여 사운드를 출력하고 있는 상태에서는 계속적으로 아래의 함수를 호출해야 한다. 

 

 

FMOD_System_Update( g_System );

 

[소스 4-11] 출력 사운드의 데이터 갱신

 

이와 같이 해 주는 이유는, 사운드 파일을 한꺼번에 메모리에 읽어 출력하는 방식을 사용하는 것이 아니라 사운드 파일을 일정한 크기 단위로 매번 읽어 출력하는 스트리밍(streamming) 방식을 사용하기 때문이다.

만약 10M의 음원 파일을 스트리밍 방식이 아닌 방법으로 읽어 출력한다면 음원 파일 전부가 메모리에 로딩될 때까지 프로그램은 대기 상태로 있어야 할 것이다.

 

 

FMOD_RESULT FMOD_System_Update(  FMOD_SYSTEM *  system);

 

[표 4-10] FMOD 함수의 원형

 

■ FMOD 해제

 

FMOD 사운드 시스템을 해제하기 위해서는 먼저 FMOD 사운드를 해제한 후에 FMOD 사운드 시스템을 해제해야 한다.

왜냐하면 FMOD 사운드 시스템에 의해 FMOD 사운드가 생성되기 때문이다.

 

 

FMOD_Sound_Release(sound); // FMOD sound 객체 해제

FMOD_System_Close( g_System ); // FMOD system 객체 clsoe

FMOD_System_Release( g_System ); // FMOD system 객체 해제

 

[소스 4-12] FMOD 해제

 

 

FMOD_RESULT FMOD_Sound_Release(

     FMOD_SOUND *  sound);

FMOD_RESULT FMOD_System_Close(

     FMOD_SYSTEM *  system);

FMOD_RESULT FMOD_System_Release(

     FMOD_SYSTEM *  system);

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

[표 4-11] FMOD 함수의 원형

 

■ FMOD 기본적인 예

 

FMOD를 설치하게 되면 각종 소스가 [그림 4-9]의 경로에 있으므로 이 소스를 분석하여 게임이나 다른 프로그램에도 적용해 보자.

 

 

[그림 4-9] FMOD에 관한 예제 소스

 

[실습 예제 4-1]

 

 

사운드 파일 1개를 읽고 사운드 출력과 정지 및 소리 조절이 될 수 있도록 프로그램을 작성해 보자. p 키는 사운드 출력, s 키는 사운드 정지, u 키는 볼륨 높임, d 키는 볼륨 줄임 키이다.

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

#include <stdio.h>

#include <conio.h>

#include <fmod.h>

 

FMOD_SYSTEM *g_System;  // Note: FMOD system 변수선언

FMOD_SOUND  *g_Sound;

 

void Init()

{

     FMOD_System_Create(&g_System);

     FMOD_System_Init( g_System, 32, FMOD_INIT_NORMAL,  NULL);         

     FMOD_System_CreateSound( g_System, "run.wav", FMOD_DEFAULT, 0, &g_Sound);

}

 

void Release()

{

     FMOD_Sound_Release(g_Sound);

     FMOD_System_Close( g_System );

     FMOD_System_Release( g_System );

}

 

int main(void)

{       

    int nKey;

    FMOD_CHANNEL *channel = NULL;

    float volume = 0.5f;

    FMOD_BOOL IsPlaying;

        

     Init();

 

     while( 1 )  

     {

           if( _kbhit() )

           {

              nKey = _getch();

              if( nKey == 'q' )  // q 키가 눌리면 프로그램 종료

                 break;

 

              switch( nKey )

              {

               case 'p' :

                          FMOD_System_PlaySound( g_System, FMOD_CHANNEL_FREE, g_Sound,

                                                 0, &channel);

                          break;

               case 's' :

                          FMOD_Channel_Stop( channel );                               

                          break;

               case 'u' :

                volume += 0.1f;

                if( volume > 1.0f )

                    volume = 1.0f;

                FMOD_Channel_SetVolume( channel, volume );

                break;

             case 'd' :

                volume -= 0.1f;

                if( volume < 0.0f )

                    volume = 0.0f;

                FMOD_Channel_SetVolume( channel, volume );

                break;

               }

             }

 

           FMOD_Channel_IsPlaying( channel, &IsPlaying );

           if( IsPlaying == 1 )

              FMOD_System_Update( g_System );                               

    }

    Release();

    return 0;

}

 

[소스 4-13] 사운드 출력 예

 

31행은 키 입력값을 계속 검사해야 하므로 무한 반복문을 사용하고 있다.

그리고 반복문 안에는 키 입력 검사 부분과 사운드 출력 부분이 있다.

 

36행과 37행은 ‘q’ 키를 최우선적으로 처리하는 부분이다. 프로그램을 정상 종료하기 위해서는 FMOD 사운드 시스템에 대한 해제가 있어야 하므로 37행의 break문을 통해 while문을 벗어나면 67행의 Release()함수에 의해 FMOD 사운드 시스템과 사운드가 해제된다.

 

63행부터 65행까지는 사운드가 출력 상태인지를 확인한 후에 FMOD 업데이트를 결정하는 부분이다. IsPlaying의 값이 1이면 출력 상태이며 그외 값이면 비출력 상태이다.

 

[실습예제 4-2]

 

배경 사운드 1개와 효과음 1개를 읽고 's' 키 입력에 따라 효과음이 출력되도록 게임 프레임워크 안에서 프로그래밍해 보자.

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <time.h>

#include "Screen.h"

#include <fmod.h>

 

FMOD_SYSTEM *g_System;  // Note: FMOD system 변수선언

FMOD_SOUND  *g_Sound[2];

FMOD_CHANNEL *g_Channel;

 

void Init()

{

     FMOD_System_Create(&g_System);

     FMOD_System_Init( g_System, 32, FMOD_INIT_NORMAL,  NULL);         

     FMOD_System_CreateSound( g_System, "bgsound.wav", FMOD_LOOP_NORMAL, 0,

                                 &g_Sound[0]);

     FMOD_System_CreateSound( g_System, "safe.wav", FMOD_DEFAULT, 0, &g_Sound[1]);

     // 배경음 출력

     FMOD_System_PlaySound( g_System, FMOD_CHANNEL_FREE, g_Sound[0], 0,

                               &g_Channel);

}

 

void Update()

{

}

 

 

void Render()

{

     ScreenClear();

 

     ScreenFlipping();

}

 

void Release()

{

     int i;

     for( i =0 ; i < 2 ; i++ )

        FMOD_Sound_Release(g_Sound[i]); // FMOD sound 객체 해제

        

     FMOD_System_Close( g_System ); // FMOD system 객체 clsoe

     FMOD_System_Release( g_System ); // FMOD system 객체 해제

}

 

 

int main(void)

{

    int nKey;

    FMOD_CHANNEL *pChannel;

 

    ScreenInit();

    Init();

 

    while( 1 )

    {

        if( _kbhit() )

        {

            nKey = _getch();

              if( nKey == 's' )

               FMOD_System_PlaySound( g_System, FMOD_CHANNEL_FREE, g_Sound[1], 0,

                                          &pChannel);

        }

 

        Update();

        Render();         

        FMOD_System_Update( g_System );

    }

 

    Release();

    ScreenRelease();       

    return 0;

}

 

[소스 4-14] 배경음과 효과음 출력

 

배경음과 효과음을 출력할 때 배경음의 채널은 전역변수로 선언하고 효과음의 채널은 지역 변수로 선언한 이유는 게임이 종료될 때까지 배경음은 계속 출력되므로 10행과 같이 전역 변수형인 채널이 있어야 중지할 수 있다. 효과음은 일시적으로 채널을 사용하므로 50행과 같이 지역변수로 선언한다.

 

좋은하루강의가 도움이 되셨습니까? 손가락 꾸욱 눌러주는 센스 ~~ 

[출처] https://nowcampus.tistory.com/entry/4%EC%9E%A5-%EC%82%AC%EC%9A%B4%EB%93%9C?category=655340

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
108 [Xamarin] Xamarin.Forms. Android 실행/ 디버깅시에 에뮬리이터 배포오류 Why am I getting this error in Xamarin.Forms using Visual Studio? file 졸리운_곰 2021.12.01 22
107 [Xamarin] Visual Studio 2019 를 설치하고 Xmarin.forms 빌드시 에러 : I am just download and start Visual Studio (Xamarin Project). But there is an ERROR NU1101. file 졸리운_곰 2021.12.01 53
106 [게임개발] How to Create Smarter NPCs in Games file 졸리운_곰 2021.08.31 23
105 (CGP)16장. 탱크 게임 file 졸리운_곰 2021.06.28 802
104 (CGP) 15장. 탱크 맵툴 만들기 file 졸리운_곰 2021.06.28 225
103 (CGP) 14장 Sogo 게임 file 졸리운_곰 2021.06.28 21
102 (CGP)13장. 패턴 뷰어 file 졸리운_곰 2021.06.28 19
101 (CGP) 12장 Snake 게임 file 졸리운_곰 2021.06.28 23
100 (CGP) 11장 Snake 게임 툴 만들기 file 졸리운_곰 2021.06.28 51
99 (CGP) 10장. 하트담기 게임 file 졸리운_곰 2021.06.28 25
98 (CGP) 9장. 하트 툴 만들기 file 졸리운_곰 2021.06.28 24
97 (CGP) 8장. 벽돌깨기 게임 file 졸리운_곰 2021.06.28 48
96 (CGP)7장. 짝 맞추기 게임 file 졸리운_곰 2021.06.28 131
95 (CGP) 6장. 두더지 잡기 게임 file 졸리운_곰 2021.06.28 113
94 (CGP) 5장. 슛골인 게임 file 졸리운_곰 2021.06.27 151
» (CGP) 4장. 사운드 file 졸리운_곰 2021.06.27 78
92 (CGP) 3장. 게임의 기본 구조 file 졸리운_곰 2021.06.27 126
91 (CGP) 2장. 함수 file 졸리운_곰 2021.06.27 36
90 (CGP) 1장. C언어 file 졸리운_곰 2021.06.27 60
89 (CGP) 0장. C를 이용한 게임프로그래밍 강좌를 시작하기 전에 file 졸리운_곰 2021.06.27 173
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED