From eedc5ae9709b0d8cc5de0b24fe831eadcf9c3364 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Fri, 21 Nov 2014 17:16:00 -0600 Subject: [PATCH] * VRFS-1491 - finishing up dealing with refactor of monitor vs master tracks --- db/manifest | 3 +- db/up/add_track_resource_id.sql | 1 + ruby/lib/jam_ruby/models/connection.rb | 1 + ruby/lib/jam_ruby/models/track.rb | 10 +- ruby/spec/factories.rb | 1 + ruby/spec/jam_ruby/models/track_spec.rb | 2 +- web/app/assets/javascripts/faderHelpers.js | 21 +- web/app/assets/javascripts/fakeJamClient.js | 19 +- web/app/assets/javascripts/session.js | 626 +++++++++++------- web/app/assets/javascripts/sessionModel.js | 9 +- web/app/assets/javascripts/trackHelpers.js | 2 +- web/app/assets/javascripts/vuHelpers.js | 80 ++- .../api_music_sessions_controller.rb | 6 +- web/app/views/api_music_sessions/show.rabl | 4 +- .../api_music_sessions/show_history.rabl | 2 +- web/app/views/clients/_help.html.erb | 8 + web/app/views/clients/_session.html.erb | 6 +- web/spec/factories.rb | 1 + 18 files changed, 501 insertions(+), 301 deletions(-) create mode 100644 db/up/add_track_resource_id.sql diff --git a/db/manifest b/db/manifest index 13d9784e6..497c11631 100755 --- a/db/manifest +++ b/db/manifest @@ -228,4 +228,5 @@ user_syncs_fix_dup_tracks_2408.sql deletable_recordings.sql jam_tracks.sql shopping_carts.sql -recurly.sql \ No newline at end of file +recurly.sql +add_track_resource_id.sql \ No newline at end of file diff --git a/db/up/add_track_resource_id.sql b/db/up/add_track_resource_id.sql new file mode 100644 index 000000000..e12d044cc --- /dev/null +++ b/db/up/add_track_resource_id.sql @@ -0,0 +1 @@ +ALTER TABLE tracks ADD COLUMN client_resource_id VARCHAR(100); \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/connection.rb b/ruby/lib/jam_ruby/models/connection.rb index aa9be6824..018901e32 100644 --- a/ruby/lib/jam_ruby/models/connection.rb +++ b/ruby/lib/jam_ruby/models/connection.rb @@ -188,6 +188,7 @@ module JamRuby t.connection = self t.sound = track["sound"] t.client_track_id = track["client_track_id"] + t.client_resource_id = track["client_resource_id"] t.save # todo what if it fails? self.tracks << t end diff --git a/ruby/lib/jam_ruby/models/track.rb b/ruby/lib/jam_ruby/models/track.rb index e827914f9..10b7ecb40 100644 --- a/ruby/lib/jam_ruby/models/track.rb +++ b/ruby/lib/jam_ruby/models/track.rb @@ -16,6 +16,8 @@ module JamRuby validates :sound, :inclusion => {:in => SOUND} validates :connection, presence: true + validates :client_track_id, presence: true + #validates :client_resource_id, presence: true def user self.connection.user @@ -89,6 +91,7 @@ module JamRuby connection_track.instrument_id = track[:instrument_id] connection_track.sound = track[:sound] connection_track.client_track_id = track[:client_track_id] + connection_track.client_resource_id = track[:client_resource_id] result.push(connection_track) @@ -114,6 +117,7 @@ module JamRuby connection_track.instrument_id = track[:instrument_id] connection_track.sound = track[:sound] connection_track.client_track_id = track[:client_track_id] + connection_track.client_resource_id = track[:client_resource_id] if connection_track.save result.push(connection_track) else @@ -131,7 +135,7 @@ module JamRuby result end - def self.save(id, connection_id, instrument_id, sound, client_track_id) + def self.save(id, connection_id, instrument_id, sound, client_track_id, client_resource_id) if id.nil? track = Track.new track.connection_id = connection_id @@ -151,6 +155,10 @@ module JamRuby track.client_track_id = client_track_id end + unless client_resource_id.nil? + track.client_resource_id = resource_id + end + track.updated_at = Time.now track.save return track diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index a044f9659..0e1730e09 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -229,6 +229,7 @@ FactoryGirl.define do factory :track, :class => JamRuby::Track do sound "mono" sequence(:client_track_id) { |n| "client_track_id#{n}"} + sequence(:client_resource_id) { |n| "resource_id#{n}"} end factory :video_source, :class => JamRuby::VideoSource do diff --git a/ruby/spec/jam_ruby/models/track_spec.rb b/ruby/spec/jam_ruby/models/track_spec.rb index 09f032f96..1e03d123b 100644 --- a/ruby/spec/jam_ruby/models/track_spec.rb +++ b/ruby/spec/jam_ruby/models/track_spec.rb @@ -99,7 +99,7 @@ describe Track do track.id.should_not be_nil connection.tracks.length.should == 1 set_updated_at(track, 1.days.ago) - tracks = Track.sync(connection.client_id, [{:id => track.id, :client_track_id => track.client_track_id, :sound => track.sound, :instrument_id => track.instrument_id}]) + tracks = Track.sync(connection.client_id, [{:id => track.id, :client_track_id => track.client_track_id, :sound => track.sound, :instrument_id => track.instrument_id, client_resource_id: track.client_resource_id}]) tracks.length.should == 1 found = tracks[0] expect(found.id).to eq track.id diff --git a/web/app/assets/javascripts/faderHelpers.js b/web/app/assets/javascripts/faderHelpers.js index 9da5eb923..6fc154074 100644 --- a/web/app/assets/javascripts/faderHelpers.js +++ b/web/app/assets/javascripts/faderHelpers.js @@ -16,9 +16,18 @@ var logger = g.JK.logger; function faderClick(e) { + e.stopPropagation(); var $fader = $(this); + + var recordingDisabled = $fader.data('recording-disabled'); + if(recordingDisabled) { + var recordingOpener = $fader.data('recording-opener'); + window.JK.prodBubble($fader, 'recording-controls-disabled', {recordingOpener:recordingOpener}, {positions:['top'], offsetParent: $fader.closest('.screen')}) + return false; + } + draggingOrientation = $fader.attr('orientation'); var offset = $fader.offset(); var position = { top: e.pageY - offset.top, left: e.pageX - offset.left} @@ -117,6 +126,14 @@ $draggingFaderHandle = $(this); $draggingFader = $draggingFaderHandle.closest('div[control="fader"]'); draggingOrientation = $draggingFader.attr('orientation'); + + var recordingDisabled = $draggingFaderHandle.data('recording-disabled'); + var recordingOpener = $draggingFaderHandle.data('recording-opener'); + + if(recordingDisabled) { + return false; + } + return true; } function onFaderDragStop(e, ui) { @@ -162,13 +179,15 @@ selector.html(g._.template(templateSource, options)); + selector.find('div[control="fader"]').data('recording-disabled', selector.data('recording-disabled')).data('recording-opener', selector.data('recording-opener')) + selector.find('div[control="fader-handle"]').draggable({ drag: onFaderDrag, start: onFaderDragStart, stop: onFaderDragStop, containment: "parent", axis: options.faderType === 'horizontal' ? 'x' : 'y' - }) + }).data('recording-disabled', selector.data('recording-disabled')).data('recording-opener', selector.data('recording-opener')) // Embed any custom styles, applied to the .fader below selector if ("style" in options) { diff --git a/web/app/assets/javascripts/fakeJamClient.js b/web/app/assets/javascripts/fakeJamClient.js index 016da08f9..e9bae710f 100644 --- a/web/app/assets/javascripts/fakeJamClient.js +++ b/web/app/assets/javascripts/fakeJamClient.js @@ -392,6 +392,10 @@ logger.debug("Fake JamClient: SessionAudioResync()"); } + function SessionGetAllControlState(isMasterOrPersonal) { + var mixerIds = SessionGetIDs() + return SessionGetControlState(mixerIds, isMasterOrPersonal); + } function SessionGetControlState(mixerIds, isMasterOrPersonal) { dbg("SessionGetControlState"); var groups = [0, 1, 2, 3, 7, 9]; @@ -416,9 +420,9 @@ response.push({ client_id: clientIds[i], group_id: groups[i], - id: mixerIds[i], - master: true, - monitor: true, + id: mixerIds[i] + (isMasterOrPersonal ? 'm' : 'p'), + master: isMasterOrPersonal, + monitor: !isMasterOrPersonal, mute: false, name: names[i], range_high: 20, @@ -428,7 +432,8 @@ volume_left: -40, volume_right:-40, instrument_id:50, // see globals.js - mode: false + mode: isMasterOrPersonal, + rid: mixerIds[i] }); } return response; @@ -504,7 +509,7 @@ } function doCallbacks() { - var names = ["left_vu", "right_vu"]; + var names = ["vu"]; //var ids = ["FW AP Multi_2_10200", "FW AP Multi_0_10000"]; var ids= ["i~11~MultiChannel (FW AP Multi)~0^i~11~Multichannel (FW AP Multi)~1", "i~11~MultiChannel (FW AP Multi)~0^i~11~Multichannel (FW AP Multi)~2"]; @@ -518,7 +523,7 @@ } } var js = eventCallbackName + '(' + args.join(',') + ')'; - eval(js); + //eval(js); vuValue += vuChange; if (vuValue > 10 || vuValue < -70) { vuChange = vuChange * -1; } @@ -912,6 +917,8 @@ // Session this.SessionAddTrack = SessionAddTrack; this.SessionGetControlState = SessionGetControlState; + this.SessionGetAllControlState = SessionGetAllControlState; + this.SessionSetUserName = SessionSetUserName; this.SessionGetIDs = SessionGetIDs; this.RegisterRecordingManagerCallbacks = RegisterRecordingManagerCallbacks; this.RegisterRecordingCallbacks = RegisterRecordingCallbacks; diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index a424c8615..76cbef34e 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -18,6 +18,9 @@ var myTracks = []; var masterMixers = []; var personalMixers = []; + var allMixers = {}; + var mixersByResourceId = {}; + var mixersByTrackId = {}; var configureTrackDialog; var addNewGearDialog; var localRecordingsDialog = null; @@ -29,7 +32,7 @@ var currentMixerRangeMax = null; var lookingForMixersCount = 0; var lookingForMixersTimer = null; - var lookingForMixers = {}; + var lookingForMixers = []; var $recordingTimer = null; var recordingTimerInterval = null; var startTimeDate = null; @@ -454,15 +457,44 @@ * you must iterate. Convenience method to locate a particular * mixer by id. */ - function getMixer(mixerId, mixMode) { - var foundMixer = null; - var mixers = mixMode == MIX_MODES.MASTER ? masterMixers : personalMixers; - $.each(mixers, function(index, mixer) { - if (mixer.id === mixerId) { - foundMixer = mixer; - } - }); - return foundMixer; + function getMixer(mixerId) { + return allMixers[mixerId]; + } + + function getMixerByResourceId(resourceId, mode) { + var mixerPair = mixersByResourceId[resourceId]; + + if(!mixerPair) {return null;} + + if(mode === undefined) { + return mixerPair; + } + else { + if(mode == MIX_MODES.MASTER) { + return mixerPair.master; + } + else { + return mixerPair.personal; + } + } + } + + function getMixerByTrackId(trackId, mode) { + var mixerPair = mixersByTrackId[trackId]; + + if(!mixerPair) {return null;} + + if(mode === undefined) { + return mixerPair; + } + else { + if(mode == MIX_MODES.MASTER) { + return mixerPair.master; + } + else { + return mixerPair.personal; + } + } } function renderSession() { @@ -492,19 +524,58 @@ addNewGearDialog.initialize(); } - // Get the latest list of underlying audio mixer channels + // Get the latest list of underlying audio mixer channels, and populates: + // * mixersByResourceId - a hash of resourceId / { master: mixer, personal: mixer } personal: can be null in case of PeerAudioInputMusicGroup + // * mixersByTrackId - a hash of track id / {master: mixer, personal: mixer}. + // * allMixers - a hash of mixer.id / mixer + // * masterMixers - array of master mode mixers + // * personalMixers - array of personal mode mixers function _updateMixers() { - masterMixers = context.jamClient.SessionGetAllControlState(true); - //var holder = $.extend(true, {}, {mixers: context.jamClient.SessionGetControlState(masterMixerIds, true)}); - //masterMixers = masterMixerIds.mixers; - personalMixers = context.jamClient.SessionGetAllControlState(false); - //holder = $.extend(true, {}, {mixers: context.jamClient.SessionGetControlState(personalMixerIds, false)}); - //personalMixers = personalMixerIds.mixers; - console.log("masterMixers", masterMixers) - console.log("personalMixers", personalMixers) + //logger.debug("masterMixers", masterMixers) + //logger.debug("personalMixers", personalMixers) + + mixersByResourceId = {} + mixersByTrackId = {} + allMixers = {} + + var i; + for(i = 0; i < masterMixers.length; i++) { + var masterMixer = masterMixers[i]; + allMixers[masterMixer.id] = masterMixer; // populate allMixers by mixer.id + + // populate mixer pair + var mixerPair = {} + mixersByResourceId[masterMixer.rid] = mixerPair + mixersByTrackId[masterMixer.id] = mixerPair + mixerPair.master = masterMixer; + } + for(i = 0; i < personalMixers.length; i++) { + var personalMixer = personalMixers[i]; + + if(personalMixer.group_id == ChannelGroupIds.MediaTrackGroup) { + continue; + } + + allMixers[personalMixer.id] = personalMixer + + // populate other side of mixer pair + + var mixerPair = mixersByResourceId[personalMixer.rid] + if(!mixerPair) { + if(personalMixer.group_id != ChannelGroupIds.MonitorGroup) { + logger.warn("there is no master version of ", personalMixer) + } + + mixerPair = {} + mixersByResourceId[personalMixer.rid] = mixerPair + } + mixersByTrackId[personalMixer.id] = mixerPair; + + mixerPair.personal = personalMixer; + } // Always add a hard-coded simplified 'mixer' for the L2M mix /** @@ -565,7 +636,7 @@ //logger.debug("clientId", clientId, "groupIds", groupIds, "mixers", mixers) var foundMixers = {}; var mixers = mixMode == MIX_MODES.MASTER ? masterMixers : personalMixers; - console.log("_groupedMixersForClientId", mixers) + // console.log("_groupedMixersForClientId", mixers) $.each(mixers, function(index, mixer) { if (mixer.client_id === clientId) { for (var i=0; i 0; - _addTrack(allowDelete, trackData, mixer); + _addTrack(allowDelete, trackData, mixer, oppositeMixer); // Show settings icons only for my tracks if (myTrack) { myTracks.push(trackData); } - // TODO: UNCOMMENT THIS WHEN TESTING LOCALLY IN BROWSER - //myTracks.push(trackData); }); }); @@ -955,7 +1092,7 @@ addNewGearDialog = new context.JK.AddNewGearDialog(app, self); } - function connectTrackToMixer(trackSelector, clientId, mixerId, gainPercent, groupId) { + function connectTrackToMixer(trackSelector, track, mixerId, gainPercent, groupId) { var vuOpts = $.extend({}, trackVuOpts); var faderOpts = $.extend({}, trackFaderOpts); faderOpts.faderId = mixerId; @@ -963,16 +1100,21 @@ var vuRightSelector = trackSelector + " .track-vu-right"; var faderSelector = trackSelector + " .track-gain"; var $fader = $(faderSelector).attr('mixer-id', mixerId).data('groupId', groupId) + if(track.recordingDisabled) { + $fader.data('recording-disabled', true).data('recording-opener', track.recordingOpener) // this we be applied later to the fader handle $element + } var $track = $(trackSelector); // Set mixer-id attributes and render VU/Fader context.JK.VuHelpers.renderVU(vuLeftSelector, vuOpts); - $track.find('.track-vu-left').attr('mixer-id', mixerId + '_vul').data('groupId', groupId) + $track.find('.track-vu-left').attr('mixer-id', track.vuMixerId + '_vul').data('groupId', groupId) context.JK.VuHelpers.renderVU(vuRightSelector, vuOpts); - $track.find('.track-vu-right').attr('mixer-id', mixerId + '_vur').data('groupId', groupId) + $track.find('.track-vu-right').attr('mixer-id', track.vuMixerId + '_vur').data('groupId', groupId) context.JK.FaderHelpers.renderFader($fader, faderOpts); // Set gain position context.JK.FaderHelpers.setFaderValue(mixerId, gainPercent); $fader.on('fader_change', faderChanged); + + return $track; } // Function called on an interval when participants change. Mixers seem to @@ -984,83 +1126,61 @@ _updateMixers(); var usedMixers = {}; var keysToDelete = []; - for (var key in lookingForMixers) { - var clientId = lookingForMixers[key]; - var currentMixers = _groupedMixersForClientId( - clientId, - [ - ChannelGroupIds.AudioInputMusicGroup, - ChannelGroupIds.PeerAudioInputMusicGroup, - ChannelGroupIds.UserMusicInputGroup - ], - usedMixers, sessionModel.getMixMode()); + context._.each(lookingForMixers, function(data) { + var clientId = data.clientId; + var track = data.track; - var oppositeMixers = _groupedMixersForClientId( - clientId, - [ - ChannelGroupIds.AudioInputMusicGroup, - ChannelGroupIds.PeerAudioInputMusicGroup, - ChannelGroupIds.UserMusicInputGroup - ], - usedMixers, !sessionModel.getMixMode()); + var myTrack = app.clientId == clientId; - var mixer = null; - var oppositeMixer = null; - if(currentMixers) { - if(currentMixers[ChannelGroupIds.AudioInputMusicGroup]) { - mixer = currentMixers[ChannelGroupIds.AudioInputMusicGroup][0] - oppositeMixer = oppositeMixers[ChannelGroupIds.AudioInputMusicGroup][0] - } - else if(sessionModel.isMasterMixMode() && currentMixers[ChannelGroupIds.PeerAudioInputMusicGroup]) { - mixer = currentMixers[ChannelGroupIds.PeerAudioInputMusicGroup][0] - oppositeMixer = oppositeMixers[ChannelGroupIds.UserMusicInputGroup][0] - } - else if(!sessionModel.isMasterMixMode() && currentMixers[ChannelGroupIds.UserMusicInputGroup]) { - mixer = currentMixers[ChannelGroupIds.UserMusicInputGroup][0] - oppositeMixer = oppositeMixers[ChannelGroupIds.PeerAudioInputMusicGroup][0] - } + var mixerData = findMixerForTrack(clientId, track, myTrack) + + var mixer = mixerData.mixer; + var oppositeMixer = mixerData.oppositeMixer; + var vuMixer = mixerData.vuMixer; + var muteMixer = mixerData.muteMixer; + + if (mixer && oppositeMixer) { + var participant = (sessionModel.getParticipant(clientId) || {name:'unknown'}).name; + logger.debug("found mixer=" + mixer.id + ", participant=" + participant) + usedMixers[mixer.id] = true; + keysToDelete.push(data); + var gainPercent = percentFromMixerValue( + mixer.range_low, mixer.range_high, mixer.volume_left); + var trackSelector = 'div.track[track-id="' + track.id + '"]'; + + connectTrackToMixer(trackSelector, track, mixer.id, gainPercent, mixer.group_id); + var $track = $('div.track[client-id="' + clientId + '"]'); + var $trackIconMute = $track.find('.track-icon-mute') + $trackIconMute.attr('mixer-id', muteMixer.id).data('mixer', mixer).data('opposite-mixer', oppositeMixer) + $trackIconMute.muteSelector().on(EVENTS.MUTE_SELECTED, trackMuteSelected) + + // hide overlay for all tracks associated with this client id (if one mixer is present, then all tracks are valid) + $('.disabled-track-overlay', $track).hide(); + $('.track-connection', $track).removeClass('red yellow green').addClass('grey'); + // Set mute state + _toggleVisualMuteControl($trackIconMute, mixer.mute || oppositeMixer.mute); + } + else { + // if 1 second has gone by and still no mixer, then we gray the participant's tracks + if(lookingForMixersCount == 2) { + var $track = $('div.track[client-id="' + clientId + '"]'); + $('.disabled-track-overlay', $track).show(); + $('.track-connection', $track).removeClass('red yellow green').addClass('red'); } - if (mixer) { - var participant = (sessionModel.getParticipant(clientId) || {name:'unknown'}).name; - logger.debug("found mixer=" + mixer.id + ", participant=" + participant) - usedMixers[mixer.id] = true; - keysToDelete.push(key); - var gainPercent = percentFromMixerValue( - mixer.range_low, mixer.range_high, mixer.volume_left); - var trackSelector = 'div.track[track-id="' + key + '"]'; - - connectTrackToMixer(trackSelector, key, mixer.id, gainPercent, mixer.group_id); - var $track = $('div.track[client-id="' + clientId + '"]'); - var $trackIconMute = $track.find('.track-icon-mute') - $trackIconMute.attr('mixer-id', mixer.id).attr('opposite-mixer-id', oppositeMixer.id).data('mixer', mixer).data('opposite-mixer', oppositeMixer) - $trackIconMute.muteSelector().on(EVENTS.MUTE_SELECTED, trackMuteSelected) - - // hide overlay for all tracks associated with this client id (if one mixer is present, then all tracks are valid) - $('.disabled-track-overlay', $track).hide(); - $('.track-connection', $track).removeClass('red yellow green').addClass('grey'); - // Set mute state - _toggleVisualMuteControl($trackIconMute, mixer, oppositeMixer); - } - else { - // if 1 second has gone by and still no mixer, then we gray the participant's tracks - if(lookingForMixersCount == 2) { - var $track = $('div.track[client-id="' + clientId + '"]'); - $('.disabled-track-overlay', $track).show(); - $('.track-connection', $track).removeClass('red yellow green').addClass('red'); - } - var participant = (sessionModel.getParticipant(clientId) || { user: {name: 'unknown'}}).user.name; - logger.debug("still looking for mixer for participant=" + participant + ", clientId=" + clientId) - } - } + var participant = (sessionModel.getParticipant(clientId) || { user: {name: 'unknown'}}).user.name; + logger.debug("still looking for mixer for participant=" + participant + ", clientId=" + clientId) + } + }) for (var i=0; i 20) { lookingForMixersCount = 0; - lookingForMixers = {}; + lookingForMixers = [] context.clearTimeout(lookingForMixersTimer); lookingForMixersTimer = null; } @@ -1068,7 +1188,7 @@ // Given a mixerID and a value between 0.0-1.0, // light up the proper VU lights. - function _updateVU(mixerId, value) { + function _updateVU(mixerId, value, isClipping) { // Special-case for mono tracks. If mono, and it's a _vul id, // update both sides, otherwise do nothing. @@ -1076,7 +1196,7 @@ var selector; var pureMixerId = mixerId.replace("_vul", ""); pureMixerId = pureMixerId.replace("_vur", ""); - var mixer = getMixer(pureMixerId, sessionModel.getMixMode()); + var mixer = getMixer(pureMixerId); if (mixer) { if (!(mixer.stereo)) { // mono track if (mixerId.substr(-4) === "_vul") { @@ -1094,7 +1214,7 @@ } } - function _addTrack(allowDelete, trackData, mixer) { + function _addTrack(allowDelete, trackData, mixer, oppositeMixer) { var parentSelector = '#session-mytracks-container'; var $destination = $(parentSelector); @@ -1108,7 +1228,7 @@ var audioOverlay = $('.disabled-track-overlay', newTrack); var $trackIconMute = newTrack.find('.track-icon-mute') $trackIconMute.muteSelector().on(EVENTS.MUTE_SELECTED, trackMuteSelected) - $trackIconMute.data('mixer', mixer) + $trackIconMute.data('mixer', mixer).data('opposite-mixer', oppositeMixer) audioOverlay.hide(); // always start with overlay hidden, and only show if no audio persists $destination.append(newTrack); @@ -1116,7 +1236,7 @@ // Render VU meters and gain fader var trackSelector = parentSelector + ' .session-track[track-id="' + trackData.trackId + '"]'; var gainPercent = trackData.gainPercent || 0; - connectTrackToMixer(trackSelector, trackData.clientId, trackData.mixerId, gainPercent, trackData.group_id); + connectTrackToMixer(trackSelector, trackData, trackData.mixerId, gainPercent, trackData.group_id); var $closeButton = $('#div-track-close', 'div[track-id="' + trackData.trackId + '"]'); if (!allowDelete) { @@ -1148,8 +1268,11 @@ // Render VU meters and gain fader var trackSelector = parentSelector + ' .session-track[track-id="' + trackData.trackId + '"]'; var gainPercent = trackData.gainPercent || 0; - connectTrackToMixer(trackSelector, trackData.clientId, trackData.mixerId, gainPercent, null); - + var $track = connectTrackToMixer(trackSelector, trackData, trackData.mixerId, gainPercent, null); + var $trackIconMute = $track.find('.track-icon-mute') + if(trackData.recordingDisabled) { + $trackIconMute.data('recording-disabled', true).data('recording-opener', trackData.recordingOpener) + } tracks[trackData.trackId] = new context.JK.SessionTrack(trackData.clientId); } @@ -1187,62 +1310,69 @@ //_toggleVisualMuteControl($muteControl, isMuted); } - function handleBridgeCallback() { + function handleBridgeCallback(vuData) { + var j; var eventName = null; var mixerId = null; var value = null; - var tuples = arguments.length / 3; - for (var i=0; i 0) { - logger.debug("on page enter, audio is already running") + logger.debug("on page enter, tracks are already available") sessionPageEnterDeferred.resolve(inputTracks); var deferred = sessionPageEnterDeferred; sessionPageEnterDeferred = null; @@ -506,6 +506,10 @@ return mixerMode == MIX_MODES.MASTER; } + function isPersonalMixMode() { + return mixerMode == MIX_MODES.PERSONAL; + } + function getMixMode() { return mixerMode; } @@ -668,6 +672,7 @@ this.inSession = inSession; this.setMixerMode = setMixerMode; this.isMasterMixMode = isMasterMixMode; + this.isPersonalMixMode = isPersonalMixMode; this.getMixMode = getMixMode; // ALERT HANDLERS diff --git a/web/app/assets/javascripts/trackHelpers.js b/web/app/assets/javascripts/trackHelpers.js index cc9b7ea63..6b30035e0 100644 --- a/web/app/assets/javascripts/trackHelpers.js +++ b/web/app/assets/javascripts/trackHelpers.js @@ -42,12 +42,12 @@ localMusicTracks = context.JK.TrackHelpers.getTracks(jamClient, 2); - console.log("getUserTracks", localMusicTracks) var trackObjects = []; for (i=0; i < localMusicTracks.length; i++) { var track = {}; track.client_track_id = localMusicTracks[i].id; + track.client_resource_id = localMusicTracks[i].rid; if(localMusicTracks[i].instrument_id === 0) { track.instrument_id = context.JK.server_to_client_instrument_map["Other"].server_id; diff --git a/web/app/assets/javascripts/vuHelpers.js b/web/app/assets/javascripts/vuHelpers.js index 93b34c4f2..e9b4c70ce 100644 --- a/web/app/assets/javascripts/vuHelpers.js +++ b/web/app/assets/javascripts/vuHelpers.js @@ -20,6 +20,8 @@ */ renderVU: function(selector, userOptions) { selector = $(selector); + + /** * The default options for rendering a VU */ @@ -36,9 +38,13 @@ templateSelector = "#template-vu-h"; } var templateSource = $(templateSelector).html(); - selector.empty(); - selector.html(context._.template(templateSource, options, {variable: 'data'})); + selector.each(function() { + var $track = $(this); + $track.empty(); + $track.html(context._.template(templateSource, options, {variable: 'data'})); + }) + }, /** @@ -48,41 +54,45 @@ updateVU: function ($selector, value) { // There are 13 VU lights. Figure out how many to // light based on the incoming value. - var countSelector = 'tr'; - var horizontal = ($selector.find('table.horizontal').length); - if (horizontal) { - countSelector = 'td'; - } - - var lightCount = $selector.find(countSelector).length; - var i = 0; - var state = 'on'; - var lights = Math.round(value * lightCount); - var redSwitch = Math.round(lightCount * 0.6666667); - - var $light = null; - var colorClass = 'vu-green-'; - var lightSelectorPrefix = $selector.find('td.vu'); - var thisLightSelector = null; - - // Remove all light classes from all lights - var allLightsSelector = $selector.find('td.vulight'); - $(allLightsSelector).removeClass('vu-green-off vu-green-on vu-red-off vu-red-on'); - - // Set the lights - for (i = 0; i < lightCount; i++) { - colorClass = 'vu-green-'; - state = 'on'; - if (i >= redSwitch) { - colorClass = 'vu-red-'; - } - if (i >= lights) { - state = 'off'; + $selector.each(function() { + var $track = $(this) + var countSelector = 'tr'; + var horizontal = ($track.find('table.horizontal').length); + if (horizontal) { + countSelector = 'td'; } - var lightIndex = horizontal ? i : lightCount - i - 1; - allLightsSelector.eq(lightIndex).addClass(colorClass + state); - } + var lightCount = $track.find(countSelector).length; + var i = 0; + var state = 'on'; + var lights = Math.round(value * lightCount); + var redSwitch = Math.round(lightCount * 0.6666667); + + var $light = null; + var colorClass = 'vu-green-'; + var lightSelectorPrefix = $track.find('td.vu'); + var thisLightSelector = null; + + // Remove all light classes from all lights + var allLightsSelector = $track.find('td.vulight'); + $(allLightsSelector).removeClass('vu-green-off vu-green-on vu-red-off vu-red-on'); + + // Set the lights + for (i = 0; i < lightCount; i++) { + colorClass = 'vu-green-'; + state = 'on'; + if (i >= redSwitch) { + colorClass = 'vu-red-'; + } + if (i >= lights) { + state = 'off'; + } + + var lightIndex = horizontal ? i : lightCount - i - 1; + allLightsSelector.eq(lightIndex).addClass(colorClass + state); + } + }) + } }; diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index c8457d959..d7e70a6b3 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -373,7 +373,8 @@ class ApiMusicSessionsController < ApiController params[:connection_id], params[:instrument_id], params[:sound], - params[:client_track_id]) + params[:client_track_id], + params[:client_resource_id]) respond_with @track, responder: ApiResponder, :status => 201, :location => api_session_track_detail_url(@track.connection.music_session, @track) end @@ -384,7 +385,8 @@ class ApiMusicSessionsController < ApiController nil, params[:instrument_id], params[:sound], - params[:client_track_id]) + params[:client_track_id], + params[:client_resource_id]) respond_with @track, responder: ApiResponder, :status => 200 diff --git a/web/app/views/api_music_sessions/show.rabl b/web/app/views/api_music_sessions/show.rabl index e4c264a7c..f78b7934a 100644 --- a/web/app/views/api_music_sessions/show.rabl +++ b/web/app/views/api_music_sessions/show.rabl @@ -45,14 +45,14 @@ else child(:connections => :participants) { collection @music_sessions, :object_root => false - attributes :ip_address, :client_id, :joined_session_at, :audio_latency + attributes :ip_address, :client_id, :joined_session_at, :audio_latency, :id node :user do |connection| { :id => connection.user.id, :photo_url => connection.user.photo_url, :name => connection.user.name, :is_friend => connection.user.friends?(current_user), :connection_state => connection.aasm_state } end child(:tracks => :tracks) { - attributes :id, :connection_id, :instrument_id, :sound, :client_track_id, :updated_at + attributes :id, :connection_id, :instrument_id, :sound, :client_track_id, :client_resource_id, :updated_at } } diff --git a/web/app/views/api_music_sessions/show_history.rabl b/web/app/views/api_music_sessions/show_history.rabl index c86e6e04f..7c09994e2 100644 --- a/web/app/views/api_music_sessions/show_history.rabl +++ b/web/app/views/api_music_sessions/show_history.rabl @@ -173,7 +173,7 @@ else end child(:tracks => :tracks) { - attributes :id, :connection_id, :instrument_id, :sound, :client_track_id, :updated_at + attributes :id, :connection_id, :instrument_id, :sound, :client_track_id, :client_resource_id, :updated_at } } diff --git a/web/app/views/clients/_help.html.erb b/web/app/views/clients/_help.html.erb index 7623897dc..33988762f 100644 --- a/web/app/views/clients/_help.html.erb +++ b/web/app/views/clients/_help.html.erb @@ -162,4 +162,12 @@
The files associated with this recording will be deleted as soon as your client has uploaded your tracks and stream mix from this recording.
+ + + \ No newline at end of file diff --git a/web/app/views/clients/_session.html.erb b/web/app/views/clients/_session.html.erb index dc0f6a81e..7eacfd26a 100644 --- a/web/app/views/clients/_session.html.erb +++ b/web/app/views/clients/_session.html.erb @@ -151,8 +151,8 @@