Merge pull request #9825 from thoys/record-fixes

Avatar Recorder and Playback Fixes
This commit is contained in:
Seth Alves 2017-03-16 07:27:42 -08:00 committed by GitHub
commit 31e0cfe296
5 changed files with 64 additions and 46 deletions

View file

@ -154,9 +154,12 @@ MyAvatar::MyAvatar(RigPointer rig) :
if (recordingInterface->getPlayFromCurrentLocation()) { if (recordingInterface->getPlayFromCurrentLocation()) {
setRecordingBasis(); setRecordingBasis();
} }
_wasCharacterControllerEnabled = _characterController.isEnabled();
_characterController.setEnabled(false);
} else { } else {
clearRecordingBasis(); clearRecordingBasis();
useFullAvatarURL(_fullAvatarURLFromPreferences, _fullAvatarModelName); useFullAvatarURL(_fullAvatarURLFromPreferences, _fullAvatarModelName);
_characterController.setEnabled(_wasCharacterControllerEnabled);
} }
auto audioIO = DependencyManager::get<AudioClient>(); auto audioIO = DependencyManager::get<AudioClient>();

View file

@ -411,6 +411,7 @@ private:
SharedSoundPointer _collisionSound; SharedSoundPointer _collisionSound;
MyCharacterController _characterController; MyCharacterController _characterController;
bool _wasCharacterControllerEnabled { true };
AvatarWeakPointer _lookAtTargetAvatar; AvatarWeakPointer _lookAtTargetAvatar;
glm::vec3 _targetAvatarPosition; glm::vec3 _targetAvatarPosition;

View file

@ -33,6 +33,7 @@ void Deck::queueClip(ClipPointer clip, float timeOffset) {
// FIXME disabling multiple clips for now // FIXME disabling multiple clips for now
_clips.clear(); _clips.clear();
_length = 0.0f;
// if the time offset is not zero, wrap in an OffsetClip // if the time offset is not zero, wrap in an OffsetClip
if (timeOffset != 0.0f) { if (timeOffset != 0.0f) {
@ -153,8 +154,8 @@ void Deck::processFrames() {
// if doing relative movement // if doing relative movement
emit looped(); emit looped();
} else { } else {
// otherwise pause playback // otherwise stop playback
pause(); stop();
} }
return; return;
} }

View file

