You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pleroma-fe-sjw/instance/pleroma-mods/pleroma-mod-tracker/audio-player.js

61 lines
1.9 KiB

function AudioPlayer( callback, effect ) {
var AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
var scriptProcessor = audioContext.createScriptProcessor( 0, 0, 2 );
var audioSource = new SineSource( audioContext.sampleRate );
var gainNode = audioContext.createGain();
gainNode.gain.value = localStorage.getItem('volume') === null ? 0.25 : localStorage.getItem('volume');
gainNode.connect( audioContext.destination );
var onaudioprocess = function( event ) {
var count = event.outputBuffer.length;
if( callback ) {
callback( count );
}
var leftBuf = event.outputBuffer.getChannelData( 0 );
var rightBuf = event.outputBuffer.getChannelData( 1 );
audioSource.getAudio( leftBuf, rightBuf, count );
if( effect ) {
effect( leftBuf, rightBuf, count );
}
}
this.getSamplingRate = function() {
return audioContext.sampleRate;
}
this.setAudioSource = function( audioSrc ) {
audioSource = audioSrc;
}
this.play = function() {
audioContext.resume().then(() => {
scriptProcessor.onaudioprocess = onaudioprocess;
scriptProcessor.connect( gainNode );
});
}
this.stop = function() {
if( scriptProcessor.onaudioprocess ) {
scriptProcessor.disconnect( gainNode );
scriptProcessor.onaudioprocess = null;
}
}
this.setVolume = function( volume ) {
gainNode.gain.value = volume;
}
}
function SineSource( samplingRate ) {
// Simple AudioSource for testing.
var rate = samplingRate;
var freq = 2 * Math.PI * 440 / rate;
var phase = 0;
this.getSamplingRate = function() {
return rate;
}
this.getAudio = function( leftBuffer, rightBuffer, count ) {
for( var idx = 0; idx < count; idx++, phase++ ) {
leftBuffer[ idx ] = Math.sin( phase * freq );
rightBuffer[ idx ] = Math.sin( phase * freq * 0.5 );
}
}
}