본문 바로가기
Android 개발/Android

SoundPool 이용해서 다양한 사운드(효과음) 재생하기 #Android

by Developer88 2019. 11. 5.
반응형

안드로이드 앱을 개발하면서 동시에 여러가지 사운드를 플레이해야하는 경우가 있습니다.

이럴때는 mediaPlayer클래스를 사용하기보다는,

SoundPool클래스를 사용해야 하는데요.

 

오늘은 이 SoundPool 클래스에 대해서 정리해 보도록 하겠습니다.

 

1. SoundPool 클래스

SoundPool클래스는 여러개의 음원을 미리 로딩해 놓고,

필요한 시간에 각각을 혹은 동시에 재생시킬 수 있는 장점이 있는 Class입니다.

이러한 장점때문에 아무래도 게임앱의 효과음이나 배경음을 재생하는데 많이 사용되는데요.

그럼 객체를 생성하는 방법부터 하나씩 알아보도록 하겠습니다.

 

1-1. 객체 생성

SoundPool클래스의 객체를 가져오기 위해서는 아래와 같이 해주면 되는데요.

Lollopop이후 버전과 아닌 버전과는 서로 다르게 해주어야 합니다.

큰 차이는 Builder함수를 이용하느냐 아니냐의 차입니다.

 

주의해야 할 것은 setMaxStreams()메소드의 인자 값 입니다.

여기서 얼마나 많은 음원을 동시에 컨트롤 할 지 정할 수 있는 것 인데요.

여기서는 2개로 하였습니다.

 

 

 

1-2. Load 메소드

 

이제 이렇게 생성한 soundPool객체의 load메소드를 이용해서,

사운드 리소스를 load해 주어야 하는데요.

아래와 같이 해주면 됩니다.

인자로 들어가는 것중 priority는 나중에 쓰일 수 있으니, 우선 1로 할 것을 공식문서에서 권장하고 있습니다.

 

 

1-3. Play 메소드

 

이 리소스가 로드가 되면 play()함수를 이용해서 음원을 재생할 수 있는데요.

언제 load되는지 알려주는 리스너가 있으니 이를 이용하면 유용합니다.

바로 setOnLoadCompleteListener인데요.

준비가 되면 바로 재생되야 하는 경우 여기서 play함수를 이용해주면 됩니다.

 

play함수에 들어가는 인자들 중 몇가지만 보도록 하겠습니다.

loop -1인경우는 무한 반복이고, 0일 경우는 1회성 입니다.

또한, priority는 우선순위인데요. 0이 가장 낮습니다.

rate는 재생속도인데요. 재생속도를 조절하는 일은 그렇게 많지 않을 것 같네요.

 

 

play함수를 사용하면서 주의를 기울여야 하는 것이 있습니다.

그것은 play함수에 들어가는 인자로는 soundId가 쓰이고,

play함수가 리턴하는 값은 StreamId라는 것 인데요.

이 soundId와 streamId는 항상 같은 값을 가진다는 보장이 없기 때문에,

구분해서 쓰는 것이 좋아 보입니다.

 

1-4. pause, resume 그리고 stop

 

pause()나 resume() 그리고 stop()메소드를 사용할 때는 StreamId를 사용해 주어야 합니다.

참고로 soundPool은 MediaPlayer를 사용할 때처럼,

중지한 이후에 currentPosition을 따로 저장해서 사용하지 않아도,

알아서 pause한 위치에서 resume을 해 줍니다.

 

 

1-5. Release

리소스를 사용한 이후에는 항상 release를 해 주어야 겠지요.

MediaPlayer같이 release함수를 제공해 주고 있으니,

이를 이용해서 release해 주면 됩니다.

 

어떻게 API를 사용하는 가는 개발자들이 정하지만,

구글의 공식문서에서 나오는 예를 보면 다음과 같은데요.

유저가 하나의 레벨을 깨고 나면, release메소드를 호출해서 리소스를 모두 release해 줍니다.

유저가 다음 레벨의 게임을 실행할 경우, 새로운 SoundPool을 생성해서,

sound들을 로딩시킨 후 플레이하는 방식의 구성을 보았

 

2. 정리

MediaPlayer와는 조금은 사용법이 다르기 때문에,

streamId의 사용이나 load에 대한 리스너를 사용하는 부분 등

주의를 기울여야 하겠네요.

 

SoundPool클래스와 관련된 정보는 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

댓글0