본문 바로가기

IT/Swift

[SWIFT] AudioServicesPlaySystemSound으로 효과음 재생하기

프로그램을 만들다보면 효과음이나 음악 재생은 필수라고 할수 있다.

왜냐하면, 피드백 즉 유저 경험이 중요하기때문이다.


만약 화면 이동 버튼을 눌렀을때를 가정해보자.

터치나 클릭을 하면 그냥 화면이 전환 되는것과 

효과음이나 버튼이 눌리는것과 같은 애미메이션이나 효과를 주고 전환되는것


버튼 본연의 기능인 화면 전환만 잘 이루어지면 장땡이라고 생각하실지 모르겠지만,

인간의 감각이란, RGB단 1 포인트에 어색함을 느끼고, 0.5픽셀에 레이아웃이 어그러짐에 답답해 한다.

버튼을 누르고 화면이 전환되는데 걸리는 시간이 0.2초라고 해도 

인간의 감각은 호락호락하지 않다. 


아무런 피드백이 없는 그 0.2초동안 의문점이나 답답함을 느낀다. 

내가 누른거야? 안누른거? 눌린거야? 안눌린거야?


그렇기때문에 피드백 즉 사용자 경험 또는 유저익스피어리언스는 대단히 중요한다고 할수 있다.

(타격감 없는 액션겜을 누가하겠는가?)


사설이 길었다




아무튼 swift에도 효과음을 재생하는 라이브러리가있는데, 보통 AVAudioPlayer를 많이 떠올린다.

문제는 전혀 없다. AVAudioPlayer로 효과음이나 음악등을 재생시킬수 있다.


하지만 오늘 제가 언급하려고 하는것은 AudioServicesPlaySystemSound이다. 

AVAudioPlayer는 보통 음악화일이라고 생각하면된다. 

일정이상의 크기의 화일을 로드해놓고 필요할때 재생할수 있다. 

소리도 조절할수도 있고, 재생 스피드도 조정할수 있다.


즉 미디어 플레이어라고 보면 된다.


그럼 AudioServicesPlaySystemSound은 뭐냐?

이놈은 아주 작은 효과음들을 재생할때 쓰인다. 

볼륨도 재생속도도 아무것도 조정할수 없다 그냥 재생만된다.

언뜻보기에는 안좋은거처럼 보이지만,


기능이 적다는건 그만큼 가볍다는 것을 의미한다. 

아까도 언급했지만 인간의 감각은 엄청나게 민감하다. 

단 0.1초가 딜레이되면 어색함을 느낀다. 

그렇기때문에 즉시 인스턴스하게 재생해줄 라이브러리가 필요한것이다.



한 5년전에 아이폰으로 겜을 첨만들때 AVAudioPlayer로 효과음을 넣어서 만들었는데,

아주 가관이였다. ㅋㅋㅋ


아무튼 효과음을 재생시킨다고 한다면 반드시 AudioServicesPlaySystemSound를 이용해야할것이다.

다만 볼륨등을 조정할수 없으니 전처리를 하고 사용하기를 권장한다. 





코딩은 아래와 같이 하면 가볍게 처리할수 있다.

import AudioToolbox let filename = "mySoundFile" let ext = "wav" if let soundUrl = Bundle.main.url(forResource: filename, withExtension: ext) { var soundId: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundUrl as CFURL, &soundId) AudioServicesAddSystemSoundCompletion(soundId, nil, nil, { (soundId, clientData) -> Void in AudioServicesDisposeSystemSoundID(soundId) }, nil) AudioServicesPlaySystemSound(soundId) 

}