개발 공부/안드로이드

andrid SoundPool 음성파일/효과음 재생

yong_DD 2022. 7. 3. 15:37

SoundPool을 사용하면 간단하게 음성파일(효과음)을 재생할 수 있다.

메모리에 로드하여 사용하기 때문에 용량은 크지 않는게 좋다.

1. 음성 파일 등록

음성 파일을 res에 New Resource Directory - raw파일을 추가해서 이 raw파일 안에 음성 파일을 넣는다.

2. 코드 (kotlin)

//sound pool build 해서 load 시킴 (기본 준비)
private val soundPool = SoundPool.Builder().build()

//load 할 때 sound id가 리턴으로 옴
var soundId = soundPool.load(this, R.raw.your_video_name, 1)

// play
soundPool.play(soundId, 1f, 1f, 0, -1, 1f)

// stop
soundPool.autoPause()

// resume
soundPool.autoResume()

// release(더 이상 사용하지 않을 때)
soundPool.release()

 

2-1 SoundPool.Builder

* setAudioAttributes (오디오에 대한 정보 설명, 지정 - 스트림 유형 전달)

val audioAttr =  
            AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build()

val soundPool = SoundPool.Builder()
            .setAudioAttributes(audioAttr)
            .build()

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

 

AudioAttributes  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

- setMaxStreams(동시에 재상할 수 있는 최대 동시 스트림 수) - 1보다 큰 값(Int)

   val soundPool = SoundPool.Builder()
            .setMaxStreams(2)
            .build()

 

2-2 play

public final int play (int soundID, 
                float leftVolume, 
                float rightVolume, 
                int priority, 
                int loop, 
                float rate)
soundID
load시 리턴 받았던 아이디 값
leftVolume
왼쪽 볼륨 0.0(최소) ~ 1.0(최대)
rightVolume
오른쪽 볼륨 0.0(최소) ~ 1.0(최대)
priority
우선 순위 (0이 최소)
loop
무한 반복이 -1, 반복 없음이 0
rate
재생 속도(기본 1.0, 범위 0.5~2.0)

 

2-3 resume / stop

- autoResume()/autoPause() 이전에 활성화된/활성화 되어있는 모든 스트림을 재시작/멈춤

- 리턴받은 id를 통한 resume(int streamId)/ stop(int streamId)

// stop
soundPool.autoPause()
soundPool.stop(soundId)

// resume
soundPool.autoResume()
soundPool.resume(soundId)

 

2-4 onLoadCompleteListener

플레이를 했으나 로드가 아직 안된 경우 나오지 않을 수 있다. 그런 경우를 대비해 로드가 완료 되었는지 확인할 때 필요한 리스너이다.

soundPool.setOnLoadCompleteListener { soundPool, sampleId, status ->  }

// sampleId - load된 soundId 
// status (0 = success)