rm AudioPlayer and SoundPlayer

This commit is contained in:
Corey Frang 2018-06-20 15:31:28 -04:00
parent c12a1a4766
commit 45a7d1abef
3 changed files with 3 additions and 249 deletions

View file

@ -5,7 +5,6 @@ const log = require('./log');
const uid = require('./uid');
const ADPCMSoundDecoder = require('./ADPCMSoundDecoder');
const AudioPlayer = require('./AudioPlayer');
const Loudness = require('./Loudness');
const SoundPlayer = require('./GreenPlayer');
@ -242,13 +241,11 @@ class AudioEngine {
}
/**
* Create an AudioPlayer. Each sprite or clone has an AudioPlayer.
* It includes a reference to the AudioEngine so it can use global
* functionality such as playing notes.
* @return {AudioPlayer} new AudioPlayer instance
* Deprecated way to create an AudioPlayer
* @todo remove this
*/
createPlayer () {
return new AudioPlayer(this);
log.warn('the createPlayer method is no longer available, please use createBank');
}

View file

@ -1,152 +0,0 @@
const PanEffect = require('./effects/PanEffect');
const PitchEffect = require('./effects/PitchEffect');
const VolumeEffect = require('./effects/VolumeEffect');
const SoundPlayer = require('./GreenPlayer');
class AudioPlayer {
/**
* Each sprite or clone has an audio player
* the audio player handles sound playback, volume, and the sprite-specific audio effects:
* pitch and pan
* @param {AudioEngine} audioEngine AudioEngine for player
* @constructor
*/
constructor (audioEngine) {
this.audioEngine = audioEngine;
this.outputNode = this.audioEngine.audioContext.createGain();
// Create the audio effects.
const volumeEffect = new VolumeEffect(this.audioEngine, this, null);
const pitchEffect = new PitchEffect(this.audioEngine, this, volumeEffect);
const panEffect = new PanEffect(this.audioEngine, this, pitchEffect);
this.effects = {
volume: volumeEffect,
pitch: pitchEffect,
pan: panEffect
};
// Chain the effects and player together with the audio engine.
// outputNode -> "pitchEffect" -> panEffect -> audioEngine.input
panEffect.connect(this.audioEngine);
pitchEffect.connect(panEffect);
volumeEffect.connect(pitchEffect);
// Reset effects to their default parameters.
this.clearEffects();
// SoundPlayers mapped by sound id.
this.soundPlayers = {};
}
/**
* Get this sprite's input node, so that other objects can route sound through it.
* @return {AudioNode} the AudioNode for this sprite's input
*/
getInputNode () {
return this.outputNode;
}
/**
* Get all the sound players owned by this audio player.
* @return {object<string, SoundPlayer>} mapping of sound ids to sound
* players
*/
getSoundPlayers () {
return this.soundPlayers;
}
/**
* Add a SoundPlayer instance to soundPlayers map.
* @param {SoundPlayer} soundPlayer - SoundPlayer instance to add
*/
addSoundPlayer (soundPlayer) {
this.soundPlayers[soundPlayer.id] = soundPlayer;
for (const effectName in this.effects) {
this.effects[effectName].update();
}
}
/**
* Play a sound
* @param {string} soundId - the soundId id of a sound file
* @return {Promise} a Promise that resolves when the sound finishes playing
*/
playSound (soundId) {
// create a new soundplayer to play the sound
if (!this.soundPlayers[soundId]) {
this.addSoundPlayer(new SoundPlayer(
this.audioEngine,
{id: soundId, buffer: this.audioEngine.audioBuffers[soundId]}
));
}
const player = this.soundPlayers[soundId];
player.connect(this);
player.play();
return player.finished();
}
/**
* Stop all sounds that are playing
*/
stopAllSounds () {
// stop all active sound players
for (const soundId in this.soundPlayers) {
this.soundPlayers[soundId].stop();
}
}
/**
* Set an audio effect to a value
* @param {string} effect - the name of the effect
* @param {number} value - the value to set the effect to
*/
setEffect (effect, value) {
if (this.effects.hasOwnProperty(effect)) {
this.effects[effect].set(value);
}
}
/**
* Clear all audio effects
*/
clearEffects () {
for (const effectName in this.effects) {
this.effects[effectName].clear();
}
}
/**
* Set the volume for sounds played by this AudioPlayer
* @param {number} value - the volume in range 0-100
*/
setVolume (value) {
this.setEffect('volume', value);
}
/**
* Connnect this player's output to another audio node
* @param {object} target - target whose node to should be connected
*/
connect (target) {
this.outputNode.disconnect();
this.outputNode.connect(target.getInputNode());
}
/**
* Clean up and disconnect audio nodes.
*/
dispose () {
this.effects.volume.dispose();
this.effects.pitch.dispose();
this.effects.pan.dispose();
this.outputNode.disconnect();
this.outputNode = null;
}
}
module.exports = AudioPlayer;

View file

@ -1,91 +0,0 @@
const log = require('./log');
/**
* A SoundPlayer stores an audio buffer, and plays it
*/
class SoundPlayer {
/**
* @param {AudioContext} audioContext - a webAudio context
* @constructor
*/
constructor (audioContext) {
this.audioContext = audioContext;
this.outputNode = null;
this.buffer = null;
this.bufferSource = null;
this.playbackRate = 1;
this.isPlaying = false;
}
/**
* Connect the SoundPlayer to an output node
* @param {GainNode} node - an output node to connect to
*/
connect (node) {
this.outputNode = node;
}
/**
* Set an audio buffer
* @param {AudioBuffer} buffer - Buffer to set
*/
setBuffer (buffer) {
this.buffer = buffer;
}
/**
* Set the playback rate for the sound
* @param {number} playbackRate - a ratio where 1 is normal playback, 0.5 is half speed, 2 is double speed, etc.
*/
setPlaybackRate (playbackRate) {
this.playbackRate = playbackRate;
if (this.bufferSource && this.bufferSource.playbackRate) {
this.bufferSource.playbackRate.value = this.playbackRate;
}
}
/**
* Stop the sound
*/
stop () {
if (this.bufferSource && this.isPlaying) {
this.bufferSource.stop();
}
this.isPlaying = false;
}
/**
* Start playing the sound
* The web audio framework requires a new audio buffer source node for each playback
*/
start () {
if (!this.buffer) {
log.warn('tried to play a sound that was not loaded yet');
return;
}
this.bufferSource = this.audioContext.createBufferSource();
this.bufferSource.buffer = this.buffer;
this.bufferSource.playbackRate.value = this.playbackRate;
this.bufferSource.connect(this.outputNode);
this.bufferSource.start();
this.isPlaying = true;
}
/**
* The sound has finished playing. This is called at the correct time even if the playback rate
* has been changed
* @return {Promise} a Promise that resolves when the sound finishes playing
*/
finished () {
return new Promise(resolve => {
this.bufferSource.onended = () => {
this.isPlaying = false;
resolve();
};
});
}
}
module.exports = SoundPlayer;