Skip to content

Instantly share code, notes, and snippets.

@marcosgriselli
Created October 2, 2017 04:21
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save marcosgriselli/1b573f5d011636838c8ba962f7749981 to your computer and use it in GitHub Desktop.
Save marcosgriselli/1b573f5d011636838c8ba962f7749981 to your computer and use it in GitHub Desktop.
Play an audio file from resources or .xcassets
import AVFoundation
var audioPlayer: AVAudioPlayer?
enum AudioLoader {
case fromResource(URL)
case fromAsset(NSDataAsset)
}
enum AudioLoaderError: Error {
case resourceNotFound
case assetNotFound
case loadPlayer
}
func playFromResources(filename: String, fileExtension: String) throws {
guard let url = Bundle.main.url(forResource: filename, withExtension: fileExtension) else {
throw AudioLoaderError.resourceNotFound
}
try playFrom(audioLoader: AudioLoader.fromResource(url))
}
func playFromAssets(filename: String) throws {
guard let dataAsset = NSDataAsset(name: filename) else {
throw AudioLoaderError.assetNotFound
}
try playFrom(audioLoader: AudioLoader.fromAsset(dataAsset))
}
func playFrom(audioLoader: AudioLoader) throws {
switch audioLoader {
case .fromResource(let url):
audioPlayer = try perform(AVAudioPlayer(contentsOf: url),
orThrow: AudioLoaderError.loadPlayer)
case .fromAsset(let dataAsset):
audioPlayer = try perform(AVAudioPlayer(data: dataAsset.data, fileTypeHint: AVFileTypeWAVE),
orThrow: AudioLoaderError.loadPlayer)
}
DispatchQueue.global(qos: .userInitiated).async {
audioPlayer?.play()
}
}
@marcosgriselli
Copy link
Author

func perform<T>(_ expression: @autoclosure () throws -> T, orThrow error: Error) throws -> T

Comes from this John Sundell's gist

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment