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.
61 lines
1.9 KiB
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 );
|
|
}
|
|
}
|
|
}
|