@ -9,12 +9,14 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
/* globals HIFI_PUBLIC_BUCKET:true, Tool, ToolBar */
HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/";
Script.include("/~/system/libraries/toolBars.js"); Script.include("/~/system/libraries/toolBars.js");
var recordingFile = "recording.hfr"; var recordingFile = "recording.hfr";
function setPlayerOptions() { function setDefaultPlayerOptions() {
Recording.setPlayFromCurrentLocation(true); Recording.setPlayFromCurrentLocation(true);
Recording.setPlayerUseDisplayName(false); Recording.setPlayerUseDisplayName(false);
Recording.setPlayerUseAttachments(false); Recording.setPlayerUseAttachments(false);
@ -38,16 +40,16 @@ var saveIcon;
var loadIcon; var loadIcon;
var spacing; var spacing;
var timerOffset; var timerOffset;
setupToolBar();
var timer = null; var timer = null;
var slider = null; var slider = null;
setupToolBar();
setupTimer(); setupTimer();
var watchStop = false; var watchStop = false;
function setupToolBar() { function setupToolBar() {
if (toolBar != null) { if (toolBar !== null) {
print("Multiple calls to Recorder.js:setupToolBar()"); print("Multiple calls to Recorder.js:setupToolBar()");
return; return;
} }
@ -56,6 +58,8 @@ function setupToolBar() {
toolBar = new ToolBar(0, 0, ToolBar.HORIZONTAL); toolBar = new ToolBar(0, 0, ToolBar.HORIZONTAL);
toolBar.onMove = onToolbarMove;
toolBar.setBack(COLOR_TOOL_BAR, ALPHA_OFF); toolBar.setBack(COLOR_TOOL_BAR, ALPHA_OFF);
recordIcon = toolBar.addTool({ recordIcon = toolBar.addTool({
@ -86,7 +90,7 @@ function setupToolBar() {
visible: true visible: true
}, false); }, false);
timerOffset = toolBar.width; timerOffset = toolBar.width + ToolBar.SPACING;
spacing = toolBar.addSpacing(0); spacing = toolBar.addSpacing(0);
saveIcon = toolBar.addTool({ saveIcon = toolBar.addTool({
@ -112,15 +116,15 @@ function setupTimer() {
text: (0.00).toFixed(3), text: (0.00).toFixed(3),
backgroundColor: COLOR_OFF, backgroundColor: COLOR_OFF,
x: 0, y: 0, x: 0, y: 0,
width: 0, height: 0, width: 200, height: 25,
leftMargin: 10, topMargin: 10, leftMargin: 5, topMargin: 3,
alpha: 1.0, backgroundAlpha: 1.0, alpha: 1.0, backgroundAlpha: 1.0,
visible: true visible: true
}); });
slider = { x: 0, y: 0, slider = { x: 0, y: 0,
w: 200, h: 20, w: 200, h: 20,
pos: 0.0, // 0.0 <= pos <= 1.0 pos: 0.0 // 0.0 <= pos <= 1.0
}; };
slider.background = Overlays.addOverlay("text", { slider.background = Overlays.addOverlay("text", {
text: "", text: "",
@ -144,20 +148,40 @@ function setupTimer() {
}); });
} }
function onToolbarMove(newX, newY, deltaX, deltaY) {
Overlays.editOverlay(timer, {
x: newX + timerOffset - ToolBar.SPACING,
y: newY
});
slider.x = newX - ToolBar.SPACING;
slider.y = newY - slider.h - ToolBar.SPACING;
Overlays.editOverlay(slider.background, {
x: slider.x,
y: slider.y
});
Overlays.editOverlay(slider.foreground, {
x: slider.x,
y: slider.y
});
}
function updateTimer() { function updateTimer() {
var text = ""; var text = "";
if (Recording.isRecording()) { if (Recording.isRecording()) {
text = formatTime(Recording.recorderElapsed()); text = formatTime(Recording.recorderElapsed());
} else { } else {
text = formatTime(Recording.playerElapsed()) + " / " + text = formatTime(Recording.playerElapsed()) + " / " + formatTime(Recording.playerLength());
formatTime(Recording.playerLength());
} }
var timerWidth = text.length * 8 + ((Recording.isRecording()) ? 15 : 0);
Overlays.editOverlay(timer, { Overlays.editOverlay(timer, {
text: text text: text,
}) width: timerWidth
toolBar.changeSpacing(text.length * 8 + ((Recording.isRecording()) ? 15 : 0), spacing); });
toolBar.changeSpacing(timerWidth + ToolBar.SPACING, spacing);
if (Recording.isRecording()) { if (Recording.isRecording()) {
slider.pos = 1.0; slider.pos = 1.0;
@ -173,7 +197,7 @@ function updateTimer() {
function formatTime(time) { function formatTime(time) {
var MIN_PER_HOUR = 60; var MIN_PER_HOUR = 60;
var SEC_PER_MIN = 60; var SEC_PER_MIN = 60;
var MSEC_PER_SEC = 1000; var MSEC_DIGITS = 3;
var hours = Math.floor(time / (SEC_PER_MIN * MIN_PER_HOUR)); var hours = Math.floor(time / (SEC_PER_MIN * MIN_PER_HOUR));
time -= hours * (SEC_PER_MIN * MIN_PER_HOUR); time -= hours * (SEC_PER_MIN * MIN_PER_HOUR);
@ -184,37 +208,19 @@ function formatTime(time) {
var seconds = time; var seconds = time;
var text = ""; var text = "";
text += (hours > 0) ? hours + ":" : text += (hours > 0) ? hours + ":" : "";
""; text += (minutes > 0) ? ((minutes < 10 && text !== "") ? "0" : "") + minutes + ":" : "";
text += (minutes > 0) ? ((minutes < 10 && text != "") ? "0" : "") + minutes + ":" : text += ((seconds < 10 && text !== "") ? "0" : "") + seconds.toFixed(MSEC_DIGITS);
"";
text += ((seconds < 10 && text != "") ? "0" : "") + seconds.toFixed(3);
return text; return text;
} }
function moveUI() { function moveUI() {
var relative = { x: 70, y: 40 }; var relative = { x: 70, y: 40 };
toolBar.move(relative.x, windowDimensions.y - relative.y); toolBar.move(relative.x, windowDimensions.y - relative.y);
Overlays.editOverlay(timer, {
x: relative.x + timerOffset - ToolBar.SPACING,
y: windowDimensions.y - relative.y - ToolBar.SPACING
});
slider.x = relative.x - ToolBar.SPACING;
slider.y = windowDimensions.y - relative.y - slider.h - ToolBar.SPACING;
Overlays.editOverlay(slider.background, {
x: slider.x,
y: slider.y,
});
Overlays.editOverlay(slider.foreground, {
x: slider.x,
y: slider.y,
});
} }
function mousePressEvent(event) { function mousePressEvent(event) {
clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); var clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y });
if (recordIcon === toolBar.clicked(clickedOverlay, false) && !Recording.isPlaying()) { if (recordIcon === toolBar.clicked(clickedOverlay, false) && !Recording.isPlaying()) {
if (!Recording.isRecording()) { if (!Recording.isRecording()) {
@ -226,7 +232,11 @@ function mousePressEvent(event) {
toolBar.setAlpha(ALPHA_OFF, loadIcon); toolBar.setAlpha(ALPHA_OFF, loadIcon);
} else { } else {
Recording.stopRecording(); Recording.stopRecording();
toolBar.selectTool(recordIcon, true ); toolBar.selectTool(recordIcon, true);
setDefaultPlayerOptions();
// Plays the recording at the same spot as you recorded it
Recording.setPlayFromCurrentLocation(false);
Recording.setPlayerTime(0);
Recording.loadLastRecording(); Recording.loadLastRecording();
toolBar.setAlpha(ALPHA_ON, playIcon); toolBar.setAlpha(ALPHA_ON, playIcon);
toolBar.setAlpha(ALPHA_ON, playLoopIcon); toolBar.setAlpha(ALPHA_ON, playLoopIcon);
@ -240,7 +250,6 @@ function mousePressEvent(event) {
toolBar.setAlpha(ALPHA_ON, saveIcon); toolBar.setAlpha(ALPHA_ON, saveIcon);
toolBar.setAlpha(ALPHA_ON, loadIcon); toolBar.setAlpha(ALPHA_ON, loadIcon);
} else if (Recording.playerLength() > 0) { } else if (Recording.playerLength() > 0) {
setPlayerOptions();
Recording.setPlayerLoop(false); Recording.setPlayerLoop(false);
Recording.startPlaying(); Recording.startPlaying();
toolBar.setAlpha(ALPHA_OFF, recordIcon); toolBar.setAlpha(ALPHA_OFF, recordIcon);
@ -255,7 +264,6 @@ function mousePressEvent(event) {
toolBar.setAlpha(ALPHA_ON, saveIcon); toolBar.setAlpha(ALPHA_ON, saveIcon);
toolBar.setAlpha(ALPHA_ON, loadIcon); toolBar.setAlpha(ALPHA_ON, loadIcon);
} else if (Recording.playerLength() > 0) { } else if (Recording.playerLength() > 0) {
setPlayerOptions();
Recording.setPlayerLoop(true); Recording.setPlayerLoop(true);
Recording.startPlaying(); Recording.startPlaying();
toolBar.setAlpha(ALPHA_OFF, recordIcon); toolBar.setAlpha(ALPHA_OFF, recordIcon);
@ -263,7 +271,7 @@ function mousePressEvent(event) {
toolBar.setAlpha(ALPHA_OFF, loadIcon); toolBar.setAlpha(ALPHA_OFF, loadIcon);
} }
} else if (saveIcon === toolBar.clicked(clickedOverlay)) { } else if (saveIcon === toolBar.clicked(clickedOverlay)) {
if (!Recording.isRecording() && !Recording.isPlaying() && Recording.playerLength() != 0) { if (!Recording.isRecording() && !Recording.isPlaying() && Recording.playerLength() !== 0) {
recordingFile = Window.save("Save recording to file", ".", "Recordings (*.hfr)"); recordingFile = Window.save("Save recording to file", ".", "Recordings (*.hfr)");
if (!(recordingFile === "null" || recordingFile === null || recordingFile === "")) { if (!(recordingFile === "null" || recordingFile === null || recordingFile === "")) {
Recording.saveRecording(recordingFile); Recording.saveRecording(recordingFile);
@ -274,6 +282,7 @@ function mousePressEvent(event) {
recordingFile = Window.browse("Load recording from file", ".", "Recordings (*.hfr *.rec *.HFR *.REC)"); recordingFile = Window.browse("Load recording from file", ".", "Recordings (*.hfr *.rec *.HFR *.REC)");
if (!(recordingFile === "null" || recordingFile === null || recordingFile === "")) { if (!(recordingFile === "null" || recordingFile === null || recordingFile === "")) {
Recording.loadRecording(recordingFile); Recording.loadRecording(recordingFile);
setDefaultPlayerOptions();
} }
if (Recording.playerLength() > 0) { if (Recording.playerLength() > 0) {
toolBar.setAlpha(ALPHA_ON, playIcon); toolBar.setAlpha(ALPHA_ON, playIcon);
@ -282,8 +291,8 @@ function mousePressEvent(event) {
} }
} }
} else if (Recording.playerLength() > 0 && } else if (Recording.playerLength() > 0 &&
slider.x < event.x && event.x < slider.x + slider.w && slider.x < event.x && event.x < slider.x + slider.w &&
slider.y < event.y && event.y < slider.y + slider.h) { slider.y < event.y && event.y < slider.y + slider.h) {
isSliding = true; isSliding = true;
slider.pos = (event.x - slider.x) / slider.w; slider.pos = (event.x - slider.x) / slider.w;
Recording.setPlayerTime(slider.pos * Recording.playerLength()); Recording.setPlayerTime(slider.pos * Recording.playerLength());
@ -308,7 +317,7 @@ function mouseReleaseEvent(event) {
function update() { function update() {
var newDimensions = Controller.getViewportDimensions(); var newDimensions = Controller.getViewportDimensions();
if (windowDimensions.x != newDimensions.x || windowDimensions.y != newDimensions.y) { if (windowDimensions.x !== newDimensions.x || windowDimensions.y !== newDimensions.y) {
windowDimensions = newDimensions; windowDimensions = newDimensions;
moveUI(); moveUI();
} }

View file

@ -160,6 +160,7 @@ ToolBar = function(x, y, direction, optionalPersistenceKey, optionalInitialPosit
visible: false visible: false
}); });
this.spacing = []; this.spacing = [];
this.onMove = null;
this.addTool = function(properties, selectable, selected) { this.addTool = function(properties, selectable, selected) {
if (direction == ToolBar.HORIZONTAL) { if (direction == ToolBar.HORIZONTAL) {
@ -254,6 +255,9 @@ ToolBar = function(x, y, direction, optionalPersistenceKey, optionalInitialPosit
y: y - ToolBar.SPACING y: y - ToolBar.SPACING
}); });
} }
if (this.onMove !== null) {
this.onMove(x, y, dx, dy);
};
} }
this.setAlpha = function(alpha, tool) { this.setAlpha = function(alpha, tool) {