diff --git a/admin/app/admin/jam_tracks.rb b/admin/app/admin/jam_tracks.rb index 96f341829..6c90018e6 100644 --- a/admin/app/admin/jam_tracks.rb +++ b/admin/app/admin/jam_tracks.rb @@ -24,6 +24,7 @@ ActiveAdmin.register JamRuby::JamTrack, :as => 'JamTracks' do column :original_artist column :name + column :flags do |jam_track| jam_track.duplicate_positions? ? 'DUP POSITIONS' : '' end column :status column :master_track do |jam_track| jam_track.master_track.nil? ? 'None' : (link_to "Download", jam_track.master_track.url_by_sample_rate(44)) end column :licensor diff --git a/admin/config/initializers/jam_track_tracks.rb b/admin/config/initializers/jam_track_tracks.rb index 36f82d79e..b6367cd58 100644 --- a/admin/config/initializers/jam_track_tracks.rb +++ b/admin/config/initializers/jam_track_tracks.rb @@ -68,7 +68,7 @@ class JamRuby::JamTrackTrack s3_manager.download(self.url_by_sample_rate(44), input) - command = "sox \"#{input}\" \"#{output}\" trim #{start} #{stop}" + command = "sox \"#{input}\" \"#{output}\" trim #{sprintf("%.3f", start)} =#{sprintf("%.3f", stop)}" @@log.debug("trimming using: " + command) diff --git a/db/manifest b/db/manifest index 4fda5d21b..9188feab3 100755 --- a/db/manifest +++ b/db/manifest @@ -268,4 +268,5 @@ jam_track_right_admin_purchase.sql jam_track_playable_plays.sql shopping_cart_anonymous.sql user_reuse_card_and_reedem.sql -jam_track_id_to_varchar.sql \ No newline at end of file +jam_track_id_to_varchar.sql +drop_position_unique_jam_track.sql \ No newline at end of file diff --git a/db/up/drop_position_unique_jam_track.sql b/db/up/drop_position_unique_jam_track.sql new file mode 100644 index 000000000..6055702d4 --- /dev/null +++ b/db/up/drop_position_unique_jam_track.sql @@ -0,0 +1 @@ +DROP INDEX jam_track_tracks_position_uniqkey; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index 754453b00..2b1488d5d 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -44,7 +44,7 @@ module JamRuby belongs_to :genre, class_name: "JamRuby::Genre" belongs_to :licensor , class_name: 'JamRuby::JamTrackLicensor', foreign_key: 'licensor_id' - has_many :jam_track_tracks, :class_name => "JamRuby::JamTrackTrack", order: 'position ASC' + has_many :jam_track_tracks, :class_name => "JamRuby::JamTrackTrack", order: 'position ASC, part ASC, instrument_id ASC' has_many :jam_track_tap_ins, :class_name => "JamRuby::JamTrackTapIn", order: 'offset_time ASC' has_many :jam_track_rights, :class_name => "JamRuby::JamTrackRight" #, inverse_of: 'jam_track', :foreign_key => "jam_track_id" # ' @@ -63,6 +63,27 @@ module JamRuby accepts_nested_attributes_for :jam_track_tracks, allow_destroy: true accepts_nested_attributes_for :jam_track_tap_ins, allow_destroy: true + def duplicate_positions? + counter = {} + jam_track_tracks.each do |track| + count = counter[track.position] + if count.nil? + count = 0 + end + puts "count #{count}" + counter[track.position] = count + 1 + end + + duplicate = false + counter.each do|position, count| + if count > 1 + duplicate = true + break + end + end + duplicate + end + class << self # @return array[artist_name(string)] def all_artists diff --git a/ruby/lib/jam_ruby/models/jam_track_track.rb b/ruby/lib/jam_ruby/models/jam_track_track.rb index 419b49c63..78255d07c 100644 --- a/ruby/lib/jam_ruby/models/jam_track_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track_track.rb @@ -23,7 +23,6 @@ module JamRuby validates :part, length: {maximum: 25} validates :track_type, inclusion: {in: TRACK_TYPE } validates :preview_start_time, numericality: {only_integer: true}, length: {in: 1..1000}, :allow_nil => true - validates_uniqueness_of :position, scope: :jam_track_id validates_uniqueness_of :part, scope: [:jam_track_id, :instrument_id] # validates :jam_track, presence: true diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 5aa7ac747..96ebee955 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -481,6 +481,12 @@ function checkMetronomeTransition() { // trust backend over server + if(sessionModel.jamTracks() !== null) { + // ignore all metronome events when jamtracks are open, because backend opens metronome mixer to play jamtrack tap-ins + logger.debug("ignore checkMetronomeTransition because JamTrack is open") + return; + } + var metronomeMasterMixers = getMetronomeMasterMixers(); if (metronomeMixer == null && metronomeMasterMixers.length > 0) { @@ -1035,7 +1041,7 @@ if(jamTrackMixers.length > 0) { renderJamTracks(jamTrackMixers); } - if(metronomeTrackMixers.length > 0) { + if(metronomeTrackMixers.length > 0 && sessionModel.jamTracks() === null) { renderMetronomeTracks(metronomeTrackMixers); } if(adhocTrackMixers.length > 0) { @@ -2812,13 +2818,25 @@ } function onChangePlayPosition(e, data){ - logger.debug("calling jamClient.SessionTrackSeekMs(" + data.positionMs + ")"); + + var seek = data.positionMs; if(data.playbackMonitorMode == context.JK.PLAYBACK_MONITOR_MODE.JAMTRACK) { - context.jamClient.SessionJamTrackSeekMs(data.positionMs); + // if positionMs == 0, then seek it back to whatever the earliest play start is to catch all the prelude + + if(seek == 0) { + var duration = context.jamClient.SessionGetJamTracksPlayDurationMs(); + seek = duration.start; + } + } + + logger.debug("calling jamClient.SessionTrackSeekMs(" + seek + ")"); + + if(data.playbackMonitorMode == context.JK.PLAYBACK_MONITOR_MODE.JAMTRACK) { + context.jamClient.SessionJamTrackSeekMs(seek); } else { - context.jamClient.SessionTrackSeekMs(data.positionMs); + context.jamClient.SessionTrackSeekMs(seek); } }