diff --git a/web/app/assets/javascripts/dialog/singlePlayerProfileGuard.js.coffee b/web/app/assets/javascripts/dialog/singlePlayerProfileGuard.js.coffee index 4c54d1a06..4f9375b7e 100644 --- a/web/app/assets/javascripts/dialog/singlePlayerProfileGuard.js.coffee +++ b/web/app/assets/javascripts/dialog/singlePlayerProfileGuard.js.coffee @@ -24,15 +24,34 @@ context.JK.SinglePlayerProfileGuardDialog = class SinglePlayerProfileGuardDialog @audioLatency = @dialog.find('.audio-latency') @btnPrivateSession = @dialog.find('.btn-private-session') @btnGearSetup = @dialog.find('.btn-gear-setup') + @btnRescan = @dialog.find('.btn-rescan') + @rescanningNotice = @dialog.find('.rescanning-notice') @btnPrivateSession.on('click', @onPrivateSessionChoice) @btnGearSetup.on('click', @onGearSetupChoice) + @btnRescan.on('click', @onRescan) beforeShow:() => @dialog.data('result', { choice: null}) - afterShow:() => + onRescan: () => + @gearUtils.scheduleAudioRestart('single-player-guard', 1000, @beforeScan, @afterScan) + + beforeScan: () => + @dialog.find('.action-buttons a').addClass('disabled') + @rescanningNotice.show(); + + afterScan: (canceled) => + @dialog.find('.action-buttons a').removeClass('disabled') + @rescanningNotice.hide(); + + if !canceled + result = context.jamClient.ReloadAudioSystem(true, true, true); + + @refresh(); + + refresh:() => canPlayWithOthers = @gearUtils.canPlayWithOthers() if canPlayWithOthers.isNoInputProfile @@ -46,6 +65,11 @@ context.JK.SinglePlayerProfileGuardDialog = class SinglePlayerProfileGuardDialog @audioLatency.text("#{latency} milliseconds.") + afterShow:() => + @refresh() + + + onPrivateSessionChoice: () => @dialog.data('result', { choice: 'private_session'}) @app.layout.closeDialog(@dialogId) diff --git a/web/app/assets/javascripts/playbackControls.js b/web/app/assets/javascripts/playbackControls.js index fb82ab0c6..2aeaf0632 100644 --- a/web/app/assets/javascripts/playbackControls.js +++ b/web/app/assets/javascripts/playbackControls.js @@ -54,6 +54,13 @@ var monitorPlaybackTimeout = null; var playbackMonitorMode = PLAYBACK_MONITOR_MODE.MEDIA_FILE; + function init() { + updateSliderPosition(0); + updateDurationTime(0); + updateCurrentTime(0); + seenActivity = false; + } + function startPlay() { seenActivity = false; updateIsPlaying(true); @@ -349,6 +356,9 @@ function startMonitor(_playbackMonitorMode) { + // resets everything to zero + init(); + if(_playbackMonitorMode === undefined || _playbackMonitorMode === null) { playbackMonitorMode = PLAYBACK_MONITOR_MODE.MEDIA_FILE; } diff --git a/web/app/assets/javascripts/scheduled_session.js.erb b/web/app/assets/javascripts/scheduled_session.js.erb index f2c07b7bc..707d63554 100644 --- a/web/app/assets/javascripts/scheduled_session.js.erb +++ b/web/app/assets/javascripts/scheduled_session.js.erb @@ -937,12 +937,6 @@ } } - if(optionRequiresMultiplayerProfile()) { - if(context.JK.guardAgainstSinglePlayerProfile(app).canPlay == false) { - return false; - } - } - var valid = beforeMoveStep(); if (!valid) { return false; diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index d7246dd5d..58cfb6f93 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1273,9 +1273,10 @@ }); } - function renderJamTracks(jamTrackMixers) { + function renderJamTracks(jamTrackMixersOrig) { logger.debug("rendering jam tracks") + var jamTrackMixers = jamTrackMixersOrig.slice(); var jamTracks = [] var jamTrackName = 'JamTrack'; if(sessionModel.isPlayingRecording()) { @@ -1305,7 +1306,7 @@ var preMasteredClass = ""; // find the track or tracks that correspond to the mixer var correspondingTracks = [] - $.each(jamTrackMixers, function(i, matchMixer) { + $.each(jamTrackMixersOrig, function(i, matchMixer) { if(matchMixer.id == jamTrack.id) { correspondingTracks.push(jamTrack); mixer = matchMixer; @@ -1327,6 +1328,9 @@ return $.inArray(value, correspondingTracks) < 0; }); + // prune found mixers + jamTrackMixers.splice(mixer); + var oneOfTheTracks = correspondingTracks[0]; var instrumentIcon = context.JK.getInstrumentIcon45(oneOfTheTracks.instrument.id); var photoUrl = "/assets/content/icon_recording.png"; @@ -2626,6 +2630,13 @@ } function checkPendingMetronome() { + + if(sessionModel.jamTracks() !== null || sessionModel.recordedJamTracks() !== null) { + // ignore all metronome events when jamtracks are open, because backend opens metronome mixer to play jamtrack tap-ins + logger.debug("ignore checkPendingMetronome because JamTrack is open") + return; + } + //logger.debug("checkPendingMetronome", sessionModel.isMetronomeOpen(), getMetronomeMasterMixers().length) if(sessionModel.isMetronomeOpen() && getMetronomeMasterMixers().length == 0) { var pendingMetronome = $($templatePendingMetronome.html()) @@ -3157,7 +3168,8 @@ function showFTUEWhenNoInputs( ) { //app.afterFtue = function() { window.location.reload }; - app.layout.startNewFtue(); + //app.layout.startNewFtue(); + window.location = '/client#/account/audio' } function events() { @@ -3177,7 +3189,8 @@ if(gearUtils.isNoInputProfile()) { // show FTUE - showFTUEWhenNoInputs(); + // showFTUEWhenNoInputs(); + app.notify({title:'Settings Disabled', text:'You can not alter any settings for the System Default playback device.'}) return false; } else { diff --git a/web/app/assets/javascripts/wizard/gear_utils.js b/web/app/assets/javascripts/wizard/gear_utils.js index f69f2411f..d5c70d9a1 100644 --- a/web/app/assets/javascripts/wizard/gear_utils.js +++ b/web/app/assets/javascripts/wizard/gear_utils.js @@ -34,6 +34,14 @@ // as well have a score below 20 ms gearUtils.canPlayWithOthers = function(profile) { + if(gon.global.gear_check_reload_audio) { + if (!context.jamClient.IsAudioStarted()) { + context.jamClient.ReloadAudioSystem(true, true, true); + context.jamClient.StopAudio(); + } + } + + var isNoInputProfile = gearUtils.isNoInputProfile(profile); var expectedLatency = context.jamClient.FTUEGetExpectedLatency(); var audioLatency = expectedLatency ? expectedLatency.latency : null; diff --git a/web/app/assets/stylesheets/client/session.css.scss b/web/app/assets/stylesheets/client/session.css.scss index b400ecbc4..9ae737552 100644 --- a/web/app/assets/stylesheets/client/session.css.scss +++ b/web/app/assets/stylesheets/client/session.css.scss @@ -234,7 +234,7 @@ $mytracks-minwidth: 180px; $livetracks-minwidth:180px; $otheraudio-minwidth:195px; - $otheraudio-open-minwidth:230px; + $otheraudio-open-minwidth:260px; #session-mytracks-notracks { display:none; diff --git a/web/app/assets/stylesheets/dialogs/singlePlayerProfileGuard.css.scss b/web/app/assets/stylesheets/dialogs/singlePlayerProfileGuard.css.scss index 89eedac9a..92e5f451d 100644 --- a/web/app/assets/stylesheets/dialogs/singlePlayerProfileGuard.css.scss +++ b/web/app/assets/stylesheets/dialogs/singlePlayerProfileGuard.css.scss @@ -26,4 +26,13 @@ p { line-height:125%; } + + .rescanning-notice { + display:none; + + span.spinner-small { + display:inline-block; + vertical-align: middle; + } + } } \ No newline at end of file diff --git a/web/app/views/dialogs/_recordingFinishedDialog.html.haml b/web/app/views/dialogs/_recordingFinishedDialog.html.haml index aa8c7e2d2..bbbdfa701 100644 --- a/web/app/views/dialogs/_recordingFinishedDialog.html.haml +++ b/web/app/views/dialogs/_recordingFinishedDialog.html.haml @@ -21,7 +21,8 @@ %br/ %select{:name => "genre"} .field.w100.left{:purpose => "description"} - %label{:for => "description"}=Rails.application.config.video_available + %label{:for => "description"} Description: + %br/ %textarea#claim-recording-description.w100{:name => "description"} -if (Rails.application.config.video_available=="full") || (current_user && current_user.admin) .field.left{:purpose => "save_video"} diff --git a/web/app/views/dialogs/_singlePlayerProfileGuard.html.slim b/web/app/views/dialogs/_singlePlayerProfileGuard.html.slim index d7c1628d3..13c8a8945 100644 --- a/web/app/views/dialogs/_singlePlayerProfileGuard.html.slim +++ b/web/app/views/dialogs/_singlePlayerProfileGuard.html.slim @@ -17,6 +17,10 @@ br | With this profile, you can't play with others in real-time. However, you can play with JamTracks and backing tracks by yourself in a private session, or go to the gear setup wizard and add a new audio profile that uses your gear. .right.action-buttons + span.rescanning-notice + span.spinner-small + | Rescanning... a.button-grey.btn-cancel href='#' layout-action="cancel" CANCEL + a.button-grey.btn-rescan.hidden href='#' RESCAN a.button-grey.btn-gear-setup href="/client#/account/audio" GO TO GEAR SETUP a.button-orange.btn-private-session href="#" PRIVATE SESSION \ No newline at end of file diff --git a/web/config/application.rb b/web/config/application.rb index ad3aff3e3..9a21433ce 100644 --- a/web/config/application.rb +++ b/web/config/application.rb @@ -332,5 +332,6 @@ if defined?(Bundler) config.alerts_api_enabled = true config.gear_check_ignore_high_latency = false + config.gear_check_reload_audio = true end end diff --git a/web/config/initializers/gon.rb b/web/config/initializers/gon.rb index ff5a4d74f..f9eb797f6 100644 --- a/web/config/initializers/gon.rb +++ b/web/config/initializers/gon.rb @@ -14,4 +14,5 @@ Gon.global.recurly_public_api_key = Rails.application.config.recurly_public_api_ Gon.global.one_free_jamtrack_per_user = Rails.application.config.one_free_jamtrack_per_user Gon.global.video_available = Rails.application.config.video_available Gon.global.gear_check_ignore_high_latency = Rails.application.config.gear_check_ignore_high_latency +Gon.global.gear_check_reload_audio = Rails.application.config.gear_check_reload_audio Gon.global.env = Rails.env