@@ -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