/ios-safe-audio-context

create a WebAudio context that works in iOS and everywhere else

Primary LanguageJavaScriptMIT LicenseMIT

ios-safe-audio-context

experimental

Creates a AudioContext that works as expected in desktop and mobile, particularly across iOS devices.

Motivation

There is a bug in iOS where the AudioContext sampleRate is sometimes not what you would expect, and as a result, all WebAudio plays with heavy distortion. This occurs when you play an audio/video element with a different sample rate, or when you first boot up Safari (tested on iOS9.2, iPhone5S, no headphones).

To get around this, we try to detect a broken state, and if so, play a dummy buffer before returning a new AudioContext which should have the desired sample rate (default 44100).

Example

On iOS, this function must be called from user gesture event, such as touchend.

const createAudioContext = require('ios-safe-audio-context')

clickToPlay.addEventListener('touchend', () => {
  const audioContext = createAudioContext()
  
  // now you can use this context for playback
})

Usage

NPM

context = createAudioContext([desiredSampleRate])

Returns a new AudioContext, only applying the hack if we detect a broken state (iOS). desiredSampleRate defaults to 44100.

License

MIT, see LICENSE.md for details.