Tone.js/Tone/core/context/AudioContext.ts
Yotam Mann d1c281c810 using isAudioParam and isAudioNode to test instanceof
will make migrating to standardized-audio-context easier
2019-08-16 12:49:04 -04:00

56 lines
1.4 KiB
TypeScript

/**
* Either the online or offline audio context
*/
export type AnyAudioContext = AudioContext | OfflineAudioContext;
/**
* Interface for things that Tone.js adds to the window
*/
interface ToneWindow extends Window {
TONE_AUDIO_CONTEXT?: AnyAudioContext;
TONE_SILENCE_LOGGING?: boolean;
TONE_DEBUG_CLASS?: string;
}
/**
* A reference to the window object
*/
export const theWindow: ToneWindow | null = typeof self === "object" ? self : null;
/**
* If the browser has a window object which has an AudioContext
*/
export const hasAudioContext = theWindow &&
(theWindow.hasOwnProperty("AudioContext") || theWindow.hasOwnProperty("webkitAudioContext"));
/**
* The global audio context which is getable and assignable through
* getAudioContext and setAudioContext
*/
let globalContext: AnyAudioContext;
// if it was created already, use that one
// this enables multiple versions of Tone.js to run on the same page.
if (theWindow && theWindow.TONE_AUDIO_CONTEXT) {
globalContext = theWindow.TONE_AUDIO_CONTEXT;
}
/**
* Returns the default system-wide AudioContext
*/
export function getAudioContext(): AnyAudioContext {
if (!globalContext && hasAudioContext) {
setAudioContext(new AudioContext());
}
return globalContext;
}
/**
* Set the default audio context
*/
export function setAudioContext(context: AnyAudioContext): void {
globalContext = context;
if (theWindow) {
theWindow.TONE_AUDIO_CONTEXT = globalContext;
}
}