fix: Modernize audio playback #9560
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The basics
The details
Resolves
Proposed Changes
This PR modernizes Blockly's audio playback to remove decade-old hacks:
Preloading has been improved by fetching the audio file when it is loaded and storing its bytes, rather than creating
HTMLAudioElementinstances and playing them on page load to try to trick the browser into fetching and caching them. Because we're no longer relying on playingHTMLAudioElements, various hacks to do this in response to user interaction in order to prevent the browser suppressing it are also unnecessary. This incidentally fixes several situations whereby the preloading/playback could be heard on pageload, because we no longer play sounds until we actually intend to play them.The OGG and WAV files have been removed; MP3 is supported by all modern browsers, so these fallbacks were just wasting bandwidth.
Rather than creating and cloning audio tags based on useragent, we now just use the WebAudio API to play sounds.
Testing
I manually verified that block connection, disconnection and delete sounds play properly on Safari, Mobile Safari (in the simulator), Chrome and Firefox. I also verified that bulk deletion after e.g. "Scatter" in the playground plays lots of delete sounds in quick succession properly.