Android Button Click Sound with SoundPool

사용 버전: Android Studio 4.1.1
사용 언어: Kotlin 1.4.21

안드로이드 Button Click Sound with SoundPool을 알아보겠습니다.



안드로이드 버튼을 클릭했을 때 특정 소리가 나오도록 할 수 있습니다.
MediaPlayer 클래스를 사용하거나, 오늘 사용할 SoundPool을 사용하는 방법입니다.
MediaPlayer와 SoundPool의 차이점은 재생될 음악 파일의 크기, 재생 시간과 즉각적인 반응 여부입니다.

MediaPlayer의 경우, 큰 파일과 긴 재생시간과 클릭 후 재생되기까지의 시간이 걸려도 상관없는 작업에 적합합니다.
SoundPool의 경우, 작은 파일(1MB 이하 권장)과 짧은 재생 시간과 클릭 시 바로 재생되어 소리가 나오는 작업에 적합합니다.

그 이유는 MediaPlayer의 경우 재생이 될 때 불러와지는 방식이고, SoundPool의 경우 미리 메모리에 올려놓고 필요할 때 재생하기 때문입니다.

따라서, 버튼에는 SoundPool이 적합합니다.


res - New - Android Resource Directory를 누릅니다.





raw를 선택하고 OK를 누릅니다.







raw에 재생할 음악 파일을 넣습니다.

저는 flac 확장자를 가진 음악파일을 사용했습니다.







버튼이 있는 Kotlin 파일로 갑니다.

AudioAttributes를 만듭니다.



Usage와 Type은 SONIFICATION로 설정합니다.

이렇게 설정하면 음악 볼륨이 아닌, 휴대폰 알림 볼륨으로 크기를 조절하게 됩니다.








이것을 SoundPool에 넣어줍니다.

MaxStreams는 soundPool로 재생할 음악의 목록입니다. 저는 4 개의 파일을 사용하기 때문에 4로 넣었습니다.









이 soundPool을 사용하기 위해서는 load를 해줍니다.

R.raw.up_click은 raw에 넣은 확장자를 제외한 파일 이름입니다.

priority는 아무 기능이 없습니다. 1 넣어주세요.










이제, 버튼을 눌렀을 때 재생 되게 만듭니다.

play를 사용합니다.

위에서 load 한 upSound가 들어가고, 왼쪽 볼륨 1f (0.0 ~ 1.0 사이), 오른쪽 볼륨 1f (0.0 ~ 1.0 사이), priority는 두 개의 음악이 중첩될 때 우선순위를 나타냅니다.(0이 가장 낮은 우선순위)

loop는 0은 1 번, 1은 2 번, 10은 11번 이런 식으로 반복 재생됩니다.

rate는 0.0~2.0까지 사용되며 재생 속도를 나타냅니다. 2.0은 2 배 빠르기로 재생되겠죠?








그리고, 마지막으로 사용을 완전히 마친 때에는 메모리에 올려진 것을 제거해 줘야 합니다.

SoundPool.release()를 사용합니다.









이제 실행해 봅시다!!

실행하면 앱이 종료되면서 오류가 나옵니다.

'android.content.res.Resources$NotFoundException: File res/raw/up_click.flac from resource ID #0x7f110003'


넣은 파일을 찾을 수 없다는 오류인데요.

앱이 빌드 되면서 음악 파일을 압축해버리는 바람에 생기는 일입니다.

음악 파일을 압축하지 못하게 설정해 줘야 합니다.



앱 용 build.gradle로 갑니다.

android {} 안에 aaptOptions를 적어줍니다.

noCompress 뒤에 오는 글자는 여러분의 음악 파일의 확장자를 넣어줍니다.

저는 '.flac' 확장자기 때문에 flac를 적어주었습니다.




Sync Now 합니다.




실행해 볼까요?

사진이라 소리를 들려드릴 순 없지만, 버튼을 누를 때 소리가 잘 나옵니다.






끝.


카테고리: Android


댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

Python bytes.fromhex()

Android Minimum touch target size

tensorflow tf.random.uniform()

tensorflow tf.expand_dims()

KiCad 시작하기 2 (PCB 만들기)

Forensics .pyc 파일 .py로 복구하기

Android Java 8+ Api desugaring

Android Notification with Full Screen