퉁탕퉁탕 만들어보자

SoundPool을 활용해서 sound 효과 주기 본문

Computer/Android

SoundPool을 활용해서 sound 효과 주기

호숀티 2022. 7. 29. 00:44
반응형

https://developer.android.com/reference/android/media/SoundPool

 

SoundPool  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

audio resource를 재생하는데 사용되는 SoundPool을 알아보자.

MediaPlayer에 비해 사용이 단순하나, memory상에 sound를 predecode해놓고 사용하기 때문에, 효과음과 같은 짧은 음원을 재생할 때 사용해아한다. 긴 음원은 MediaPlayer를 사용해야한다.

각각의 decode된 sound는 1MB로 limit되어있다. (품질에 따라 다르지만,, 약 5~6초 정도)

SoundPool은 APK 내부의 리소스나, 파일 시스템의 파일에서 사운드를 디코드해서 메모리에 로드해놓고 사용한다.

여러개의 sound를 한꺼번에 load해서 id를 가지고 재생/퍼즈를 손쉽게 할 수 있다.

 

 

아래의 순서대로 작업한다.

0. 미리 다운로드 한 음원을 /res/raw 밑에 넣는다.

 

1. SoundPool 생성

 private val soundPool = SoundPool.Builder().build()

SoundPool.Builder()를 통해서 생성한다.

 

developer사이트를 보면 생성할 때 줄수있는 옵션이 있는데,

AudioAttributes를 설정해 줄수 있는(어떤 타입인지- 알람인지, 게임인지 등등) setAudioAttributes()도 있고,

(참고: https://developer.android.com/reference/android/media/AudioAttributes#USAGE_ALARM)

동시에 재생할 수 있는 효과음의 갯수를 set 해주는 setMaxStreams() API도 있으니 필요에 따라 사용하면 된다.

 

2. 소리 파일을 load한다.

val bellSoundId = soundPool.load(this, R.raw.timer_bell, 1)

load() API는 argument에 따라 여러개이니 developer사이트를 참조하자

간단하게는 resource path와 priority만 int값으로 넣어주면 된다.

https://developer.android.com/reference/android/media/SoundPool#load(java.lang.String,%20int)

*하지만, 지금 현재 priority값은 쓰이고 있지 않으나 compatibility를 위해서 1을 넣으라고하니, 이렇게하면된다

return값은 soundId를 리턴해주는데, 이 ID를 가지고 soundPool에서 play/pause하는데 사용된다.

 

load는 async 함수이기 때문에 setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener)

를 통해서 load완료에 대한 listener를 등록해서 사용가능하다.

 

3. play()

bellSoundId?.let {
    soundPool.play(it, 1F, 1F, 0, 0, 1F)
}

play는 argument가 많으니 보자..

public final int play (int soundID, 
                float leftVolume, 
                float rightVolume, 
                int priority, 
                int loop, 
                float rate)
soundID load() 에서 얻은 리턴값인 soundId 사용
좌/우의 볼륨  0.0~1.0 
priority 0이 제일 낮고, 숫자가 클수록 높다.
만약에 maxStream 개수 이상의 stream을 동시재생할때, 우선순위가 낮은것이 정지된다.
loop  0은 한번재생,1은 2번 재생이다. -1은 무한반복
rate  재생배속 (1.0이면 1배속 0.5~2.0)

 

4. autoPause / autoResume

soundPool.autoPause()
soundPool.autoResume()

soundPool에는 좋은게 있는데 soundId를 가지고 하나씩 pause(), resume()을 할수도 있지만.

autoPause를 통해서 현재 재생되고 있는 모든 stream을 일시정지하고 ( onPause()에서 사용하면 좋음! )

그리고, autoResume을 통해서 저번에 autoPause로 pause된 음원을 전부 다시 재생한다. (onResume에서 사용하면 좋음!)

 

5. release()

soundPool.release()

릴리즈를 통해 memory에 있는 sound resource들을 해제한다.

더이상 사용하지 않을거라면 soundPool 객체에 null을 할당하는것도 괜찮다.

특별한 시점이 없다면 onDestroy()에서 수행한다.

728x90
반응형

'Computer > Android' 카테고리의 다른 글

Elevation이 안 먹을때  (0) 2022.07.29
앱 권한 요청하기  (0) 2022.07.29
ImageButton Ripple 주기  (0) 2022.07.29
Android broadcast 수신  (0) 2022.05.09
Android Webview Javascript interface  (2) 2022.05.08