본문 바로가기

Programming/Mobile

안드로이드 SoundPool(사운드 풀)로 효과음 내기


안드로이드에서 효과음과 배경음을 내는데 필요한 SoundPool 이라는 것의 사용법을 살펴봅니다.


안드로이드 프로그래밍에서 소리를 낼 수 있는 방법은 많은데요, 대표적으로 MediaPlayer를 사용 할 수 있습니다.

그런데, 게임이나 기타 앱에서 특정 행동에 따른 효과음 또는 배경음(BGM)으로 사용하려고 할때에는

타이밍 이슈가 있을 수 있습니다. 다시말해 정확한 그 시점에 준비된 소리가 나는것에 대한 이슈가 있습니다.

이름에서 풍기는것과 같이 필요한 사운드를 미리 로드해놓고 필요할때 출력만 하겠다는 것입니다.


이것을 해결하기 위해 있는 API가 android.medial.SoundPool 입니다.

순차적으로 사용법을 알아 보겠습니다.


1. SoundPool  생성


SoundPool sound = new SoundPool(1, AudioManager.STREAM_ALARM, 0);// maxStreams, streamType, srcQuality


생성자 파라미터는 maxStreams, streamType, srcQuality 순입니다.

  • maxStreams는 미리 로드할 사운드의 스트림의 갯수입니다. 여기서는 1개만 해봤습니다.

만약 총소리와 대포소리를 사용할 거라면 2개로 해야하는 식입니다.

  • streamType은 AudioManager의 상수로 정의된 값을 사용합니다. 게임인 경우 AudioManager.STREAM_MUSIC을 보통 사용합니다.
  • srcQuality는 품질을 위한 샘플링 율을 의미하는데요, default는 0입니다.


2. 사운드 로드

int soundId = sound.load(this, R.raw.siren, 1);


이제 준비된 SoundPool에 사운드를 하나씩 로드해 봅니다.

load() 메서드를 호출할때 첫번째 파라미터는 Context 객체입니다. 여기서는 Activity에서 호출했다는 가정에서 this가 전달되었습니다.

두번째 파라미터는 로드하고 싶은 음원 리소스 아이디를 전달하면 됩니다. 여기서는 "res/raw/siren.mp3" 가  저장되어 있다고 가정하였습니다.

마지막 파라미터는 우선순위인데, API문서에도 별다른 영향이 없다고 되어 있는데, 나중을 위해서 1을 전달하라고 되어있습니다.

이렇게 load()함수를 호출하면 soundId를 정수로 반환해 줍니다.

나중에 이 사운드를 지칭하려고 할때 이 아이디가 필요하니까 변수에 저장해 놓습니다.

만약 여러개의 효과음이나 배경음을 사용할 생각이라면 이 코드는 그 만큼 반복해서 호출해야 할것입니다.


3.  사운드 플레이(재생)

이제 필요한 시점에 원하는 효과음을 낼 차례입니다.

int streamId = sound.play(soundId, 1.0F, 1.0F,  1,  -1,  1.0F);

play()메서드를 이용해서 소리를 출력합니다.

파라미터는 순서대로 soundId, leftVolum, rightVolum, priority, loop, rate 입니다.

  • soundID는 앞서 load() 메서드를 호출하고 얻은 결과값으로 어떤 음원을 출력할것인지를 가리킵니다.
  • leftVolumn과 rightVolumn은 말 그래도 소리 크기 입니다. data Type이 float타입인지라 리터럴 뒤에 F를 붙인것 뿐입니다.
  • min :0.0~ max :1.0을 이용해서 볼륨을 조절할 수 있습니다.
  • priority 는 우선순위입니다. 거의 동시에 소리를 출력해야 할 경우 우선 순위를 주는 것인데, 0이 가장 낮은 우선순위입니다.
  • loop 는 반복횟수를 정수로 지정하면 됩니다. 0은 반복하지 않음을 의미하고 -1은 무한 반복을 의미합니다.
  • 마지막 rate는 재생속도 입니다. 기본 속도가 1.0이고 필요에 따라 0.5~ 2.0 사이의 값을 넣어서 느리고 빠른 속도로 재생할 수 있습니다.

메서드의 반환값은 streamID인데, 이것은 중지를 위해서 필요하니까 변수에 저장해 놓아야 합니다.


4. 사운드 중지(stop)

이제 재생 중인 사운드를 중지해야 할 차례입니다.

sound.stop(streamId);


stop() 메서드를 호출하는 것으로 간단히 재생하고 있는 소리를 멈출 수 있습니다.

이때, play() 메서드의 반환값으로 얻은 것입니다.



이것으로 SoundPool API 사용법을 알아 보았습니다.

이 글을 보신 분들은 배경음악이나 효과음악으로 사용할 음원이 필요할 경우가 많을 텐데요.

제가 제작한 싸이렌 소리 효과음 하나만 첨부 합니다.

제가 배경음악을 제작해서 무료로 배포하면 좋겠습니다만 (하루 빨리 그랬으면 좋겠습니다)

그럴 여력이 없으니 충고만 하나 드리자면 음원을 함부로 가져다 쓰면

실컷 일해놓고 남 좋은 일만 시킬 경우가 많으니 조심하시기 바랍니다.


구글에서 무료 효과음 또는 배경음으로 검색하시면 많이 나오는데요,

무료 진위를 판단하는 것을 제가 할 수없는 지라 링크는 따로 걸어 드리지 않겠습니다.