From 1dbfdf0546b65eb5941bd21413ead6956468f4ee Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 10:45:10 -0600 Subject: [PATCH 1/7] * VRFS-2811 - read loop state when drawing track --- web/app/assets/javascripts/session.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 91e5565d6..018b8e72a 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1045,6 +1045,7 @@ gainPercent: 0, muteClass: 'muted', showLoop: isOpener && !sessionModel.isPlayingRecording(), + loopState: mixer.loop, mixerId: "", avatarClass: 'avatar-recording', preMasteredClass: "" @@ -1795,7 +1796,8 @@ if(trackData.showLoop) { var $trackIconLoop = $track.find('.track-icon-loop') - var $trackIconLoopCheckbox = $trackIconLoop.find('input') + var $trackIconLoopCheckbox = $trackIconLoop.find('input'); + $trackIconLoopCheckbox.prop('checked', trackData.loopState); context.JK.checkbox($trackIconLoopCheckbox) $trackIconLoopCheckbox.on('ifChanged', function() { From ae920c5a1a82953a22697b0da2580af0d6dc61ac Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 10:56:22 -0600 Subject: [PATCH 2/7] * stop play issued before close of backing track --- web/app/assets/javascripts/session.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 018b8e72a..19078c5f3 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -2474,6 +2474,7 @@ }); // '' closes all open backing tracks + context.jamClient.SessionStopPlay(); context.jamClient.SessionCloseBackingTrackFile(''); return false; From d89e2f8e569d70e94d45308316ad4d94a19a60f6 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 15:00:57 -0600 Subject: [PATCH 3/7] * VRFS-2818 - mute and volume faders control both mixer/personal simultaneously. more work required for moving of input tracks affecting backing tracks personal mix --- web/app/assets/javascripts/session.js | 56 +++++++++++++++++-------- web/app/views/clients/_help.html.slim | 2 +- web/app/views/dialogs/_banner.html.slim | 2 +- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 19078c5f3..d91ebf0d5 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -578,7 +578,6 @@ function _updateMixers() { masterMixers = context.jamClient.SessionGetAllControlState(true); personalMixers = context.jamClient.SessionGetAllControlState(false); - context.jamClient //logger.debug("masterMixers", masterMixers) //logger.debug("personalMixers", personalMixers) @@ -602,10 +601,15 @@ var personalMixer = personalMixers[i]; if(personalMixer.group_id == ChannelGroupIds.MediaTrackGroup) { - continue; + // the reason we do this is because some media tracks have same ID in both master and personal moe + personalMixer.uniqueId = 'P--' + personalMixer.id + allMixers[personalMixer.uniqueId] = personalMixer + } + else { + allMixers[personalMixer.id] = personalMixer + } - allMixers[personalMixer.id] = personalMixer // populate other side of mixer pair @@ -1021,6 +1025,9 @@ // if it's a locally opened track (MediaTrackGroup), then we can say this person is the opener var isOpener = mixer.group_id == ChannelGroupIds.MediaTrackGroup; + if(isOpener) { + var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + } var shortFilename = context.JK.getNameOfFile(backingTrack.filename); if(!sessionModel.isPlayingRecording()) { @@ -1060,14 +1067,14 @@ trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - trackData.mixerId = mixer.id; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) + trackData.mixerId = mixer.id + "," + oppositeMixer.uniqueId; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) trackData.vuMixerId = mixer.id; // the master mixer controls the VUs for recordings (no personal controls in either master or personal mode) trackData.muteMixerId = mixer.id; // the master mixer controls the mute for recordings (no personal controls in either master or personal mode) trackData.mediaTrackOpener = isOpener; trackData.mediaControlsDisabled = !isOpener; trackData.showHelpAboutMediaMixers = sessionModel.isPersonalMixMode() && isOpener; - _addRecordingTrack(trackData, mixer); + _addRecordingTrack(trackData, mixer, oppositeMixer); }); } @@ -1123,6 +1130,9 @@ name = oneOfTheTracks.instrument; } + if(isOpener) { + var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + } // Default trackData to participant + no Mixer state. var trackData = { trackId: oneOfTheTracks.id, @@ -1146,14 +1156,14 @@ } trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - trackData.mixerId = mixer.id; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) + trackData.mixerId = mixer.id + "," + oppositeMixer.uniqueId; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) trackData.vuMixerId = mixer.id; // the master mixer controls the VUs for recordings (no personal controls in either master or personal mode) trackData.muteMixerId = mixer.id; // the master mixer controls the mute for recordings (no personal controls in either master or personal mode) trackData.mediaTrackOpener = isOpener; trackData.mediaControlsDisabled = !isOpener; trackData.showHelpAboutMediaMixers = sessionModel.isPersonalMixMode() && isOpener; - _addRecordingTrack(trackData); + _addRecordingTrack(trackData, mixer, oppositeMixer); }); if(!noCorrespondingTracks && jamTracks.length > 0) { @@ -1223,6 +1233,9 @@ // _addRecordingTrack(trackData); + if(isOpener) { + var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + } // Default trackData to participant + no Mixer state. var trackData = { @@ -1248,7 +1261,7 @@ } trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - trackData.mixerId = mixer.id; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) + trackData.mixerId = mixer.id + "," + oppositeMixer.uniqueId; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) trackData.vuMixerId = mixer.id; // the master mixer controls the VUs for recordings (no personal controls in either master or personal mode) trackData.muteMixerId = mixer.id; // the master mixer controls the mute for recordings (no personal controls in either master or personal mode) trackData.mediaTrackOpener = isOpener; @@ -1256,7 +1269,7 @@ trackData.showHelpAboutMediaMixers = sessionModel.isPersonalMixMode() && isOpener; - _addRecordingTrack(trackData, mixer); + _addRecordingTrack(trackData, mixer, oppositeMixer); }// if setFormFromMetronome() } @@ -1323,6 +1336,10 @@ name = oneOfTheTracks.user.first_name + ' ' + oneOfTheTracks.user.last_name; } + if(isOpener) { + var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + } + // Default trackData to participant + no Mixer state. var trackData = { trackId: oneOfTheTracks.id, @@ -1346,14 +1363,14 @@ } trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - trackData.mixerId = mixer.id; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) + trackData.mixerId = mixer.id + "," + oppositeMixer.uniqueId; // the master mixer controls the volume control for recordings (no personal controls in either master or personal mode) trackData.vuMixerId = mixer.id; // the master mixer controls the VUs for recordings (no personal controls in either master or personal mode) trackData.muteMixerId = mixer.id; // the master mixer controls the mute for recordings (no personal controls in either master or personal mode) trackData.mediaControlsDisabled = !isOpener; trackData.mediaTrackOpener = isOpener; trackData.showHelpAboutMediaMixers = sessionModel.isPersonalMixMode() && isOpener; - _addRecordingTrack(trackData, mixer); + _addRecordingTrack(trackData, mixer, oppositeMixer); }); if(!noCorrespondingTracks && recordedTracks.length > 0) { @@ -1771,7 +1788,7 @@ - function _addRecordingTrack(trackData, mixer) { + function _addRecordingTrack(trackData, mixer, oppositeMixer) { var parentSelector = '#session-recordedtracks-container'; var $destination = $(parentSelector); @@ -1790,7 +1807,7 @@ if(trackData.mediaControlsDisabled) { $trackIconMute.data('media-controls-disabled', true).data('media-track-opener', trackData.mediaTrackOpener) } - $trackIconMute.data('mixer', mixer).data('opposite-mixer', null) + $trackIconMute.data('mixer', mixer).data('opposite-mixer', oppositeMixer) $trackIconMute.data('showHelpAboutMediaMixers', trackData.showHelpAboutMediaMixers) @@ -1823,6 +1840,7 @@ $.each(mixerIds, function(i,v) { var broadcast = !(data.dragging); // If fader is still dragging, don't broadcast var mixer = fillTrackVolumeObject(v, broadcast); + setMixerVolume(mixer, data.percentage); if(groupId == ChannelGroupIds.UserMusicInputGroup) { @@ -2039,12 +2057,14 @@ var mixer = $control.data('mixer'); var oppositeMixer = $control.data('opposite-mixer') - if(mixer && oppositeMixer && mixer.group_id == ChannelGroupIds.AudioInputMusicGroup) { + if(mixer && oppositeMixer && (mixer.group_id == ChannelGroupIds.AudioInputMusicGroup || mediaTrackGroups.indexOf(mixer.group_id) > -1)) { // this is the user's local track; mute both personal and master mode + logger.debug("muting both master and personal mode mixers") _toggleAudioMute(mixer.id, muting, getMixer(mixer.id).mode) - _toggleAudioMute(oppositeMixer.id, muting, getMixer(oppositeMixer.id).mode) + _toggleAudioMute(oppositeMixer.id, muting, getMixer(oppositeMixer.uniqueId || oppositeMixer.id).mode) } else { + logger.debug("muting mixer") _toggleAudioMute(mixer.id, muting, getMixer(mixer.id).mode) } @@ -2148,11 +2168,11 @@ context.jamClient.SessionSetMasterLocalMix(dbValue); // context.jamClient.SessionSetMasterLocalMix(sliderValue); } else { - var isMediaMixer = mediaTrackGroups.indexOf(mixer.group_id) > -1; + //var isMediaMixer = mediaTrackGroups.indexOf(mixer.group_id) > -1; // if this is a media file (Metronome, JamTrack, BackingTrack, RecordedTrack), then we only modify master - var mixMode = isMediaMixer ? MIX_MODES.MASTER : sessionModel.getMixMode(); - context.jamClient.SessionSetControlState(mixer.id, mixMode); + //var mixMode = isMediaMixer ? MIX_MODES.MASTER : sessionModel.getMixMode(); + context.jamClient.SessionSetControlState(mixer.id, mixer.mode); } } diff --git a/web/app/views/clients/_help.html.slim b/web/app/views/clients/_help.html.slim index 4fda8bda3..7fe11020b 100644 --- a/web/app/views/clients/_help.html.slim +++ b/web/app/views/clients/_help.html.slim @@ -201,7 +201,7 @@ script type="text/template" id="template-help-media-controls-disabled" script type="text/template" id="template-help-volume-media-mixers" - | Audio files only expose master mix controls, so any change here will also affect everyone in the session. + | Audio files only expose both master and personal mix controls, so any change here will also affect everyone in the session. script type="text/template" id="template-help-downloaded-jamtrack" .downloaded-jamtrack diff --git a/web/app/views/dialogs/_banner.html.slim b/web/app/views/dialogs/_banner.html.slim index 4083903e3..fe406d529 100644 --- a/web/app/views/dialogs/_banner.html.slim +++ b/web/app/views/dialogs/_banner.html.slim @@ -62,7 +62,7 @@ script type='text/template' id='template-mixer-mode-change' div The personal mix controls the audio mix that you individually hear while playing in the session, and you can customize this mix to hear more or less of the music stream from each other musician playing in the session. This does not affect the master mix used for recordings or broadcasts. With personal mix selected, when you adjust the faders on the session screen up or down, it changes the personal mix only for you locally. li span.definition Note on Audio Files - div The volume control on any audio file is always a master volume control, regardless of the current mode. + div The volume control on any audio file is always both the master and personal volume control, regardless of the current mode. br div | For more detailed information on this topic, read our knowledge base article on  From be4627d51fe507613058811ffd894f92acbc6b26 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 15:55:02 -0600 Subject: [PATCH 4/7] * move around shopping cart init --- web/app/assets/javascripts/everywhere/everywhere.js | 10 ++++++++++ web/app/assets/javascripts/layout.js | 2 -- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/web/app/assets/javascripts/everywhere/everywhere.js b/web/app/assets/javascripts/everywhere/everywhere.js index f89aeacba..929bb2290 100644 --- a/web/app/assets/javascripts/everywhere/everywhere.js +++ b/web/app/assets/javascripts/everywhere/everywhere.js @@ -17,6 +17,7 @@ var ALERT_NAMES = context.JK.ALERT_NAMES; var logger = context.JK.logger; var stun = null; + var rest = context.JK.Rest(); $(document).on('JAMKAZAM_CONSTRUCTED', function(e, data) { @@ -207,4 +208,13 @@ } } + function initShoppingCart(app) { + var user = app.user() + if(user) { + user.done(function(userProfile) { + rest.getShoppingCarts().done(displayCartIcon) + }) + } + } + })(window, jQuery); diff --git a/web/app/assets/javascripts/layout.js b/web/app/assets/javascripts/layout.js index ab1c98813..09332ef0c 100644 --- a/web/app/assets/javascripts/layout.js +++ b/web/app/assets/javascripts/layout.js @@ -296,8 +296,6 @@ left: left + "px" }; $('[layout="header"]').css(css); - - rest.getShoppingCarts().done(displayCartIcon) } function layoutNotify(screenWidth, screenHeight) { From 78ed25ea826f53d1f2702495de10f663c7639a74 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 16:00:30 -0600 Subject: [PATCH 5/7] * actually init the shopping cart --- web/app/assets/javascripts/everywhere/everywhere.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/app/assets/javascripts/everywhere/everywhere.js b/web/app/assets/javascripts/everywhere/everywhere.js index 929bb2290..fd0e49aef 100644 --- a/web/app/assets/javascripts/everywhere/everywhere.js +++ b/web/app/assets/javascripts/everywhere/everywhere.js @@ -52,6 +52,8 @@ operationalEvents(app); handleGettingStarted(app); + + initShoppingCart(app); }); function watchPreferencesEvent(app) { From 079579190988e8d21c5a10a5f9b1321985e4d6f2 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 16:03:44 -0600 Subject: [PATCH 6/7] * move displayCartIcon method to init logic --- web/app/assets/javascripts/everywhere/everywhere.js | 10 ++++++++++ web/app/assets/javascripts/layout.js | 9 --------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/web/app/assets/javascripts/everywhere/everywhere.js b/web/app/assets/javascripts/everywhere/everywhere.js index fd0e49aef..c0c06c0ec 100644 --- a/web/app/assets/javascripts/everywhere/everywhere.js +++ b/web/app/assets/javascripts/everywhere/everywhere.js @@ -211,6 +211,16 @@ } function initShoppingCart(app) { + + function displayCartIcon(carts) { + var cartLink = $("a[href='" + "/client#/shoppingCart" + "']") + if (carts.length > 0) { + cartLink.removeClass("hidden") + } else { + cartLink.addClass("hidden") + } + } + var user = app.user() if(user) { user.done(function(userProfile) { diff --git a/web/app/assets/javascripts/layout.js b/web/app/assets/javascripts/layout.js index 09332ef0c..6c40f596d 100644 --- a/web/app/assets/javascripts/layout.js +++ b/web/app/assets/javascripts/layout.js @@ -275,15 +275,6 @@ $expandedPanelContents.animate({"height": expandedPanelHeight + "px"}, opts.animationDuration); } - function displayCartIcon(carts) { - var cartLink = $("a[href='" + "/client#/shoppingCart" + "']") - if (carts.length > 0) { - cartLink.removeClass("hidden") - } else { - cartLink.addClass("hidden") - } - } - function layoutHeader(screenWidth, screenHeight) { var width = screenWidth - 2 * opts.gutter; var height = opts.headerHeight - opts.gutter; From c5b77a02fa248ad59cb0659a7f8b1354bc60d3e7 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 17:30:06 -0600 Subject: [PATCH 7/7] * check shopping cart on leave of shopping cart screen --- .../javascripts/everywhere/everywhere.js | 12 ++------ .../javascripts/jam_track_utils.js.coffee | 29 +++++++++++++++++++ web/app/assets/javascripts/shopping_cart.js | 8 ++++- 3 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 web/app/assets/javascripts/jam_track_utils.js.coffee diff --git a/web/app/assets/javascripts/everywhere/everywhere.js b/web/app/assets/javascripts/everywhere/everywhere.js index c0c06c0ec..4564cd9b0 100644 --- a/web/app/assets/javascripts/everywhere/everywhere.js +++ b/web/app/assets/javascripts/everywhere/everywhere.js @@ -7,6 +7,7 @@ //= require backend_alerts //= require stun //= require influxdb-latest +//= require jam_track_utils (function (context, $) { @@ -212,19 +213,10 @@ function initShoppingCart(app) { - function displayCartIcon(carts) { - var cartLink = $("a[href='" + "/client#/shoppingCart" + "']") - if (carts.length > 0) { - cartLink.removeClass("hidden") - } else { - cartLink.addClass("hidden") - } - } - var user = app.user() if(user) { user.done(function(userProfile) { - rest.getShoppingCarts().done(displayCartIcon) + context.JK.JamTrackUtils.checkShoppingCart(); }) } } diff --git a/web/app/assets/javascripts/jam_track_utils.js.coffee b/web/app/assets/javascripts/jam_track_utils.js.coffee new file mode 100644 index 000000000..2935665cc --- /dev/null +++ b/web/app/assets/javascripts/jam_track_utils.js.coffee @@ -0,0 +1,29 @@ + + +$ = jQuery +context = window +context.JK ||= {}; + +class JamTrackUtils + constructor: () -> + @logger = context.JK.logger + @rest = new context.JK.Rest(); + + init: () => + + # check if the shopping cart should be shown + checkShoppingCart: () => + @rest.getShoppingCarts().done(this.displayCartIcon) + + displayCartIcon: (carts) => + cartLink = $("a[href='" + "/client#/shoppingCart" + "']") + if carts.length > 0 + cartLink.removeClass("hidden") + else + cartLink.addClass("hidden") + + + + +# global instance +context.JK.JamTrackUtils = new JamTrackUtils() \ No newline at end of file diff --git a/web/app/assets/javascripts/shopping_cart.js b/web/app/assets/javascripts/shopping_cart.js index ac02b8b39..4a7d2bf7e 100644 --- a/web/app/assets/javascripts/shopping_cart.js +++ b/web/app/assets/javascripts/shopping_cart.js @@ -5,6 +5,7 @@ context.JK.ShoppingCartScreen = function(app) { var logger = context.JK.logger; + var jamTrackUtils = context.JK.JamTrackUtils; var $screen = null; var $content = null; @@ -16,6 +17,10 @@ function afterShow(data) { } + function afterHide() { + jamTrackUtils.checkShoppingCart(); + } + function events() { $screen.find("a.remove-cart").on('click', removeCart); $screen.find("a.proceed-checkout").on('click', proceedCheckout); @@ -94,7 +99,8 @@ function initialize() { var screenBindings = { 'beforeShow': beforeShow, - 'afterShow': afterShow + 'afterShow': afterShow, + 'afterHide' : afterHide }; app.bindScreen('shoppingCart', screenBindings);