content/hifi-content/wadewatts/blocks/motorcycle/movingEntitySound.js
2022-02-14 02:04:11 +01:00

106 lines
No EOL
3.7 KiB
JavaScript

// originally based on createSoundEntity.js
// Copyright 2016 High Fidelity, Inc.
//
// updated with positional audio tracking and userdata support
// copyright 2018 wade watts and humbletim
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
/* globals Entities, SoundCache, Audio, Script */
(function(){
var VERSION = '0.0.0a';
var ringSound;
var entityID;
var interval;
var injector = null;
var DEFAULT_OPTIONS = {
url: 'https://hifi-content.s3.amazonaws.com/wadewatts/motorcycle-rev-03.wav',
volume: 0.1,
loop: false,
stoppable: true,
pitch: 1.0,
};
var options = {};
function recalculateSoundOptions(entityID, defaultOptions) {
var props = Entities.getEntityProperties(entityID);
try { var data = Object(JSON.parse(props.userData)); } catch(e) { data = {}; }
return {
__proto__: {
url: data.url || defaultOptions.url,
stoppable: typeof data.stoppable !== 'undefined' ? data.stoppable : defaultOptions.stoppable,
},
position: props.position || defaultOptions.url,
orientation: props.rotation || defaultOptions.orientation,
volume: isFinite(data.volume) ? parseFloat(data.volume) : defaultOptions.volume,
loop: typeof data.loop !== 'undefined' ? data.loop : defaultOptions.loop,
pitch: isFinite(data.pitch) ? parseFloat(data.pitch) : defaultOptions.pitch,
};
}
function updateSoundOptions() {
options = recalculateSoundOptions(entityID, DEFAULT_OPTIONS);
if (injector) {
injector.setOptions(options);
}
}
function startSound() {
var wasPlaying = injector !== null;
stopSound();
updateSoundOptions();
if (wasPlaying && options.stoppable) {
return console.info('>>>>>>>>>> sound set stoppable; not restarting until next click');
}
if (!ringSound || ringSound.url !== options.url) {
console.info('loading sound...', options.url);
ringSound = SoundCache.getSound(options.url);
}
if (!injector) {
console.info(entityID, "startSound...", wasPlaying, options.stoppable);
injector = Audio.playSound(ringSound, options);
} else {
console.info(entityID, "restartSound...", wasPlaying, options.stoppable);
injector.restart();
}
}
function stopSound() {
if (injector) {
console.info('stopping sound');
injector.setOptions({ volume: 0 });
injector.stop();
injector = null;
}
}
// entity methods
this.preload = function(id) {
entityID = id;
console.info("preload("+id+")", 'movingEntitySound v'+VERSION);
try { var data = Object(JSON.parse(Entities.getEntityProperties(entityID).userData)); } catch(e) { data = {}; }
if (!data.url) {
console.info('populating default userData values...', JSON.stringify(DEFAULT_OPTIONS,0,2));
for (var p in DEFAULT_OPTIONS) { data[p] = data[p] || DEFAULT_OPTIONS[p]; }
Entities.editEntity(entityID, { userData: JSON.stringify(data) });
}
interval = Script.setInterval(updateSoundOptions, 1000/24);
}
this.unload = function(id) {
stopSound();
interval = Script.clearInterval(interval);
};
this.clickDownOnEntity = function(entityID, mouseEvent) {
if (mouseEvent.isLeftButton) {
startSound();
}
};
this.startFarTrigger = function(entityID, asdf) {
startSound();
};
})