From 5d8b3956d8b5e70052c5a2bd03b6b2a6a70988bd Mon Sep 17 00:00:00 2001 From: chrisguttandin Date: Wed, 28 Mar 2018 04:37:16 +0200 Subject: [PATCH] feat: cache OfflineAudioContext used to create AudioBuffers --- src/audio-buffer.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/audio-buffer.ts b/src/audio-buffer.ts index 4b93e55fc..c3fcc2269 100644 --- a/src/audio-buffer.ts +++ b/src/audio-buffer.ts @@ -11,6 +11,7 @@ import { AUDIO_BUFFER_COPY_CHANNEL_METHODS_SUPPORT_TESTER_PROVIDER, AudioBufferCopyChannelMethodsSupportTester } from './support-testers/audio-buffer-copy-channel-methods'; +import { TUnpatchedOfflineAudioContext } from './types'; import { AUDIO_BUFFER_WRAPPER_PROVIDER, AudioBufferWrapper } from './wrappers/audio-buffer'; import { AUDIO_BUFFER_COPY_CHANNEL_METHODS_WRAPPER_PROVIDER, @@ -37,6 +38,8 @@ const audioBufferCopyChannelMethodsSupportTester = injector.get(AudioBufferCopyC const audioBufferCopyChannelMethodsWrapper = injector.get(AudioBufferCopyChannelMethodsWrapper); const unpatchedOfflineAudioContextConstructor = injector.get(nptchdFflnDCntxtCnstrctr); +let unpatchedOfflineAudioContext: null | TUnpatchedOfflineAudioContext = null; + export class AudioBuffer implements IAudioBuffer { public duration: number; @@ -54,7 +57,10 @@ export class AudioBuffer implements IAudioBuffer { const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options }; - const unpatchedOfflineAudioContext = new unpatchedOfflineAudioContextConstructor(1, 1, 44100); + if (unpatchedOfflineAudioContext === null) { + unpatchedOfflineAudioContext = new unpatchedOfflineAudioContextConstructor(1, 1, 44100); + } + const audioBuffer = unpatchedOfflineAudioContext.createBuffer(numberOfChannels, length, sampleRate); // Bug #5: Safari does not support copyFromChannel() and copyToChannel(). @@ -64,7 +70,10 @@ export class AudioBuffer implements IAudioBuffer { } else if ( !cacheTestResult( AudioBufferCopyChannelMethodsSupportTester, - () => audioBufferCopyChannelMethodsSupportTester.test(unpatchedOfflineAudioContext) + () => { + return (unpatchedOfflineAudioContext !== null && + audioBufferCopyChannelMethodsSupportTester.test(unpatchedOfflineAudioContext)); + } ) ) { audioBufferCopyChannelMethodsWrapper.wrap(audioBuffer);