Merge branch 'develop' into feature/musician_profile_enhancements
This commit is contained in:
commit
19fdc2ac9d
|
|
@ -7,6 +7,7 @@
|
|||
//= require backend_alerts
|
||||
//= require stun
|
||||
//= require influxdb-latest
|
||||
//= require jam_track_utils
|
||||
|
||||
(function (context, $) {
|
||||
|
||||
|
|
@ -17,6 +18,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) {
|
||||
|
||||
|
|
@ -51,6 +53,8 @@
|
|||
operationalEvents(app);
|
||||
|
||||
handleGettingStarted(app);
|
||||
|
||||
initShoppingCart(app);
|
||||
});
|
||||
|
||||
function watchPreferencesEvent(app) {
|
||||
|
|
@ -207,4 +211,14 @@
|
|||
}
|
||||
}
|
||||
|
||||
function initShoppingCart(app) {
|
||||
|
||||
var user = app.user()
|
||||
if(user) {
|
||||
user.done(function(userProfile) {
|
||||
context.JK.JamTrackUtils.checkShoppingCart();
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
})(window, jQuery);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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;
|
||||
|
|
@ -296,8 +287,6 @@
|
|||
left: left + "px"
|
||||
};
|
||||
$('[layout="header"]').css(css);
|
||||
|
||||
rest.getShoppingCarts().done(displayCartIcon)
|
||||
}
|
||||
|
||||
function layoutNotify(screenWidth, screenHeight) {
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
@ -1045,6 +1052,7 @@
|
|||
gainPercent: 0,
|
||||
muteClass: 'muted',
|
||||
showLoop: isOpener && !sessionModel.isPlayingRecording(),
|
||||
loopState: mixer.loop,
|
||||
mixerId: "",
|
||||
avatarClass: 'avatar-recording',
|
||||
preMasteredClass: ""
|
||||
|
|
@ -1059,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);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -1122,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,
|
||||
|
|
@ -1145,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) {
|
||||
|
|
@ -1222,6 +1233,9 @@
|
|||
|
||||
// _addRecordingTrack(trackData);
|
||||
|
||||
if(isOpener) {
|
||||
var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL);
|
||||
}
|
||||
|
||||
// Default trackData to participant + no Mixer state.
|
||||
var trackData = {
|
||||
|
|
@ -1247,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;
|
||||
|
|
@ -1255,7 +1269,7 @@
|
|||
trackData.showHelpAboutMediaMixers = sessionModel.isPersonalMixMode() && isOpener;
|
||||
|
||||
|
||||
_addRecordingTrack(trackData, mixer);
|
||||
_addRecordingTrack(trackData, mixer, oppositeMixer);
|
||||
}// if
|
||||
setFormFromMetronome()
|
||||
}
|
||||
|
|
@ -1322,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,
|
||||
|
|
@ -1345,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) {
|
||||
|
|
@ -1770,7 +1788,7 @@
|
|||
|
||||
|
||||
|
||||
function _addRecordingTrack(trackData, mixer) {
|
||||
function _addRecordingTrack(trackData, mixer, oppositeMixer) {
|
||||
var parentSelector = '#session-recordedtracks-container';
|
||||
var $destination = $(parentSelector);
|
||||
|
||||
|
|
@ -1789,13 +1807,14 @@
|
|||
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)
|
||||
|
||||
|
||||
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() {
|
||||
|
|
@ -1821,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) {
|
||||
|
|
@ -2037,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)
|
||||
}
|
||||
|
||||
|
|
@ -2146,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2472,6 +2494,7 @@
|
|||
});
|
||||
|
||||
// '' closes all open backing tracks
|
||||
context.jamClient.SessionStopPlay();
|
||||
context.jamClient.SessionCloseBackingTrackFile('');
|
||||
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue