OpenAL sound class

OpenAL기반의 sound class와 soundnode class 추가
-기존 oglclass의 sound class 변경 (하나의 사운드 담당)
-soundnode class 추가
+BackgroundMusic class (배경음) 한번/반복/루프모드에 따라 플레이
+EnvironmentSound class (환경음) 일정시간이 지나면 랜덤플레이
+LocalEffectSound class (지역음) 지정한 지역근처에 가면 플레이
-지역음은 반드시 camera class하고 같이 사용해야 함!

// sound 객체 초기화
camera camera1(45, 1, 1.0f, 1000.0f);
Sound sounds;
Sound sounds2;
BackgroundMusic bgm;
EnvironmentSound ambientsound;
LocalEffectSound localsound1(&camera1);
LocalEffectSound localsound2(&camera1);

// createScene에서 사운드 정의
void createScene(node & root)
{
// 중간생략..

// 기존의 sound class 사용방법
ALfloat sourcePos1[] = { 10., 2., 5.};
ALfloat sourceVel1[] = { 0., 0., 0.};
ALfloat sourcePos2[] = { -20., 2., 5.};
ALfloat sourceVel2[] = { 0., 0., 0.};
sounds.setSoundSource(“data/sound/stereo.wav”, sourcePos1, sourceVel1, 0.5f, AL_TRUE);
//sounds.play(); // background sound play
sounds2.setSoundSource(“data/sound/click.wav”, sourcePos2, sourceVel2, 1.0f, AL_FALSE);


// 배경음 – 리스트에 음악을 계속 루프해서 플레이
bgm.addSoundFile(“data/sound/BGM/네오+시티.wav”);
bgm.addSoundFile(“data/sound/BGM/엘린+숲.wav”);
bgm.addSoundFile(“data/sound/BGM/무릉.wav”);
bgm.setMode(BackgroundMusic::LOOP);
bgm.setVolume(0.2f);


// 환경음 – 2초가 지나면 리스트에서 랜덤하게 사운드를 하나 선택해서 플레이
ambientsound.addSoundFile(“data/sound/Env/Beetle Movement.wav”);
ambientsound.addSoundFile(“data/sound/Env/songbird1.wav”);
ambientsound.addSoundFile(“data/sound/Env/Purple Sandpipers Chirping.wav”);
ambientsound.addSoundFile(“data/sound/Env/Frog Croaks.wav”);
ambientsound.addSoundFile(“data/sound/Env/Forest Cicadas.wav”);
ambientsound.setTime(2000.0f);
ambientsound.setVolume(0.5f);


// 지역음 – 해당지역에 가면 사운드가 플레이
localsound1.addSoundFile(“data/sound/LocalEffect/water.wav”);
localsound1.setPosition(sourcePos1);
localsound2.addSoundFile(“data/sound/LocalEffect/Bee.wav”);
localsound2.setPosition(sourcePos2);
localsound2.setAttenuate(20.0f);
}

// 이벤트에 따른 사운드 플레이
void keyboard(unsigned char key, int x, int y)
{
// 중간 생략
case ‘s’:
sounds2.play();
break;
}

// 지정한 사운드 이벤트에 따른 사운드 플레이
void update()
{
g_CurrentTime = timeGetTime();
g_DeltaTime = g_CurrentTime – g_PreviousTime;
g_ElapsedTime = (float)(g_DeltaTime * 0.001);
g_PreviousTime = g_CurrentTime;

// 사운드 업데이트
bgm.update(g_DeltaTime);
ambientsound.update(g_DeltaTime);
localsound1.update(g_DeltaTime);
localsound2.update(g_DeltaTime);
}