* wip still on new ftue. also push release branches to repository VRFS-1639

This commit is contained in:
Seth Call 2014-04-22 17:53:41 +00:00
parent 0a811a147c
commit 30ca8d7c5c
13 changed files with 328 additions and 154 deletions

4
build
View File

@ -66,7 +66,7 @@ DEB_SERVER=http://localhost:9010/apt-`uname -p`
GEM_SERVER=http://localhost:9000/gems GEM_SERVER=http://localhost:9000/gems
# if still going, then push all debs up # if still going, then push all debs up
if [[ "$GIT_BRANCH" == *develop* || "$GIT_BRANCH" == *master* ]]; then if [[ "$GIT_BRANCH" == *develop* || "$GIT_BRANCH" == *master* || "$GIT_BRANCH" == *release* ]]; then
echo "" echo ""
echo "PUSHING DB ARTIFACTS" echo "PUSHING DB ARTIFACTS"
@ -129,7 +129,7 @@ GEM_SERVER=http://localhost:9000/gems
popd > /dev/null popd > /dev/null
else else
echo "Skipping publish since branch is neither master or develop..." echo "Skipping publish since branch is not master, develop, or release/*. branch is $GIT_BRANCH"
fi fi
fi fi

View File

@ -65,7 +65,6 @@ module JamWebEventMachine
end end
def self.run def self.run
current = Thread.current current = Thread.current
Thread.new do Thread.new do
run_em(current) run_em(current)

View File

@ -66,6 +66,7 @@
var me = { var me = {
initialize: initialize, initialize: initialize,
show: show, show: show,
showAlert: showAlert,
hide: hide hide: hide
} }

View File

@ -69,7 +69,7 @@
.prop('disabled', true) .prop('disabled', true)
} }
function validateForm() { function validateForm() {
//var errors = []; //var errors = [];
var isValid = true; var isValid = true;
var $form = $('#create-session-form'); var $form = $('#create-session-form');

View File

@ -6,18 +6,22 @@
context.JK = context.JK || {}; context.JK = context.JK || {};
context.JK.GearWizard = function (app) { context.JK.GearWizard = function (app) {
var $dialog = null; var $dialog = null;
var $wizardSteps = null; var $wizardSteps = null;
var $currentWizardStep = null; var $currentWizardStep = null;
var step = 0; var step = 0;
var $templateSteps = null; var $templateSteps = null;
var $templateButtons = null; var $templateButtons = null;
var $templateAudioPort = null;
var $ftueButtons = null; var $ftueButtons = null;
var self = null; var self = null;
var operatingSystem = null; var operatingSystem = null;
// populated by loadDevices // populated by loadDevices
var deviceInformation = null; var deviceInformation = null;
var musicInputPorts = null;
var musicOutputPorts = null;
// SELECT DEVICE STATE // SELECT DEVICE STATE
var validScore = false; var validScore = false;
@ -33,28 +37,32 @@
var STEP_ROUTER_NETWORK = 5; var STEP_ROUTER_NETWORK = 5;
var STEP_SUCCESS = 6; var STEP_SUCCESS = 6;
var PROFILE_DEV_SEP_TOKEN = '^';
var iCheckIgnore = false;
var audioDeviceBehavior = { var audioDeviceBehavior = {
MacOSX_builtin : { MacOSX_builtin: {
display: 'MacOSX Built-In', display: 'MacOSX Built-In',
videoURL: undefined videoURL: undefined
}, },
MACOSX_interface : { MACOSX_interface: {
display: 'MacOSX external interface', display: 'MacOSX external interface',
videoURL: undefined videoURL: undefined
}, },
Win32_wdm : { Win32_wdm: {
display: 'Windows WDM', display: 'Windows WDM',
videoURL: undefined videoURL: undefined
}, },
Win32_asio : { Win32_asio: {
display: 'Windows ASIO', display: 'Windows ASIO',
videoURL: undefined videoURL: undefined
}, },
Win32_asio4all : { Win32_asio4all: {
display: 'Windows ASIO4ALL', display: 'Windows ASIO4ALL',
videoURL: undefined videoURL: undefined
}, },
Linux : { Linux: {
display: 'Linux', display: 'Linux',
videoURL: undefined videoURL: undefined
} }
@ -63,7 +71,7 @@
function beforeShowIntro() { function beforeShowIntro() {
var $watchVideo = $currentWizardStep.find('.watch-video'); var $watchVideo = $currentWizardStep.find('.watch-video');
var videoUrl = 'https://www.youtube.com/watch?v=VexH4834o9I'; var videoUrl = 'https://www.youtube.com/watch?v=VexH4834o9I';
if(operatingSystem == "Win32") { if (operatingSystem == "Win32") {
$watchVideo.attr('href', 'https://www.youtube.com/watch?v=VexH4834o9I'); $watchVideo.attr('href', 'https://www.youtube.com/watch?v=VexH4834o9I');
} }
$watchVideo.attr('href', videoUrl); $watchVideo.attr('href', videoUrl);
@ -81,6 +89,9 @@
var $inputPorts = $currentWizardStep.find('.input-ports'); var $inputPorts = $currentWizardStep.find('.input-ports');
var $outputPorts = $currentWizardStep.find('.output-ports'); var $outputPorts = $currentWizardStep.find('.output-ports');
var $scoreReport = $currentWizardStep.find('.results'); var $scoreReport = $currentWizardStep.find('.results');
var $latencyScore = $scoreReport.find('.latency-score');
var $ioRateScore = $scoreReport.find('.io-rate-score');
var $ioVarScore = $scoreReport.find('.io-var-score');
var $nextButton = $ftueButtons.find('.btn-next'); var $nextButton = $ftueButtons.find('.btn-next');
// should return one of: // should return one of:
@ -91,24 +102,24 @@
// * Win32_asio4all // * Win32_asio4all
// * Linux // * Linux
function determineDeviceType(deviceId, displayName) { function determineDeviceType(deviceId, displayName) {
if(operatingSystem == "MacOSX") { if (operatingSystem == "MacOSX") {
if(displayName.toLowerCase().trim() == "built-in") { if (displayName.toLowerCase().trim() == "built-in") {
return "MacOSX_builtin"; return "MacOSX_builtin";
} }
else { else {
return "MacOSX_interface"; return "MacOSX_interface";
} }
} }
else if(operatingSystem == "Win32") { else if (operatingSystem == "Win32") {
if(context.jamClient.FTUEIsMusicDeviceWDM(deviceId)) { if (context.jamClient.FTUEIsMusicDeviceWDM(deviceId)) {
return "Win32_wdm"; return "Win32_wdm";
} }
else if(displayName.toLowerCase().indexOf("asio4all") > -1) { else if (displayName.toLowerCase().indexOf("asio4all") > -1) {
return "Win32_asio4all" return "Win32_asio4all"
} }
else { else {
return "Win32_asio"; return "Win32_asio";
} }
} }
else { else {
return "Linux"; return "Linux";
@ -122,25 +133,27 @@
var loadedDevices = {}; var loadedDevices = {};
// augment these devices by determining their type // augment these devices by determining their type
context._.each(devices, function(displayName, deviceId) { context._.each(devices, function (displayName, deviceId) {
var deviceInfo = {}; var deviceInfo = {};
deviceInfo.id = deviceId; deviceInfo.id = deviceId;
deviceInfo.type = determineDeviceType(deviceId, displayName); deviceInfo.type = determineDeviceType(deviceId, displayName);
deviceInfo.displayType = audioDeviceBehavior[deviceInfo.type].display; deviceInfo.displayType = audioDeviceBehavior[deviceInfo.type].display;
deviceInfo.displayName = deviceInfo.displayName; deviceInfo.displayName = displayName;
loadedDevices[deviceId] = deviceInfo; loadedDevices[deviceId] = deviceInfo;
logger.debug("loaded device: ", deviceInfo);
}) })
deviceInformation = context._.keys(loadedDevices).sort(); deviceInformation = loadedDevices;
logger.debug(context.JK.dlen(deviceInformation) + " devices loaded." , deviceInformation); logger.debug(context.JK.dlen(deviceInformation) + " devices loaded.", deviceInformation);
} }
// returns a deviceInfo hash for the device matching the deviceId, or null. // returns a deviceInfo hash for the device matching the deviceId, or undefined.
function findDevice(deviceId) { function findDevice(deviceId) {
return {}; return deviceInformation[deviceId];
} }
function selectedAudioInput() { function selectedAudioInput() {
@ -164,22 +177,21 @@
} }
function initializeNextButtonState() { function initializeNextButtonState() {
console.log(context.jamClient.FTUEGetDevices(false));
console.log("chat devices", jamClient.FTUEGetChatInputs());
$nextButton.removeClass('button-orange button-grey'); $nextButton.removeClass('button-orange button-grey');
if(validScore) $nextButton.addClass('button-orange'); if (validScore) $nextButton.addClass('button-orange');
else $nextButton.addClass('button-grey'); else $nextButton.addClass('button-grey');
} }
function initializeAudioInput() { function initializeAudioInput() {
var optionsHtml = ''; var optionsHtml = '';
optionsHtml = '<option selected="selected" value="">Choose...</option>'; optionsHtml = '<option selected="selected" value="">Choose...</option>';
context._.each(deviceInformation, function(deviceInfo, deviceId) { context._.each(deviceInformation, function (deviceInfo, deviceId) {
console.log(arguments)
optionsHtml += '<option title="' + deviceInfo.displayName + '" value="' + deviceId + '">' + deviceInfo.displayName + '</option>'; optionsHtml += '<option title="' + deviceInfo.displayName + '" value="' + deviceId + '">' + deviceInfo.displayName + '</option>';
}); });
$audioInput.html(optionsHtml); $audioInput.html(optionsHtml);
alert(optionsHtml)
context.JK.dropdown($audioInput); context.JK.dropdown($audioInput);
initializeAudioInputChanged(); initializeAudioInputChanged();
@ -188,7 +200,7 @@
function initializeAudioOutput() { function initializeAudioOutput() {
var optionsHtml = ''; var optionsHtml = '';
optionsHtml = '<option selected="selected" value="">Same as Input...</option>'; optionsHtml = '<option selected="selected" value="">Same as Input...</option>';
context._.each(deviceInformation, function(deviceInfo, deviceId) { context._.each(deviceInformation, function (deviceInfo, deviceId) {
optionsHtml += '<option title="' + deviceInfo.displayName + '" value="' + deviceId + '">' + deviceInfo.displayName + '</option>'; optionsHtml += '<option title="' + deviceInfo.displayName + '" value="' + deviceId + '">' + deviceInfo.displayName + '</option>';
}); });
$audioOutput.html(optionsHtml); $audioOutput.html(optionsHtml);
@ -198,11 +210,146 @@
} }
function initializeFramesize() { function initializeFramesize() {
context.JK.dropdown($frameSize);
}
function initializeBuffers() {
context.JK.dropdown($bufferIn);
context.JK.dropdown($bufferOut);
}
// finds out if the $port argument is from a different port pair than what's currently selected
function isNewlySelectedPair($port) {
var portId = $port.attr('data-id');
// get all inputs currently selected except this one
var $selectedInputs = $inputPorts.find('input[type="checkbox"]:checked').filter('[data-id="' + portId + '"]');
console.log("$selectedInputs", $selectedInputs);
var isNewlySelected = true;
context._.each($selectedInputs, function($current) {
var testPairInfo = $($current).data('pair');
context._.each(testPairInfo.ports, function(port) {
// if we can find the newly selected item in this pair, then it's not a different pair...
if(port.id == portId) {
isNewlySelected = false;
return false; // break loop
}
});
if(isNewlySelected) return false; // break loop
});
return isNewlySelected;
}
// set checkbox state for all items in the pair
function setCheckedForAllInPair($portBox, pairInfo, checked, signalBackend) {
context._.each(pairInfo.ports, function(port) {
var portId = port.id;
var $input = $portBox.find('input[type="checkbox"][data-id="' + portId + '"]');
if($input.is(':checked') != checked) {
if(checked) {
$input.iCheck('check').attr('checked', 'checked');
//context.jamClient.FTUESetMusicInput2($input.id);
}
else {
$input.iCheck('uncheck').removeAttr('checked');
//context.jamClient.FTUEUnsetMusicInput2($input.id);
}
}
})
}
function inputPortChanged() {
if(iCheckIgnore) return;
var $checkbox = $(this);
var portId = $checkbox.data('data-id');
var inputPortChecked = $checkbox.is(':checked');
console.log('inputPortChecked: ' + inputPortChecked);
if(inputPortChecked) {
if(isNewlySelectedPair($checkbox)) {
setCheckedForAllInPair($inputPorts, $checkbox.data('pair'), true, true);
}
else {
//context.jamClient.FTUESetMusicInput2($input.id);
}
}
else {
// context.jamClient.FTUEUnsetMusicInput2($input.id);;
}
}
// should be called in a ifChanged callback if you want to cancel. bleh.
function cancelICheckChange($checkbox) {
iCheckIgnore = true;
var checked = $checkbox.is(':checked');
setTimeout(function() {
if(checked) $checkbox.iCheck('uncheck').removeAttr('checked');
else $checkbox.iCheck('check').attr('checked', 'checked');
iCheckIgnore = false;
}, 1);
}
function outputPortChanged() {
if(iCheckIgnore) return;
var $checkbox = $(this);
var portId = $checkbox.data('data-id');
var outputPortChecked = $checkbox.is(':checked');
console.log('outputPortChecked: ' + outputPortChecked);
if(outputPortChecked) {
var $selectedInputs = $outputPorts.find('input[type="checkbox"]:checked').filter('[data-id="' + portId + '"]');
$selectedInputs.iCheck('uncheck').removeAttr('checked');
var pairInfo = $checkbox.data('pair');
setCheckedForAllInPair($outputPorts, pairInfo, true, false);
console.log("Setting music output");
context.jamClient.FTUESetMusicOutput(pairInfo.ports.map(function(i) {return i.id}).join(PROFILE_DEV_SEP_TOKEN));
}
else {
context.JK.Banner.showAlert('You must have at least one output pair selected.');
// can't allow uncheck of last output
cancelICheckChange($checkbox);
}
}
function initializeInputPorts(inputPorts) {
context._.each(inputPorts, function(inputPairs) {
// there is no guarantee that a pair has two items.
context._.each(inputPairs.ports, function(inputInPair) {
var inputPort = $(context._.template($templateAudioPort.html(), inputInPair, { variable: 'data' }));
var $checkbox = inputPort.find('input');
$checkbox.data('pair', inputPairs); // so when it's selected, we can see what other ports, if any, are in the same pair
context.JK.checkbox($checkbox);
$checkbox.on('ifChanged', inputPortChanged);
$inputPorts.append(inputPort);
});
});
}
function initializeOutputPorts(outputPorts) {
var first = true;
context._.each(outputPorts, function(outputPairs) {
context._.each(outputPairs.ports, function(outputInPair) {
var outputPort = $(context._.template($templateAudioPort.html(), outputInPair, { variable: 'data' }));
var $checkbox = outputPort.find('input');
$checkbox.data('pair', outputPairs); // so when it's selected, we can see what other ports, if any, are in the same pair
context.JK.checkbox($checkbox);
$checkbox.on('ifChanged', outputPortChanged);
$outputPorts.append(outputPort);
});
if(first) {
first = false;
setCheckedForAllInPair($outputPorts, outputPairs, true, false);
}
});
} }
function initializeFormElements() { function initializeFormElements() {
if(!deviceInformation) throw "devices are not initialized"; if (!deviceInformation) throw "devices are not initialized";
initializeAudioInput(); initializeAudioInput();
initializeAudioOutput(); initializeAudioOutput();
@ -225,7 +372,9 @@
} }
function resetScoreReport() { function resetScoreReport() {
$scoreReport.empty(); $ioRateScore.empty();
$ioVarScore.empty();
$latencyScore.empty();
} }
function updateScoreReport(latencyResult) { function updateScoreReport(latencyResult) {
@ -233,9 +382,9 @@
var latencyValue = 'N/A'; var latencyValue = 'N/A';
var validLatency = false; var validLatency = false;
if (latencyResult && latencyResult.latencyknown) { if (latencyResult && latencyResult.latencyknown) {
var latency = latencyResult.latency; var latencyValue = latencyResult.latency;
latencyValue = Math.round(latencyValue * 100) / 100; latencyValue = Math.round(latencyValue * 100) / 100;
if (latency.latency <= 10) { if (latencyValue <= 10) {
latencyClass = "good"; latencyClass = "good";
validLatency = true; validLatency = true;
} else if (latency.latency <= 20) { } else if (latency.latency <= 20) {
@ -248,57 +397,9 @@
validScore = validLatency; // validScore may become based on IO variance too validScore = validLatency; // validScore may become based on IO variance too
$scoreReport.html(latencyValue); $latencyScore.html(latencyValue + ' ms');
} }
function loadAudioDrivers() {
var drivers = context.jamClient.FTUEGetDevices(false);
var chatDrivers = jamClient.FTUEGetChatInputs();
var optionsHtml = '<option selected="selected" value="">Choose...</option>';
var chatOptionsHtml = '<option selected="selected" value="">Choose...</option>';
var driverOptionFunc = function (driverKey, index, list) {
if(!drivers[driverKey]) {
logger.debug("skipping unknown device:", driverKey)
}
else {
optionsHtml += '<option title="' + drivers[driverKey] + '" value="' + driverKey + '">' + drivers[driverKey] + '</option>';
}
};
var chatOptionFunc = function (driverKey, index, list) {
chatOptionsHtml += '<option value="' + driverKey + '">' + chatDrivers[driverKey]+ '</option>';
};
var selectors = [
'[layout-wizard-step="0"] .settings-2-device select',
'[layout-wizard-step="2"] .settings-driver select'
];
// handle standard devices
var sortedDeviceKeys = context._.keys(drivers).sort();
context._.each(sortedDeviceKeys, driverOptionFunc);
$.each(selectors, function (index, selector) {
var $select = $(selector);
$select.empty();
$select.html(optionsHtml);
context.JK.dropdown($select);
});
selectors = ['[layout-wizard-step="0"] .settings-2-voice select'];
var sortedVoiceDeviceKeys = context._.keys(chatDrivers).sort();
// handle voice inputs
context._.each(sortedVoiceDeviceKeys, chatOptionFunc);
$.each(selectors, function (index, selector) {
var $select = $(selector);
$select.empty();
$select.html(chatOptionsHtml);
context.JK.dropdown($select);
});
}
function audioInputDeviceUnselected() { function audioInputDeviceUnselected() {
validScore = false; validScore = false;
initializeNextButtonState(); initializeNextButtonState();
@ -362,16 +463,16 @@
} }
function initializeWatchVideo() { function initializeWatchVideo() {
$watchVideoInput.unbind('click').click(function() { $watchVideoInput.unbind('click').click(function () {
var audioDevice = findDevice(selectedAudioInput()); var audioDevice = findDevice(selectedAudioInput());
if(!audioDevice) { if (!audioDevice) {
context.JK.Banner.showAlert('You must first choose an Audio Input Device so that we can determine which video to show you.'); context.JK.Banner.showAlert('You must first choose an Audio Input Device so that we can determine which video to show you.');
} }
else { else {
var videoURL = audioDeviceBehavior[audioDevice.type].videoURL; var videoURL = audioDeviceBehavior[audioDevice.type].videoURL;
if(videoURL) { if (videoURL) {
$(this).attr('href', videoURL); $(this).attr('href', videoURL);
return true; return true;
} }
@ -383,16 +484,16 @@
return false; return false;
}); });
$watchVideoOutput.unbind('click').click(function() { $watchVideoOutput.unbind('click').click(function () {
var audioDevice = findDevice(selectedAudioOutput()); var audioDevice = findDevice(selectedAudioOutput());
if(!audioDevice) { if (!audioDevice) {
throw "this button should be hidden"; throw "this button should be hidden";
} }
else { else {
var videoURL = audioDeviceBehavior[audioDevice.type].videoURL; var videoURL = audioDeviceBehavior[audioDevice.type].videoURL;
if(videoURL) { if (videoURL) {
$(this).attr('href', videoURL); $(this).attr('href', videoURL);
return true; return true;
} }
@ -406,35 +507,52 @@
} }
function initializeAudioInputChanged() { function initializeAudioInputChanged() {
$audioInput.unbind('change').change(function(evt) { $audioInput.unbind('change').change(function (evt) {
var audioDeviceId = selectedAudioInput(); var audioDeviceId = selectedAudioInput();
if(!audioDeviceId) { if (!audioDeviceId) {
audioInputDeviceUnselected(); audioInputDeviceUnselected();
return false; return false;
} }
var audioDevice = findDevice(selectedAudioInput()); var audioDevice = findDevice(selectedAudioInput());
if(!audioDevice) { if (!audioDevice) {
context.JK.alertSupportedNeeded('Unable to find device information for: ' + audioDeviceId); context.JK.alertSupportedNeeded('Unable to find device information for: ' + audioDeviceId);
return false; return false;
} }
renderScoringStarted();
jamClient.FTUESetMusicDevice(audioDeviceId);
jamClient.FTUESetInputLatency(selectedAudioInput());
jamClient.FTUESetOutputLatency(selectedAudioOutput());
jamClient.FTUESetFrameSize(selectedFramesize());
logger.debug("Calling FTUESave(false)"); renderScoringStarted();
jamClient.FTUESave(false);
var latency = jamClient.FTUEGetExpectedLatency(); jamClient.FTUESetMusicDevice(audioDeviceId);
console.log("FTUEGetExpectedLatency: %o", latency);
renderScoringStopped(); // enumerate input and output ports
}); musicInputPorts = jamClient.FTUEGetMusicInputs2();
console.log(JSON.stringify(musicInputPorts));
// [{"inputs":[{"id":"i~5~Built-in Microph~0~0","name":"Built-in Microph - Left"},{"id":"i~5~Built-in Microph~1~0","name":"Built-in Microph - Right"}]}]
musicOutputPorts = jamClient.FTUEGetMusicOutputs2();
console.log(JSON.stringify(musicOutputPorts));
// [{"outputs":[{"id":"o~5~Built-in Output~0~0","name":"Built-in Output - Left"},{"id":"o~5~Built-in Output~1~0","name":"Built-in Output - Right"}]}]
initializeInputPorts(musicInputPorts);
initializeOutputPorts(musicOutputPorts);
jamClient.FTUESetInputLatency(selectedAudioInput());
jamClient.FTUESetOutputLatency(selectedAudioOutput());
jamClient.FTUESetFrameSize(selectedFramesize());
logger.debug("Calling FTUESave(false)");
jamClient.FTUESave(false);
var latency = jamClient.FTUEGetExpectedLatency();
console.log("FTUEGetExpectedLatency: %o", latency);
updateScoreReport(latency);
renderScoringStopped();
});
} }
function initializeAudioOutputChanged() { function initializeAudioOutputChanged() {
@ -498,7 +616,9 @@
function beforeShowStep($step) { function beforeShowStep($step) {
var stepInfo = STEPS[step]; var stepInfo = STEPS[step];
if(!stepInfo) {throw "unknown step: " + step;} if (!stepInfo) {
throw "unknown step: " + step;
}
stepInfo.beforeShow.call(self); stepInfo.beforeShow.call(self);
} }
@ -511,7 +631,7 @@
$currentWizardStep = $nextWizardStep; $currentWizardStep = $nextWizardStep;
var $ftueSteps = $(context._.template($templateSteps.html(), {}, { variable: 'data' })); var $ftueSteps = $(context._.template($templateSteps.html(), {}, { variable: 'data' }));
var $activeStep = $ftueSteps.find('.ftue-stepnumber[data-step-number="'+ step +'"]'); var $activeStep = $ftueSteps.find('.ftue-stepnumber[data-step-number="' + step + '"]');
$activeStep.addClass('.active'); $activeStep.addClass('.active');
$activeStep.next().show(); // show the .ftue-step-title $activeStep.next().show(); // show the .ftue-step-title
$currentWizardStep.find('.ftuesteps').replaceWith($ftueSteps); $currentWizardStep.find('.ftuesteps').replaceWith($ftueSteps);
@ -528,11 +648,11 @@
var $btnCancel = $ftueButtonsContent.find('.btn-cancel'); var $btnCancel = $ftueButtonsContent.find('.btn-cancel');
// hide back button if 1st step or last step // hide back button if 1st step or last step
if(step == 0 && step == TOTAL_STEPS - 1) { if (step == 0 && step == TOTAL_STEPS - 1) {
$btnBack.hide(); $btnBack.hide();
} }
// hide next button if not on last step // hide next button if not on last step
if (step == TOTAL_STEPS - 1 ) { if (step == TOTAL_STEPS - 1) {
$btnNext.hide(); $btnNext.hide();
} }
// hide close if on last step // hide close if on last step
@ -559,7 +679,7 @@
function beforeShow(args) { function beforeShow(args) {
step = args.d1; step = args.d1;
if(!step) step = 0; if (!step) step = 0;
step = parseInt(step); step = parseInt(step);
moveToStep(); moveToStep();
} }
@ -573,14 +693,14 @@
} }
function back() { function back() {
if($(this).is('.button-grey')) return; if ($(this).is('.button-grey')) return;
step = step - 1; step = step - 1;
moveToStep(); moveToStep();
return false; return false;
} }
function next() { function next() {
if($(this).is('.button-grey')) return; if ($(this).is('.button-grey')) return;
step = step + 1; step = step + 1;
@ -599,6 +719,7 @@
function route() { function route() {
} }
function initialize() { function initialize() {
var dialogBindings = { beforeShow: beforeShow, afterShow: afterShow, afterHide: afterHide }; var dialogBindings = { beforeShow: beforeShow, afterShow: afterShow, afterHide: afterHide };
@ -609,6 +730,7 @@
$wizardSteps = $dialog.find('.wizard-step'); $wizardSteps = $dialog.find('.wizard-step');
$templateSteps = $('#template-ftuesteps'); $templateSteps = $('#template-ftuesteps');
$templateButtons = $('#template-ftue-buttons'); $templateButtons = $('#template-ftue-buttons');
$templateAudioPort = $('#template-audio-port');
$ftueButtons = $dialog.find('.ftue-buttons'); $ftueButtons = $dialog.find('.ftue-buttons');
operatingSystem = context.jamClient.GetOSAsString(); operatingSystem = context.jamClient.GetOSAsString();

View File

@ -184,8 +184,30 @@
width:45%; width:45%;
} }
.buffers {
.easydropdown-wrapper:nth-of-type(1) {
left:5px;
}
.easydropdown-wrapper:nth-of-type(2) {
left:35px;
}
.easydropdown, .easydropdown-wrapper {
width:15px;
}
}
.ftue-box.results { .ftue-box.results {
height: 230px !important; height: 230px !important;
padding:0;
.scoring-section {
font-size:15px;
@include border_box_sizing;
height:64px;
}
} }
.audio-output { .audio-output {
@ -510,8 +532,8 @@
.subcolumn.third { .subcolumn.third {
right:0px; right:0px;
} }
} }
.settings-controls { .settings-controls {
clear:both; clear:both;

View File

@ -558,4 +558,9 @@ hr {
width:100%; width:100%;
height:20px; height:20px;
text-align:center; text-align:center;
}
body.jam .icheckbox_minimal {
display:inline-block;
position:relative;
} }

View File

@ -83,6 +83,15 @@
.wizard-step-column .wizard-step-column
%h2 Test Results %h2 Test Results
.ftue-box.results .ftue-box.results
.left.w50.gold-fill.center.white.scoring-section
.p5
.latency LATENCY
%span.latency-score
.left.w50.green-fill.center.white.scoring-section
.p5
.io I/O
%span.io-rate-score
%span.io-var-score
.clearall .clearall
@ -195,5 +204,11 @@
%a.button-orange.btn-next{href:'#'} NEXT %a.button-orange.btn-next{href:'#'} NEXT
%a.button-orange.btn-close{href:'#', 'layout-action' => 'close'} CLOSE %a.button-orange.btn-close{href:'#', 'layout-action' => 'close'} CLOSE
%script{type: 'text/template', id: 'template-audio-port'}
.audio-port
%input{ type: 'checkbox', 'data-id' => '{{data.id}}' }
%span
= '{{data.name}}'

View File

@ -7,12 +7,14 @@
<![endif]--> <![endif]-->
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script> <script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
<script> <script>
WebFont.load({ if (window.WebFont) {
google: { WebFont.load({
families: ['Raleway:100,200,300,400,500,600,700'] google: {
}, families: ['Raleway:100,200,300,400,500,600,700']
timeout :5000 },
}); timeout :5000
});
}
</script> </script>
<!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>--> <!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>-->
<%= stylesheet_link_tag "client/client", media: "all" %> <%= stylesheet_link_tag "client/client", media: "all" %>

View File

@ -4,12 +4,14 @@
<title><%= full_title(yield(:title)) %></title> <title><%= full_title(yield(:title)) %></title>
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script> <script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
<script> <script>
WebFont.load({ if (window.WebFont) {
google: { WebFont.load({
families: ['Raleway:100,200,300,400,500,600,700'] google: {
}, families: ['Raleway:100,200,300,400,500,600,700']
timeout :5000 },
}); timeout :5000
});
}
</script> </script>
<!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>--> <!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

View File

@ -8,12 +8,14 @@
<![endif]--> <![endif]-->
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script> <script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
<script> <script>
WebFont.load({ if(window.WebFont){
google: { WebFont.load({
families: ['Raleway:100,200,300,400,500,600,700'] google: {
}, families: ['Raleway:100,200,300,400,500,600,700']
timeout :5000 },
}); timeout :5000
});
}
</script> </script>
<!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>--> <!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>-->
<%= stylesheet_link_tag "landing/landing", media: "all" %> <%= stylesheet_link_tag "landing/landing", media: "all" %>

View File

@ -8,12 +8,14 @@
<![endif]--> <![endif]-->
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script> <script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
<script> <script>
WebFont.load({ if (window.WebFont) {
google: { WebFont.load({
families: ['Raleway:100,200,300,400,500,600,700'] google: {
}, families: ['Raleway:100,200,300,400,500,600,700']
timeout :5000 },
}); timeout :5000
});
}
</script> </script>
<!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>--> <!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>-->
<%= stylesheet_link_tag "minimal/minimal", media: "all" %> <%= stylesheet_link_tag "minimal/minimal", media: "all" %>

View File

@ -8,12 +8,14 @@
<![endif]--> <![endif]-->
<script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script> <script src="//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js"></script>
<script> <script>
WebFont.load({ if (window.WebFont) {
google: { WebFont.load({
families: ['Raleway:100,200,300,400,500,600,700'] google: {
}, families: ['Raleway:100,200,300,400,500,600,700']
timeout:5000 },
}); timeout:5000
});
}
</script> </script>
<!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>--> <!--<link href='http://fonts.googleapis.com/css?family=Raleway:100,200,300,400,500,600,700' rel='stylesheet' type='text/css'>-->
<%= stylesheet_link_tag "web/web", media: "all" %> <%= stylesheet_link_tag "web/web", media: "all" %>