Things take time

[SWIFT] 시스템 알람(System Alarm) 사운드 가져오기 및 재생 본문

iOS (기능)

[SWIFT] 시스템 알람(System Alarm) 사운드 가져오기 및 재생

겸손할 겸 2017. 11. 28. 17:05

[시스템 사운드]


말 그대로 디바이스 내에 저장되어 있는 음악 파일들이다. 

경로는 /System/Library/Audio/UISounds/ 하위에 있는 파일 들인데, 이 파일들을 불러와 테이블 뷰에 뿌리고

재생까지 하는 방법이다.



[코드]

import UIKit
import AudioToolbox

class SoundViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tvSoundList: UITableView!
    
    private var soundList: [String] = []
    private let soundDirectory = "/System/Library/Audio/UISounds/New"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tvSoundList.delegate = self
        tvSoundList.dataSource = self
        
        
        soundList = FileManager.default.enumerator(atPath: soundDirectory)!.map { String(describing: $0) }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return soundList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(soundList[indexPath.row])"
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        
        let soundFileName = soundList[indexPath.row]
        let fullyQualifiedName = soundDirectory + "/" + soundFileName
        let url = URL(fileURLWithPath: fullyQualifiedName)
        var soundId: SystemSoundID = 0
        AudioServicesCreateSystemSoundID(url as CFURL, &soundId)
        AudioServicesPlaySystemSoundWithCompletion(soundId, {
            print("AudioServicesPlaySystemSoundWithCompletion")
            AudioServicesDisposeSystemSoundID(soundId)
        })

        //AudioServicesPlaySystemSound(soundId)
    }
}

soundList에 FileManager를 통해 해당 디렉토리에 등록된 애들을 불러와 넣는다는 것 (New/ 까지 한 이유는 그 상위에 하면, 음악파일 뿐 아니라 New같은 일반 파일 디렉토리도 출력되서)


그리고 파일 재생할때는 AudioServicesPlaySystemSound(SoundID)으로 재생할 수 있는데.. 이 때, 위처럼 soundId값을 얻을 수도 있지만 상수값으로 이미 제공되는 것들이 있어 1020, 1021 과 같은 값을 넣어도 음악이 재생된다.


그리고 AudioServicesDisposeSystemSoundID를 통해 초기화 해주는 것이 좋다고 하니 꼭 이대로 하자.



기본적인 테이블 뷰 하나만 놓고 시작했다.



[결과]