It seems like:
- With HTML5 audio tag, if the audio is less than 500ms, the volume in Safari might fluctuate with all formats
- With HTML5 audio tag, the delay with Safari is obvious with all formats
- With flash audio player, the delay with Safari is obvious with
*.wav, but it’s fine with*.mp3 - IE9 doesn’t support native audio tag
- Firefox’s audio sounds terrible when html5 audio tag is used with
mp3/oggformat, but is okay withwav. - Firefox is fine with flash audio player
To achieve compatibility across all browsers:
- Use flash audio player
- Use
mp3andwavformat - Put
mp3beforewav
So a simplified version with Sound Manager 2 (sometimes the onready event has trouble firing though, in which case a ontimeout reload is needed. See the whole of it at the end of this page):
soundManager.setup
url:'./swf/'
flashVersion:9
preferFlash:true
onready: ->
createSound =(id, volume =50, fileName = id)->
soundManager.createSound
id: id
url:["./audio/#{fileName}.mp3","./audio/#{fileName}.wav"]
autoLoad:true
autoPlay:false
volume: volume
createSound("button")
And play with:
soundManager.play("button")
This should solve the delay issue with OSX Safari. On IOS however, audio is poorly supported. The audio has to be user-initiated, the same way as video, which means that the delay is unavoidable. I haven’t been able to find a good solution yet.
And the whole of my code:
do loadAudio = (useSoundManager = true) ->
url = (fileName) ->
if platform.isFirefox
["./audio/#{fileName}.wav"]
else
["./audio/#{fileName}.mp3", "./audio/#{fileName}.wav"]
if useSoundManager
soundManager.setup
url: './swf/'
debugMode: true
flashVersion: 9
preferFlash: true
onready: ->
console.log 'soundManager ready'
createSound = (id, volume = 50, fileName = id) ->
soundManager.createSound
id: id
url: url(fileName)
autoLoad: true
autoPlay: false
volume: volume
createSound("close")
createSound("button")
createSound("countdown", 10)
ontimeout: ->
console.log "Uh-oh. No HTML5 support, SWF missing, Flash blocked or other issue. Reload." # sometimes when browser is cleared of cache and loads for the first time, this tends to happen, so reload:
loadAudio(true)
# or if you want to use html5 audio tag here instead:
# loadAudio(false)
else
addSource = (src, volume = 1) ->
$audio = $("<audio id='#{src}' />")
$audio[0].volume = volume
$audio.append("<source src='./audio/#{src}.wav'>")
$audio.append("<source src='./audio/#{src}.mp3'>")
$audio.appendTo('body')
addSource('close', .5)
addSource('button', .5)
addSource('countdown', 0.1)
window.playAudio = (id) ->
return if !platform.isDesktop
if useSoundManager
soundManager.play(id)
else
audio = $("##{id}")[0]
return if audio.readyState is 0
audio.currentTime = 0
audio.play()
window.stopAudio = (id) ->
return if !platform.isDesktop
if useSoundManager
soundManager.stop(id)
else
$("##{id}")[0].pause()
# and play with:
$('.button-sound').on 'mouseenter', -> playAudio('button')
$('.close-sound').on 'mouseenter', -> playAudio('close')
Reference:
