mirror of
https://github.com/overte-org/overte.git
synced 2025-04-26 17:36:35 +02:00
202 lines
7 KiB
JavaScript
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();
|
|
});
|