diff --git a/web/app/assets/javascripts/react-components/SessionMasterCategoryControls.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMasterCategoryControls.js.jsx.coffee index 760495ef0..bca63ea41 100644 --- a/web/app/assets/javascripts/react-components/SessionMasterCategoryControls.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMasterCategoryControls.js.jsx.coffee @@ -9,7 +9,7 @@ MIX_MODES = context.JK.MIX_MODES onInputsChanged: (sessionMixers) -> mixers = sessionMixers.mixers - inputGroupMixers = mixers.getAudioInputCategoryMixer(MIX_MODES.MASTER) + inputGroupMixers = mixers.getSimulatedMusicCategoryMixer(MIX_MODES.MASTER) chatGroupMixers = mixers.getChatCategoryMixer(MIX_MODES.MASTER) @setState({inputGroupMixers: inputGroupMixers, chatGroupMixers: chatGroupMixers}) diff --git a/web/app/assets/javascripts/react-components/SessionMusicMixer.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionMusicMixer.js.jsx.coffee index 407956c35..69311934e 100644 --- a/web/app/assets/javascripts/react-components/SessionMusicMixer.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionMusicMixer.js.jsx.coffee @@ -1,6 +1,6 @@ context = window -@SessionMusicMixer= React.createClass({ +@SessionMusicMixer = React.createClass({ handleMute: (e) -> e.preventDefault() @@ -11,12 +11,11 @@ context = window muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@props.mixers.mixer], muting) + MixerActions.mute(@props.mixers.mixer, muting) render: () -> - muteMixer = @props.mixers.muteMixer - vuMixer = @props.mixers.vuMixer + muteMixer = @props.mixers.muteMixer[0] muteMixerId = muteMixer?.id classes = classNames({ @@ -25,7 +24,7 @@ context = window 'muted' : muteMixer?.mute }) - pan = if @props.mixers.mixer? then @props.mixers.mixer.pan else 0 + pan = if @props.mixers.mixer? && @props.mixers.mixer.length > 0 then @props.mixers.mixer[0].pan else 0 panStyle = { transform: "rotate(#{pan}deg)" diff --git a/web/app/assets/javascripts/react-components/SessionSelfVolumeHover.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionSelfVolumeHover.js.jsx.coffee index 981f285e7..cf4e981c6 100644 --- a/web/app/assets/javascripts/react-components/SessionSelfVolumeHover.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionSelfVolumeHover.js.jsx.coffee @@ -15,7 +15,7 @@ MixerActions = @MixerActions onInputsChanged: (sessionMixers) -> mixers = sessionMixers.mixers - inputGroupMixers = mixers.getAudioInputCategoryMixer(MIX_MODES.PERSONAL) + inputGroupMixers = mixers.getSimulatedMusicCategoryMixer(MIX_MODES.PERSONAL) chatGroupMixers = mixers.getChatCategoryMixer( MIX_MODES.PERSONAL) @setState({inputGroupMixers: inputGroupMixers, chatGroupMixers: chatGroupMixers}) @@ -28,30 +28,30 @@ MixerActions = @MixerActions muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@state.inputGroupMixers.muteMixer], muting) + MixerActions.mute(@state.inputGroupMixers.muteMixer, muting) handleChatInputMute: (e) -> e.preventDefault() muting = $(e.currentTarget).is('.enabled') - MixerActions.mute([@state.chatGroupMixers.muteMixer], muting) + MixerActions.mute(@state.chatGroupMixers.muteMixer, muting) handleAudioInputMuteCheckbox: (e) -> muting = $(e.target).is(':checked') - MixerActions.mute([@state.inputGroupMixers.muteMixer], muting) + MixerActions.mute(@state.inputGroupMixers.muteMixer, muting) handleChatMuteCheckbox: (e) -> muting = $(e.target).is(':checked') - MixerActions.mute([@state.chatGroupMixers.muteMixer], muting) + MixerActions.mute(@state.chatGroupMixers.muteMixer, muting) render: () -> - monitorMuteMixer = @state.inputGroupMixers.muteMixer + monitorMuteMixer = @state.inputGroupMixers.muteMixer[0] monitorMuteMixerId = monitorMuteMixer?.id - monitorVolumeLeft = @state.inputGroupMixers.mixer?.volume_left + monitorVolumeLeft = @state.inputGroupMixers.mixer[0].volume_left monitorMuteClasses = classNames({ 'track-icon-mute': true 'enabled' : !monitorMuteMixer?.mute @@ -75,14 +75,14 @@ MixerActions = @MixerActions
- +
Volume
{monitorVolumeLeft}dB
-
+
@@ -102,14 +102,14 @@ MixerActions = @MixerActions
- +
Volume
{chatVolumeLeft}dB
-
+
@@ -143,7 +143,7 @@ MixerActions = @MixerActions context.JK.checkbox($audioInputMuteCheckbox) $audioInputMuteCheckbox.on('ifChanged', @handleAudioInputMuteCheckbox); - if @state.inputGroupMixers.muteMixer.mute + if @state.inputGroupMixers.muteMixer[0].mute $audioInputMuteCheckbox.iCheck('check').attr('checked', true) else $audioInputMuteCheckbox.iCheck('uncheck').attr('checked', false) @@ -154,14 +154,14 @@ MixerActions = @MixerActions # re-initialize icheck $chatMuteCheckbox = $root.find('.chat-mixer input') - if nextState.chatGroupMixers.muteMixer?.mute + if nextState.chatGroupMixers.muteMixer.mute $chatMuteCheckbox.iCheck('check').attr('checked', true) else $chatMuteCheckbox.iCheck('uncheck').attr('checked', false) $audioInputMuteCheckbox = $root.find('.monitor-mixer input') - if nextState.inputGroupMixers.muteMixer?.mute + if nextState.inputGroupMixers.muteMixer[0].mute $audioInputMuteCheckbox.iCheck('check').attr('checked', true) else $audioInputMuteCheckbox.iCheck('uncheck').attr('checked', false) diff --git a/web/app/assets/javascripts/react-components/SessionTrackGain.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionTrackGain.js.jsx.coffee index e5dfa7f58..0ec56c5c1 100644 --- a/web/app/assets/javascripts/react-components/SessionTrackGain.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionTrackGain.js.jsx.coffee @@ -12,12 +12,17 @@ logger = context.JK.logger faderChanged: (e, data) -> $target = $(this) groupId = $target.data('groupId') - mixers = [@state.mixers.mixer] + mixers = @state.mixers.mixer MixerActions.faderChanged(data, mixers, groupId) render: () -> - mixerId = this.state.mixers?.mixer?.id + # mixer can be a single item or array + mixer = @state.mixers?.mixer + if mixer && $.isArray(mixer) + mixer = mixer[0] + + mixerId = mixer?.id `
@@ -32,20 +37,15 @@ logger = context.JK.logger if !$root.is('.track-gain') logger.error("unknown root node") - $fader = $root.attr('data-mixer-id', @state.mixers.mixer.id).data('groupId', @state.mixers.mixer.groupId).data('mixer', @state.mixers.mixer).data('opposite-mixer', @state.mixers.oppositeMixer) - - if @state.behaviors.mediaControlsDisabled - $fader.data('media-controls-disabled', true).data('media-track-opener', @state.behaviors.mediaTrackOpener) # this we be applied later to the fader handle $element - - $fader.data('showHelpAboutMediaMixers', @state.behaviors.showHelpAboutMediaMixers) - - context.JK.FaderHelpers.renderFader2($fader, {faderType: 'vertical'}); + context.JK.FaderHelpers.renderFader2($root, {faderType: 'vertical'}); # Initialize gain position - MixerActions.initGain(@state.mixers.mixer) + mixer = @state.mixers?.mixer + if mixer && $.isArray(mixer) + mixer = mixer[0] + + MixerActions.initGain(mixer) # watch for fader change events - $fader.on('fader_change', @faderChanged); - - + $root.on('fader_change', @faderChanged); }) \ No newline at end of file diff --git a/web/app/assets/javascripts/react-components/SessionTrackPan.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionTrackPan.js.jsx.coffee index 0bfae1005..c1e569566 100644 --- a/web/app/assets/javascripts/react-components/SessionTrackPan.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionTrackPan.js.jsx.coffee @@ -12,13 +12,18 @@ logger = context.JK.logger panChanged: (e, data) -> $target = $(this) groupId = $target.data('groupId') - mixers = [@state.mixers.mixer] + mixers = @state.mixers.mixer MixerActions.panChanged(data, mixers, groupId) render: () -> - mixerId = this.state.mixers?.mixer?.id + # mixer can be a single item or array + mixer = @state.mixers?.mixer + if mixer && $.isArray(mixer) + mixer = mixer[0] + + mixerId = mixer?.id `
Left
@@ -36,19 +41,17 @@ logger = context.JK.logger if !$root.is('.track-pan') logger.error("unknown root node") - $fader = $root.attr('data-mixer-id', this.state.mixers.mixer.id).data('groupId', this.state.mixers.mixer.groupId).data('mixer', this.state.mixers.mixer).data('opposite-mixer', this.state.mixers.oppositeMixer) + context.JK.FaderHelpers.renderFader2($root, {faderType: 'horizontal', snap:true}, context.JK.PanHelpers.convertPercentToPanForDisplay) - if this.state.behaviors.mediaControlsDisabled - $fader.data('media-controls-disabled', true).data('media-track-opener', this.state.behaviors.mediaTrackOpener) # this we be applied later to the fader handle $element - $fader.data('showHelpAboutMediaMixers', this.state.behaviors.showHelpAboutMediaMixers) + # Initialize panposition + mixer = @state.mixers?.mixer + if mixer && $.isArray(mixer) + mixer = mixer[0] - context.JK.FaderHelpers.renderFader2($fader, {faderType: 'horizontal', snap:true}, context.JK.PanHelpers.convertPercentToPanForDisplay) - - # Initialize gain position - MixerActions.initPan(this.state.mixers.mixer) + MixerActions.initPan(mixer) # watch for fader change events - $fader.on('fader_change', this.panChanged) + $root.on('fader_change', this.panChanged) }) \ No newline at end of file diff --git a/web/app/assets/javascripts/react-components/SessionTrackVU.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionTrackVU.js.jsx.coffee index 71520e387..6bca85131 100644 --- a/web/app/assets/javascripts/react-components/SessionTrackVU.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionTrackVU.js.jsx.coffee @@ -81,7 +81,7 @@ ptrCount = 0 componentWillUnmount: () -> if @state.registered? - logger.debug("unregistered VU #{context.JK.groupIdDisplay(@state.registered.mixer)}") + #logger.debug("unregistered VU #{context.JK.groupIdDisplay(@state.registered.mixer)}") context.JK.VuHelpers.unregisterVU(@state.registered.mixer, @state.registered.ptr) }) \ No newline at end of file diff --git a/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee index e6c6c87cb..f855f14d2 100644 --- a/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionTrackVolumeHover.js.jsx.coffee @@ -6,6 +6,7 @@ ptrCount = 0 @SessionTrackVolumeHover = React.createClass({ mixins: [Reflux.listenTo(@SessionMyTracksStore,"onInputsChanged")] + iCheckMaint: false closeHover: (e) -> e.preventDefault() @@ -17,6 +18,7 @@ ptrCount = 0 mixers = sessionMixers.mixers newMixers = mixers.refreshMixer(@state.mixers) + newMixers = {} unless newMixers? this.setState({mixers: newMixers}) getInitialState: () -> @@ -30,24 +32,33 @@ ptrCount = 0 if @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputMusicGroup || @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputChatGroup MixerActions.mute([this.state.mixers.mixer, this.state.mixers.oppositeMixer], muting) else - MixerActions.mute([this.state.mixers.mixer], muting) + MixerActions.mute(this.state.mixers.mixer, muting) handleMuteCheckbox: (e) -> + + return if @iCheckMaint + muting = $(e.target).is(':checked') if @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputMusicGroup || @state.mixers.mixer.group_id == ChannelGroupIds.AudioInputChatGroup MixerActions.mute([this.state.mixers.mixer, this.state.mixers.oppositeMixer], muting) else - MixerActions.mute([this.state.mixers.mixer], muting) + MixerActions.mute(this.state.mixers.mixer, muting) render: () -> - muteMixer = this.state.mixers?.muteMixer - + muteMixer = @state.mixers?.muteMixer + if muteMixer && $.isArray(muteMixer) + muteMixer = muteMixer[0] muteMixerId = muteMixer?.id - volume_left = this.state.mixers?.mixer?.volume_left + + mixer = @state.mixers?.mixer + if mixer && $.isArray(mixer) + mixer = mixer[0] + + volume_left = mixer.volume_left classes = classNames({ 'track-icon-mute': true @@ -88,15 +99,22 @@ ptrCount = 0 componentDidMount: () -> $root = jQuery(this.getDOMNode()) + muteMixer = this.state.mixers?.muteMixer + if $.isArray(muteMixer) + muteMixer = muteMixer[0] + # initialize icheck $checkbox = $root.find('input') context.JK.checkbox($checkbox) $checkbox.on('ifChanged', this.handleMuteCheckbox); - if @state.mixers.muteMixer.mute - $checkbox.iCheck('check').attr('checked', true) + # using iCheck causes a 'ifChanged' event, so we need to swallow this up + @iCheckMaint = true + if muteMixer + $checkbox.iCheck('check', false).attr('checked', true) else - $checkbox.iCheck('uncheck').attr('checked', false) + $checkbox.iCheck('uncheck', false).attr('checked', false) + @iCheckMaint = false componentWillUpdate: (nextProps, nextState) -> $root = jQuery(this.getDOMNode()) @@ -110,8 +128,15 @@ ptrCount = 0 # re-initialize icheck $checkbox = $root.find('input') - if nextState.mixers?.muteMixer?.mute - $checkbox.iCheck('check').attr('checked', true) + muteMixer = nextState.mixers?.muteMixer + if muteMixer? && $.isArray(muteMixer) + muteMixer = muteMixer[0] + + # using iCheck causes a 'ifChanged' event, so we need to swallow this up + @iCheckMaint = true + if muteMixer.mute + $checkbox.iCheck('check', false).attr('checked', true) else - $checkbox.iCheck('uncheck').attr('checked', false) + $checkbox.iCheck('uncheck', false).attr('checked', false) + @iCheckMaint = false }) \ No newline at end of file diff --git a/web/app/assets/javascripts/react-components/SessionVolumeSettingsBtn.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionVolumeSettingsBtn.js.jsx.coffee index 4b9932a6b..c2a56fe95 100644 --- a/web/app/assets/javascripts/react-components/SessionVolumeSettingsBtn.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionVolumeSettingsBtn.js.jsx.coffee @@ -21,7 +21,7 @@ MIX_MODES = context.JK.MIX_MODES $root, 'SessionSelfVolumeHover', () => - {inputGroupMixers: @state.mixers.getAudioInputCategoryMixer(MIX_MODES.PERSONAL), chatGroupMixers: @state.mixers.getChatCategoryMixer( MIX_MODES.PERSONAL)} + {inputGroupMixers: @state.mixers.getSimulatedMusicCategoryMixer(MIX_MODES.PERSONAL), chatGroupMixers: @state.mixers.getChatCategoryMixer( MIX_MODES.PERSONAL)} , {width:470, positions:['right', 'bottom', 'left'], offsetParent:$root.closest('.screen')}) 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 cc709b1d7..7f21e9cdb 100644 --- a/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee +++ b/web/app/assets/javascripts/react-components/helpers/MixerHelper.js.coffee @@ -503,6 +503,13 @@ MIX_MODES = context.JK.MIX_MODES; foundMixers + mixerForGroupId: (groupId, mixMode) -> + mixers = @mixersForGroupId(groupId, mixMode) + if mixers? && mixers.length > 0 + mixers[0] + else + null + getMixer: (mixerId, mode) -> mode = @mixMode unless mode? @allMixers[(if mode then 'M' else 'P') + mixerId] @@ -651,6 +658,8 @@ MIX_MODES = context.JK.MIX_MODES; mixer.mute = muting faderChanged: (data, mixers, groupId) -> + mixers = [mixers] unless $.isArray(mixers) + for mixer in mixers broadcast = !(data.dragging) # If fader is still dragging, don't broadcast mixer = @fillTrackVolumeObject(mixer.id, mixer.mode, broadcast) @@ -666,11 +675,16 @@ MIX_MODES = context.JK.MIX_MODES; context.JK.FaderHelpers.setFaderValue(mixerId, data.percentage) initGain: (mixer) -> + if $.isArray(mixer) + mixer = mixer[0] + + gainPercent = context.JK.FaderHelpers.convertAudioTaperToPercent(mixer.volume_left) context.JK.FaderHelpers.setFaderValue(mixer.id, gainPercent) context.JK.FaderHelpers.showFader(mixer.id) panChanged: (data, mixers, groupId) -> + mixers = [mixers] unless $.isArray(mixers) # media tracks are the only controls that sometimes set two mixers right now for mixer in mixers broadcast = !(data.dragging) # If fader is still dragging, don't broadcast @@ -832,6 +846,25 @@ MIX_MODES = context.JK.MIX_MODES; oppositeMixer: found } + getSimulatedMusicCategoryMixer: (mode) -> + myInputs = @getAudioInputCategoryMixer(mode)?.mixer + peerInputs = @getUserMusicCategoryMixer(mode)?.mixer + myMedia= @getMediaCategoryMixer(mode)?.mixer + peerMedia = @getUserMediaCategoryMixer(mode)?.mixer + metronome = @getMetronomeCategoryMixer(mode)?.mixer + output = @getOutputMixer(mode) + oppositeOutput = @getOutputMixer(!mode) + + # if any categories are missing, assume + if myInputs + { + mixer: [myInputs, peerInputs, myMedia, peerMedia, metronome] + muteMixer: [myInputs, peerInputs, myMedia, peerMedia, metronome] + vuMixer: output + } + else + null + getAudioInputCategoryMixer: (mode) -> @getGroupMixer(CategoryGroupIds.AudioInputMusic, mode) @@ -844,18 +877,59 @@ MIX_MODES = context.JK.MIX_MODES; getUserMediaCategoryMixer: (mode) -> @getGroupMixer(CategoryGroupIds.UserMedia, mode) + getUserMusicCategoryMixer: (mode) -> + @getGroupMixer(CategoryGroupIds.UserMusic, mode) + + getMetronomeCategoryMixer: (mode) -> + @getGroupMixer(CategoryGroupIds.Metronome, mode) + + getOutputCategoryMixer: (mode) -> + if mode == MIX_MODES.MASTER + @getGroupMixer(CategoryGroupIds.MasterCatGroup, mode) + else + @getGroupMixer(CategoryGroupIds.MonitorCatGroup, mode) + + getOutputMixer: (mode) -> + if mode == MIX_MODES.MASTER + @mixerForGroupId(ChannelGroupIds.MasterGroup, mode) + else + @mixerForGroupId(ChannelGroupIds.MonitorGroup, mode) refreshMixer: (mixers) -> return null unless mixers? && mixers.mixer? - mixer = @getMixer(mixers.mixer.id, mixers.mixer.mode) + updateMixers = null + if $.isArray(mixers.mixer) + if mixers.mixer.length > 0 + updateMixers = [] + for mixer in mixers.mixer + updateMixers.push(@getMixer(mixer.id, mixer.mode)) + else + updateMixers = @getMixer(mixers.mixer.id, mixers.mixer.mode) - if mixer? - oppositeMixer = if mixers.oppositeMixer then @getMixer(mixers.oppositeMixer.id, mixers.oppositeMixer.mode) else null + updatedVUMixers = null + if $.isArray(mixers.vuMixer) + updatedVUMixers = [] + for vuMixer in mixers.vuMixer + updateVUMixers.push(@getMixer(vuMixer.id, vuMixer.mode)) + else + updateVUMixers = @getMixer(mixers.vuMixer.id, mixers.vuMixer.mode) + + updateMuteMixers = null + if $.isArray(mixers.muteMixer) + updateMuteMixers = [] + for muteMixer in mixers.muteMixer + updateMuteMixers.push(@getMixer(muteMixer.id, muteMixer.mode)) + else + updateMuteMixers = @getMixer(mixers.muteMixer.id, mixers.muteMixer.mode) + + oppositeMixer = if mixers.oppositeMixer then @getMixer(mixers.oppositeMixer.id, mixers.oppositeMixer.mode) else null + + if updateMixers { - mixer: mixer - vuMixer: @getMixer(mixers.vuMixer.id, mixers.vuMixer.mode) - muteMixer: @getMixer(mixers.muteMixer.id, mixers.muteMixer.mode) + mixer: updateMixers + vuMixer: updateVUMixers + muteMixer: updateMuteMixers oppositeMixer: oppositeMixer } else 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 c2b57fe00..d94056594 100644 --- a/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee +++ b/web/app/assets/javascripts/react-components/stores/MixerStore.js.coffee @@ -131,6 +131,8 @@ rest = context.JK.Rest() onMute: (mixers, muting) -> + mixers = [mixers] unless $.isArray(mixers) + for mixer in mixers @mixers.mute(mixer.id, mixer.mode, muting); diff --git a/web/spec/features/oauth_spec.rb b/web/spec/features/oauth_spec.rb index ac14586b0..a4661f346 100644 --- a/web/spec/features/oauth_spec.rb +++ b/web/spec/features/oauth_spec.rb @@ -41,7 +41,7 @@ describe "OAuth", :slow=>true, :js=>true, :type=>:feature, :capybara_feature=>tr it "client should authorize a google user" do authorize_google_user(@youtube_client, @user, "filthyblueberryjam") - save_screenshot("working.png") + #save_screenshot("working.png") @user.reload @user.user_authorizations.count.should eq(1) diff --git a/web/spec/spec_helper.rb b/web/spec/spec_helper.rb index 9a543a19a..d82c3d9aa 100644 --- a/web/spec/spec_helper.rb +++ b/web/spec/spec_helper.rb @@ -195,7 +195,7 @@ bputs "before register capybara" config.include Requests::FeatureHelpers, type: :feature # Use the specified formatter - #config.formatter = :documentation + config.formatter = :documentation config.before(:suite) do tests_started = true