From d69ea6b252a079ab81077fbeb74379c8d70b5153 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 27 Oct 2016 12:29:04 -0700 Subject: [PATCH] allow crowd-agent STOP command to take a delay time before it acts --- .../tests/performance/crowd-agent.js | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/scripts/developer/tests/performance/crowd-agent.js b/scripts/developer/tests/performance/crowd-agent.js index 6768b41318..b87d418643 100644 --- a/scripts/developer/tests/performance/crowd-agent.js +++ b/scripts/developer/tests/performance/crowd-agent.js @@ -16,7 +16,7 @@ var MESSAGE_CHANNEL = "io.highfidelity.summon-crowd"; -print('crowd-agent version 3'); +print('crowd-agent version 4'); /* Observations: - File urls for AC scripts silently fail. Use a local server (e.g., python SimpleHTTPServer) for development. @@ -34,19 +34,56 @@ function getSound(data, callback) { // callback(sound) when downloaded (which ma if (sound.downloaded) { return callback(sound); } - sound.ready.connect(function () { callback(sound); }); + function onDownloaded() { + sound.ready.disconnect(onDownloaded); + callback(sound); + } + sound.ready.connect(onDownloaded); } function onFinishedPlaying() { messageSend({key: 'finishedSound'}); } var attachment; +var stopper; +function clearStopper() { + if (!stopper) { + return; + } + Script.clearTimeout(stopper); + stopper = null; +} +function stopAgent(parameters) { + function stop() { + clearStopper(); + if (attachment) { + Avatar.detachOne(attachment.modelURL, attachment.jointName); + attachment = undefined; + } + Agent.isListeningToAudioStream = false; + Agent.isAvatar = false; + print('crowd-agent stopped', JSON.stringify(parameters), JSON.stringify(Agent)); + } + // Shutting down lots of agents at once can be hard on other parts of the system. (See fogbugz 2095.) + // For now, accept a parameter to delay for the given number of milliseconds before stopping. + // (We cannot count on summoning scripts to spread out the STOP messages, because they might be doing so + // on scriptEnding, in which case they are not allowed to create new delays.) + if (parameters.delay) { + if (!stopper) { // Let the first stopper do the deed. + stopper = Script.setTimeout(stop, parameters.delay); + } + } else { + stop(); + } +} + var MILLISECONDS_IN_SECOND = 1000; function startAgent(parameters) { // Can also be used to update. print('crowd-agent starting params', JSON.stringify(parameters), JSON.stringify(Agent)); + clearStopper(); + var wasOff = !Agent.isAvatar; Agent.isAvatar = true; - Agent.isListeningToAudioStream = true; // Send silence when not chattering. if (parameters.position) { Avatar.position = parameters.position; } @@ -56,6 +93,11 @@ function startAgent(parameters) { // Can also be used to update. if (parameters.skeletonModelURL) { Avatar.skeletonModelURL = parameters.skeletonModelURL; } + if (parameters.listen != undefined) { + Agent.isListeningToAudioStream = parameters.listen; // Send silence when not chattering. + } else if (wasOff) { + Agent.isListeningToAudioStream = true; + } if (parameters.soundData) { getSound(parameters.soundData, function (sound) { Script.setTimeout(onFinishedPlaying, sound.duration * MILLISECONDS_IN_SECOND); @@ -74,14 +116,6 @@ function startAgent(parameters) { // Can also be used to update. } print('crowd-agent avatars started'); } -function stopAgent(parameters) { - if (attachment) { - Avatar.detachOne(attachment.modelURL, attachment.jointName); - attachment = undefined; - } - Agent.isAvatar = false; - print('crowd-agent stopped', JSON.stringify(parameters), JSON.stringify(Agent)); -} function messageHandler(channel, messageString, senderID) { if (channel !== MESSAGE_CHANNEL) {