overte/interface/resources/serverless/Scripts/soundEmitter.js
2021-04-05 01:18:14 +02:00

202 lines
7 KiB
JavaScript

/* eslint-disable no-magic-numbers */
//
// soundEmitter.js
//
// Created by Zach Fox on 2019-07-05
// Copyright High Fidelity 2019
//
// Licensed under the Apache 2.0 License
// See accompanying license file or http://apache.org/
//
(function() {
var that;
var SOUND_EMITTER_UPDATE_INTERVAL_MS = 500;
var DEFAULT_AUDIO_INJECTOR_OPTIONS = {
"position": {
"x": 0,
"y": 0,
"z": 0
},
"volume": 0.5,
"loop": false,
"localOnly": false
};
var SoundEmitter = function() {
that = this;
that.entityID = false;
that.soundObjectURL = false;
that.soundObject = false;
that.audioInjector = false;
that.audioInjectorOptions = DEFAULT_AUDIO_INJECTOR_OPTIONS;
that.signalsConnected = {};
that.soundEmitterUpdateInterval = false;
};
SoundEmitter.prototype = {
preload: function(entityID) {
that.entityID = entityID;
var properties = Entities.getEntityProperties(that.entityID, ["userData"]);
var userData;
try {
userData = JSON.parse(properties.userData);
} catch (e) {
console.error("Error parsing userData: ", e);
}
if (userData) {
if (userData.soundURL && userData.soundURL.length > 0) {
that.handleNewSoundURL(userData.soundURL);
} else {
console.log("Please specify this entity's `userData`! See README.md for instructions.");
return;
}
} else {
console.log("Please specify this entity's `userData`! See README.md for instructions.");
return;
}
},
clearCurrentSoundData: function() {
that.soundObjectURL = false;
if (that.signalsConnected["soundObjectReady"]) {
that.soundObject.ready.disconnect(that.updateSoundEmitter);
that.signalsConnected["soundObjectReady"] = false;
}
that.soundObject = false;
if (that.audioInjector) {
if (that.audioInjector.playing) {
that.audioInjector.stop();
}
that.audioInjector = false;
}
that.audioInjectorOptions = DEFAULT_AUDIO_INJECTOR_OPTIONS;
if (that.soundEmitterUpdateInterval) {
Script.clearInterval(that.soundEmitterUpdateInterval);
that.soundEmitterUpdateInterval = false;
}
},
unload: function() {
that.clearCurrentSoundData();
},
handleNewSoundURL: function(newSoundURL) {
that.clearCurrentSoundData();
that.soundObjectURL = newSoundURL;
that.soundObject = SoundCache.getSound(that.soundObjectURL);
if (that.soundObject.downloaded) {
that.updateSoundEmitter();
} else {
that.soundObject.ready.connect(that.updateSoundEmitter);
that.signalsConnected["soundObjectReady"] = true;
}
},
positionChanged: function(newPos) {
return (newPos.x !== that.audioInjectorOptions.position.x ||
newPos.y !== that.audioInjectorOptions.position.y ||
newPos.z !== that.audioInjectorOptions.position.z);
},
updateSoundEmitter: function() {
var properties = Entities.getEntityProperties(that.entityID, ["userData", "position", "script", "serverScripts"]);
var userData;
try {
userData = JSON.parse(properties.userData);
} catch (e) {
console.error("Error parsing userData: ", e);
}
var optionsChanged = false;
var shouldRestartPlayback = false;
var newPosition = properties.position;
if (userData) {
if (userData.soundURL && userData.soundURL.length > 0 && userData.soundURL !== that.soundObjectURL) {
console.log("Sound Emitter: User put a new sound URL into `userData`! Resetting...");
that.handleNewSoundURL(userData.soundURL);
return;
}
if (typeof(userData.volume) !== "undefined" && !isNaN(userData.volume) && userData.volume !== that.audioInjectorOptions.volume) {
optionsChanged = true;
that.audioInjectorOptions.volume = userData.volume;
}
if (typeof(userData.shouldLoop) !== "undefined" && userData.shouldLoop !== that.audioInjectorOptions.shouldLoop) {
optionsChanged = true;
if (!that.audioInjectorOptions.loop && userData.shouldLoop && that.audioInjector && !that.audioInjector.playing) {
shouldRestartPlayback = true;
}
that.audioInjectorOptions.loop = userData.shouldLoop;
}
if (typeof(userData.positionOverride) !== "undefined" && !isNaN(userData.positionOverride.x) &&
!isNaN(userData.positionOverride.y) && !isNaN(userData.positionOverride.z)) {
newPosition = userData.positionOverride;
}
} else {
console.log("Please specify this entity's `userData`! See README.md for instructions.");
that.clearCurrentSoundData();
return;
}
var localOnly = that.audioInjectorOptions.localOnly;
// If this script is attached as a client entity script...
if (properties.script.indexOf("soundEmitter.js") > -1) {
// ... Make sure that the audio injector IS local only.
localOnly = true;
// Else if this script is attached as a client server script...
} else if (properties.serverScripts.indexOf("soundEmitter.js") > -1) {
// ... Make sure that the audio injector IS NOT local only.
localOnly = false;
}
if (localOnly !== that.audioInjectorOptions.localOnly) {
optionsChanged = true;
that.audioInjectorOptions.localOnly = localOnly;
}
if (that.positionChanged(newPosition)) {
optionsChanged = true;
that.audioInjectorOptions["position"] = newPosition;
}
if (!that.audioInjector || shouldRestartPlayback) {
that.audioInjector = Audio.playSound(that.soundObject, that.audioInjectorOptions);
} else if (optionsChanged) {
that.audioInjector.setOptions(that.audioInjectorOptions);
}
if (!that.soundEmitterUpdateInterval) {
that.soundEmitterUpdateInterval = Script.setInterval(that.updateSoundEmitter, SOUND_EMITTER_UPDATE_INTERVAL_MS);
}
}
};
return new SoundEmitter();
});