diff --git a/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee index 2246bd53a..311f0402a 100644 --- a/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee @@ -1,4 +1,5 @@ context = window +MixerActions = context.MixerActions ReactCSSTransitionGroup = React.addons.CSSTransitionGroup @SessionOtherTracks = React.createClass({ @@ -50,6 +51,8 @@ ReactCSSTransitionGroup = React.addons.CSSTransitionGroup noAudio: noAudioUsers[participant.client_id] } + MixerActions.missingPeerMixer(participant.client_id) unless hasMixer + participants.push(participantState) this.setState(participants: participants, session: session) diff --git a/web/app/assets/javascripts/react-components/actions/MixerActions.js.coffee b/web/app/assets/javascripts/react-components/actions/MixerActions.js.coffee index 5d5678207..68c71dfba 100644 --- a/web/app/assets/javascripts/react-components/actions/MixerActions.js.coffee +++ b/web/app/assets/javascripts/react-components/actions/MixerActions.js.coffee @@ -13,4 +13,5 @@ context = window openMetronome: {} metronomeChanged: {} deadUserRemove: {} + missingPeerMixer: {} }) diff --git a/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee b/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee index 9fa8c5d74..90734e784 100644 --- a/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee +++ b/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee @@ -535,7 +535,7 @@ MIX_MODES = context.JK.MIX_MODES; for mixer in mixers unless mixer? - logger.debug("empty mixer: ", mixers) + #logger.debug("empty mixer: ", mixers) continue if mixer.client_id == clientId diff --git a/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee b/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee index 22d920bd9..d98600ca5 100644 --- a/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee +++ b/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee @@ -17,6 +17,9 @@ rest = context.JK.Rest() metro: {tempo: 120, cricket: false, sound: "Beep" } noAudioUsers : {} + checkingMissingPeers : {} + missingMixerPeers : {} + recheckTimeout : null init: -> # Register with the app store to get @app @@ -34,6 +37,7 @@ rest = context.JK.Rest() this.listenTo(context.MixerActions.openMetronome, this.onOpenMetronome) this.listenTo(context.MixerActions.metronomeChanged, this.onMetronomeChanged) this.listenTo(context.MixerActions.deadUserRemove, this.onDeadUserRemove) + this.listenTo(context.MixerActions.missingPeerMixer, this.onMissingPeerMixer) context.JK.HandleVolumeChangeCallback2 = @handleVolumeChangeCallback context.JK.HandleMetronomeCallback2 = @handleMetronomeCallback @@ -114,7 +118,10 @@ rest = context.JK.Rest() sessionEnded: () -> + @checkingMissingPeers = {} @noAudioUsers = {} + @missingMixerPeers = {} + clearTimeout(@recheckTimeout) if @recheckTimeout? onSessionChange: (session) -> @@ -186,6 +193,35 @@ rest = context.JK.Rest() @issueChange() + onMissingPeerMixer: (clientId) -> + + missingPeerAttempts = @missingMixerPeers[clientId] + + # check for 5 tries (10 seconds if setTimeout is 2000ms) + if !missingPeerAttempts? || missingPeerAttempts < 5 + @checkingMissingPeers[clientId] = true + @recheckTimeout = setTimeout(@recheckForMixers, 2000) unless @recheckTimeout? + else + logger.debug("ignoring missing peer recheck. missingPeerAttempts: #{missingPeerAttempts}") + + recheckForMixers: () -> + # increment how many times we've checked for this particular peer + for clientId, meh of @checkingMissingPeers + missingPeerAttempts = @missingMixerPeers[clientId] + missingPeerAttempts = 0 unless missingPeerAttempts? + missingPeerAttempts++ + @missingMixerPeers[clientId] = missingPeerAttempts + + # reset the peers we are looking for + @checkingMissingPeers = {} + + @recheckTimeout = null + @masterMixers = context.jamClient.SessionGetAllControlState(true); + @personalMixers = context.jamClient.SessionGetAllControlState(false); + logger.debug("MixerStore: recheckForMixers") + @mixers = new context.MixerHelper(@session, @masterMixers, @personalMixers, @metro, @noAudioUsers, @mixers?.mixMode || MIX_MODES.PERSONAL) + @issueChange() + onInitGain: (mixer) -> @mixers.initGain(mixer) @@ -212,9 +248,7 @@ rest = context.JK.Rest() onSyncTracks: () -> logger.debug("MixerStore: onSyncTracks") - # XXX using SessionStore directly, because SessionHelper.inSession() is based on if the session has been requested, not if the user has attempted to join the session - #unless @session.inSession() - unless context.SessionStore.inSession() + unless @session.inSession() logger.debug("dropping sync tracks because no longer in session") return @@ -230,7 +264,7 @@ rest = context.JK.Rest() syncTrackRequest.tracks = inputTracks syncTrackRequest.backing_tracks = backingTracks syncTrackRequest.metronome_open = metronomeTracks.length > 0 - syncTrackRequest.id = context.SessionStore.currentSessionId + syncTrackRequest.id = @session.id() rest.putTrackSyncChange(syncTrackRequest) .fail((jqXHR)=> diff --git a/web/app/assets/javascripts/react-components/stores/SessionStore.js.coffee b/web/app/assets/javascripts/react-components/stores/SessionStore.js.coffee index e949b73e6..396f66590 100644 --- a/web/app/assets/javascripts/react-components/stores/SessionStore.js.coffee +++ b/web/app/assets/javascripts/react-components/stores/SessionStore.js.coffee @@ -374,7 +374,7 @@ NotificationActions = @NotificationActions logger.debug("backing tracks changed", previousBackingTracks, backingTracks) MixerActions.syncTracks() else if !(previousMetronomeTracks.length == 0 && metronomeTracks.length == 0) && previousMetronomeTracks != metronomeTracks - logger.debug("metronome state changed ", previousMetronomeTracks, metronomeTracks) + #logger.debug("metronome state changed ", previousMetronomeTracks, metronomeTracks) MixerActions.syncTracks() else @refreshCurrentSession(true) @@ -692,11 +692,14 @@ NotificationActions = @NotificationActions @leaveSessionRest(@currentSessionId) return + @updateSessionInfo(response, true) + @issueChange() + logger.debug("calling jamClient.JoinSession"); # on temporary disconnect scenarios, a user may already be in a session when they enter this path # so we avoid double counting unless @alreadyInSession() - if response.music_session.participant_count == 1 + if @participants().length == 1 context.JK.GA.trackSessionMusicians(context.JK.GA.SessionCreationTypes.create); else context.JK.GA.trackSessionMusicians(context.JK.GA.SessionCreationTypes.join); @@ -705,7 +708,7 @@ NotificationActions = @NotificationActions context.jamClient.JoinSession({sessionID: @currentSessionId}); - @refreshCurrentSession(true); + #@refreshCurrentSession(true); context.JK.JamServer.registerMessageCallback(context.JK.MessageType.SESSION_JOIN, @trackChanges); context.JK.JamServer.registerMessageCallback(context.JK.MessageType.SESSION_DEPART, @trackChanges); diff --git a/web/app/assets/javascripts/webcam_viewer.js.coffee b/web/app/assets/javascripts/webcam_viewer.js.coffee index 5f2466037..87e6a7f93 100644 --- a/web/app/assets/javascripts/webcam_viewer.js.coffee +++ b/web/app/assets/javascripts/webcam_viewer.js.coffee @@ -24,7 +24,7 @@ context.JK.WebcamViewer = class WebcamViewer @webcamSelect.on("change", this.selectWebcam) @toggleBtn.on('click', @toggleWebcam) @resolutionSelect.on("change", this.selectResolution) - logger.debug("Initialed with (unique) select",@webcamSelect) + #logger.debug("Initialed with (unique) select",@webcamSelect) beforeShow:() => this.loadWebCams() diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index 32b7726fc..f1beaa5f9 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -300,7 +300,9 @@ class ApiMusicSessionsController < ApiController response.status = :unprocessable_entity respond_with @connection else - respond_with @connection, responder: ApiResponder, :location => api_session_participant_detail_url(@connection.client_id) + + @music_session = @connection.music_session + respond_with @music_session, responder: ApiResponder, :status => 201, :location => api_session_detail_url(@connection.music_session) end rescue ActiveRecord::RecordNotFound diff --git a/web/app/views/api_music_sessions/participant_create.rabl b/web/app/views/api_music_sessions/participant_create.rabl index 5c8fa8ea7..e34b6943d 100644 --- a/web/app/views/api_music_sessions/participant_create.rabl +++ b/web/app/views/api_music_sessions/participant_create.rabl @@ -1,13 +1,3 @@ -object @connection +object @music_session -extends "api_music_sessions/participant_show" - -attributes :music_session_id - -child(:music_session => :music_session) { - attributes :id - - node :participant_count do |music_session| - music_session.connections.length - end -} \ No newline at end of file +extends "api_music_sessions/show" \ No newline at end of file