From a7824249a87c59d19d108591327679c95646db83 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 23 Feb 2015 22:29:28 -0600 Subject: [PATCH 1/4] * VRFS-2826 - fix regression where remote peers couldn't see tracks --- web/app/assets/javascripts/session.js | 29 ++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index d91ebf0d5..9aff18f4b 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -1027,7 +1027,12 @@ if(isOpener) { var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + var mixerId = mixer.id + "," + oppositeMixer.uniqueId } + else { + var mixerId = mixer.id; + } + var shortFilename = context.JK.getNameOfFile(backingTrack.filename); if(!sessionModel.isPlayingRecording()) { @@ -1067,7 +1072,7 @@ trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - 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.mixerId = mixerId; // 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; @@ -1132,7 +1137,12 @@ if(isOpener) { var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + var mixerId = mixer.id + "," + oppositeMixer.uniqueId } + else { + var mixerId = mixer.id; + } + // Default trackData to participant + no Mixer state. var trackData = { trackId: oneOfTheTracks.id, @@ -1156,7 +1166,7 @@ } trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - 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.mixerId = mixerId; // 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; @@ -1235,8 +1245,13 @@ if(isOpener) { var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + var mixerId = mixer.id + "," + oppositeMixer.uniqueId } - + else { + var mixerId = mixer.id; + } + + // Default trackData to participant + no Mixer state. var trackData = { trackId: "MS" + oneOfTheTracks.id, @@ -1261,7 +1276,7 @@ } trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - 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.mixerId = mixerId; // 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; @@ -1338,6 +1353,10 @@ if(isOpener) { var oppositeMixer = getMixerByResourceId(mixer.rid, MIX_MODES.PERSONAL); + var mixerId = mixer.id + "," + oppositeMixer.uniqueId + } + else { + var mixerId = mixer.id; } // Default trackData to participant + no Mixer state. @@ -1363,7 +1382,7 @@ } trackData.gainPercent = gainPercent; trackData.muteClass = muteClass; - 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.mixerId = mixerId; // 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; From 947d649f5ff9f4ece754a8e0d98474cb4db5bdf5 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Tue, 24 Feb 2015 17:16:12 -0600 Subject: [PATCH 2/4] * VRFS-2831 - metronome showing --- db/up/recorded_jam_track_tracks.sql | 15 +++++++++ .../models/recorded_jam_track_track.rb | 21 ++++++++++++ web/app/assets/javascripts/session.js | 33 ++++++++++++------- 3 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 db/up/recorded_jam_track_tracks.sql create mode 100644 ruby/lib/jam_ruby/models/recorded_jam_track_track.rb diff --git a/db/up/recorded_jam_track_tracks.sql b/db/up/recorded_jam_track_tracks.sql new file mode 100644 index 000000000..246b76425 --- /dev/null +++ b/db/up/recorded_jam_track_tracks.sql @@ -0,0 +1,15 @@ +ALTER TABLE recordings ADD COLUMN jam_track_id VARCHAR(64) REFERENCES jam_tracks(id); +ALTER TABLE recordings ADD COLUMN jam_track_initiator_id VARCHAR(64) REFERENCES users(id); + +CREATE TABLE recorded_jam_track_tracks ( + id BIGINT PRIMARY KEY, + user_id VARCHAR(64) REFERENCES users(id) ON DELETE CASCADE, + jam_track_track_id VARCHAR(64), + recording_id VARCHAR(64) NOT NULL, + discard BOOLEAN, + timeline JSON, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +ALTER TABLE recorded_jam_tracks ALTER COLUMN id SET DEFAULT nextval('tracks_next_tracker_seq'); \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/recorded_jam_track_track.rb b/ruby/lib/jam_ruby/models/recorded_jam_track_track.rb new file mode 100644 index 000000000..19907eb1c --- /dev/null +++ b/ruby/lib/jam_ruby/models/recorded_jam_track_track.rb @@ -0,0 +1,21 @@ +module JamRuby + # BackingTrack analog to JamRuby::RecordedTrack + class RecordedJamTrackTrack < ActiveRecord::Base + + belongs_to :user, :class_name => "JamRuby::User", :inverse_of => :recorded_jam_track_tracks + belongs_to :recording, :class_name => "JamRuby::Recording", :inverse_of => :recorded_jam_track_tracks + belongs_to :jam_track_track, :class_name => "JamRuby::JamTrackTrack", :inverse_of => :recorded_jam_track_tracks + + validates :user, presence: true + validates :jam_track_track, presence:true + + def self.create_from_jam_track_track(jam_track_track, recording) + recorded_backing_track = self.new + recorded_backing_track.recording = recording + recorded_backing_track.jam_track_track = jam_track_track + recorded_backing_track.save + recorded_backing_track + end + + end +end diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 9aff18f4b..183a94e81 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -890,8 +890,11 @@ var mediaType = mixer.media_type; var groupId = mixer.group_id; - // mediaType == null is for backwards compat with older clients. Can be removed soon - if(mediaType == null || mediaType == "" || mediaType == 'RecordingTrack') { + if(mediaType == 'MetronomeTrack' || groupId==ChannelGroupIds.MetronomeGroup) { + // Metronomes come across with a blank media type, so check group_id: + metronomeTrackMixers.push(mixer); + } + else if(mediaType == null || mediaType == "" || mediaType == 'RecordingTrack') { // additional check; if we can match an id in backing tracks or recorded backing track, // we need to remove it from the recorded track set, but move it to the backing track set @@ -922,9 +925,6 @@ } else if(mediaType == 'PeerMediaTrack' || mediaType == 'BackingTrack') { // BackingTrack backingTrackMixers.push(mixer); - } else if(mediaType == 'MetronomeTrack' || groupId==ChannelGroupIds.MetronomeGroup) { - // Metronomes come across with a blank media type, so check group_id: - metronomeTrackMixers.push(mixer); } else if(mediaType == 'JamTrack') { jamTrackMixers.push(mixer); mixer.group_id == ChannelGroupIds.MediaTrackGroup; @@ -1980,11 +1980,22 @@ rest.openBackingTrack({id: context.JK.CurrentSessionModel.id(), backing_track_path: result.file}) .done(function(response) { var openResult = context.jamClient.SessionOpenBackingTrackFile(result.file, false); - //context.JK.CurrentSessionModel.refreshCurrentSession(true); - sessionModel.setBackingTrack(result.file); + + if(openResult) { + sessionModel.setBackingTrack(result.file); + } + else { + app.notify({ + "title": "Couldn't Open Backing Track", + "text": "Is the file a valid audio file?", + "icon_url": "/assets/content/icon_alert_big.png" + }); + closeBackingTrack(); + } + }) .fail(function(jqXHR) { - app.notifyServerError(jqXHR, "Unable to Open BackingTrack For Playback"); + app.notifyServerError(jqXHR, "Unable to Open Backing Track For Playback"); }) } else { @@ -2443,8 +2454,6 @@ rest.openMetronome({id: sessionModel.id()}) .done(function() { context.jamClient.SessionOpenMetronome(120, "Click", 1, 0) - context.JK.CurrentSessionModel.refreshCurrentSession(true) - context.JK.CurrentSessionModel.refreshCurrentSession(true) }) .fail(function(jqXHR) { logger.debug(jqXHR, jqXHR) @@ -2506,8 +2515,8 @@ }) .fail(function(jqXHR) { app.notify({ - "title": "Couldn't Close BackingTrack", - "text": "Couldn't inform the server to close BackingTrack. msg=" + jqXHR.responseText, + "title": "Couldn't Close Backing Track", + "text": "Couldn't inform the server to close Backing Track. msg=" + jqXHR.responseText, "icon_url": "/assets/content/icon_alert_big.png" }); }); From 6b795695eea28070bf28aa7984dd2265f940be31 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Wed, 25 Feb 2015 16:15:41 -0600 Subject: [PATCH 3/4] * VRFS-2753 - assign volume left over volume right to ensure both mono and stereo backend inputs get the data they need --- web/app/assets/javascripts/session.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 183a94e81..b47946641 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -2140,7 +2140,11 @@ context.trackVolumeObject.name = mixer.name; context.trackVolumeObject.record = mixer.record; context.trackVolumeObject.volL = mixer.volume_left; - context.trackVolumeObject.volR = mixer.volume_right; + + // today we treat all tracks as mono, but this is required to make a stereo track happy + //context.trackVolumeObject.volR = mixer.volume_right; + context.trackVolumeObject.volR = mixer.volume_left; + context.trackVolumeObject.loop = mixer.loop; // trackVolumeObject doesn't have a place for range min/max currentMixerRangeMin = mixer.range_low; From 471f590ef78307d903fb027f7260b6579ac95025 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Wed, 25 Feb 2015 19:57:01 -0600 Subject: [PATCH 4/4] * update doc of teaspoon tests; really just a fake bump for dev build --- web/README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/web/README.md b/web/README.md index b32f3ab99..f2dccf0a1 100644 --- a/web/README.md +++ b/web/README.md @@ -1,10 +1,4 @@ Jasmine Javascript Unit Tests ============================= -1. Ensure you have the jasmine Gem installed; -$ bundle - -2. Start the jasmine server (defaults to :8888) -$ rake jasmine - -Open browser to localhost:8888 +Open browser to localhost:3000/teaspoon