#BGMとか環境音をループ再生させる
##はじめに
BGMをずっとループして使いたいとか、効果音を指定した回数だけ繰り返して鳴らしたいとか、そう言った時に気軽に使いたいなと思い、クラス化して楽に使えるようにしました。AVAudioPlayerをもとに自分なりに扱いやすくしただけです。
##準備
使いたい音源のファイルはナビーゲータエリアに追加しておく。
aif, caf, mp3, aac, m4a, mp4, wavに対応
##ちなみに
ループの際、最後まで再生し終えて最初に戻る時に、若干のラグが起こることがあります。
僕の場合は環境音をずっと鳴らしたかったので困っていたんですが、ファイル形式がmp3などの圧縮したファイルの場合に起こるようでした。wavやcaf,aifの非圧縮のファイルは大丈夫!
詳しくはAVAudioPlayer gap
とかでググると出て来ます。
Sound.swift
import AVFoundation
class Sound{
//playerを作成
var player: AVAudioPlayer!
init(fileNamed:String,volume:Float,numberOfLoops:Int){
let fileNameStrings = fileNamed.componentsSeparatedByString(".")
let fileName = fileNameStrings[0]
let fileType = fileNameStrings[1]
let url = NSBundle.mainBundle().URLForResource(fileName, withExtension: fileType)
if let url = url {
do {
player = try AVAudioPlayer(contentsOfURL: url)
player.numberOfLoops = numberOfLoops/* 0なら一回、自然数ならその数だけループ、負の数なら永久ループ */
player.prepareToPlay() //再生準備 (タイミングがシビアな時のみ)
player.volume = volume
} catch {
//プレイヤー作成失敗
fatalError("Failed to initialize a player.")
}
} else {
//エラーを表示させる
fatalError("Error loading sound resource: " + fileNamed)
}
}
convenience init(fileNamed:String){
self.init(fileNamed:fileNamed,volume:1.0,numberOfLoops:0)
}
//AVAudioPlayerのメソッドを流用。これで〇〇.player.play()でなく〇〇.play()で済む
func play(){
self.player.play()
}
func pause(){
self.player.pause()
}
func stop(){
self.player.stop()
}
}
##使ってみる
再生とかvolumeのプロパティの扱いは基本的にはAVAudioPlayerと同じです。インスタンス化する際に少しは楽になったかと。
使用例
let bgm = Sound(fileNamed: "bgm.wav",volume:0.5,numberOfLoops:-1)
/*bgm.wavを0.5のvolumeで永久ループで再生できる*/
bgm.play()//再生
bgm.pause()//一時停止
bgm.stop()//停止
let se1 = Sound(fileNamed: "se1.wav")
/*se1.wavをvolume1.0で1回のみ再生する。*/
se1.play()//再生
##終わりに
BGMとかSEつける時に使えるかなぁ。不具合とかありましたら教えてください。