UNPKG

wavesurfer.js

Version:

Interactive navigable audio visualization using Web Audio and Canvas

43 lines (37 loc) 2.54 kB
/** * Ignores device silence mode when using the `WebAudio` backend. * * Many mobile devices contain a hardware button to mute the ringtone for incoming * calls and messages. Unfortunately, on some platforms like iOS, this also mutes * wavesurfer's audio when using the `WebAudio` backend. This function creates a * temporary `<audio>` element that makes sure the WebAudio backend keeps playing * when muting the device ringer. * * @since 5.2.0 */ export default function ignoreSilenceMode() { // Set webaudio context with 1 second silent audio 44100 bit rate buffer to allow playing audio even if silent switch is on the device const silentAC = new AudioContext(); const silentBS = silentAC.createBufferSource(); silentBS.buffer = silentAC.createBuffer(1, 1, 44100); silentBS.connect(silentAC.destination); silentBS.start(); // Set the src to a short bit of url encoded as a silent mp3 // NOTE The silence MP3 must be high quality, when web audio sounds are played // in parallel the web audio sound is mixed to match the bitrate of the html sound // 0.01 seconds of silence VBR220-260 Joint Stereo 859B const audioData = "data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA//////////////////////////////////////////////////////////////////8AAABhTEFNRTMuMTAwA8MAAAAAAAAAABQgJAUHQQAB9AAAAnGMHkkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sQxAADgnABGiAAQBCqgCRMAAgEAH///////////////7+n/9FTuQsQH//////2NG0jWUGlio5gLQTOtIoeR2WX////X4s9Atb/JRVCbBUpeRUq//////////////////9RUi0f2jn/+xDECgPCjAEQAABN4AAANIAAAAQVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="; // disable iOS Airplay (setting the attribute in js doesn't work) let tmp = document.createElement("div"); tmp.innerHTML = '<audio x-webkit-airplay="deny"></audio>'; let audioSilentMode = tmp.children.item(0); audioSilentMode.src = audioData; audioSilentMode.preload = "auto"; audioSilentMode.type = "audio/mpeg"; audioSilentMode.disableRemotePlayback = true; // play audioSilentMode.play(); // cleanup audioSilentMode.remove(); tmp.remove(); }