* VRFS-3366 - make the 'Music' volume affect 5 categories, not just one

This commit is contained in:
Seth Call 2015-07-22 17:46:33 -05:00
parent e143dc4e1f
commit e779d25955
12 changed files with 169 additions and 66 deletions

View File

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

View File

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

View File

@ -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
<SessionTrackVU orientation="vertical" lightCount={13} lightWidth={3} lightHeight={17} side="best" mixers={this.state.inputGroupMixers} />
</div>
<div className="track-vu-right">
<SessionTrackVU orientation="vertical" lightCount={13} lightWidth={3} lightHeight={17} side="vur" mixers={this.state.inputGroupMixers} />
<SessionTrackVU orientation="vertical" lightCount={13} lightWidth={3} lightHeight={17} side="best" mixers={this.state.inputGroupMixers} />
</div>
<div className="track-label">
<div>Volume</div>
<div>{monitorVolumeLeft}dB</div>
</div>
<SessionTrackGain mixers={this.state.inputGroupMixers} />
<div className={monitorMuteClasses} data-control="mute" data-mixer-id={monitorMuteMixerId} onClick={this.handleAudioInputMute}/>
<div className={monitorMuteClasses} data-control="mute" onClick={this.handleAudioInputMute}/>
<input type="checkbox" name="mute"/>
<label htmlFor="mute">Mute</label>
@ -102,14 +102,14 @@ MixerActions = @MixerActions
<SessionTrackVU orientation="vertical" lightCount={13} lightWidth={3} lightHeight={17} side="best" mixers={this.state.chatGroupMixers} />
</div>
<div className="track-vu-right">
<SessionTrackVU orientation="vertical" lightCount={13} lightWidth={3} lightHeight={17} side="vur" mixers={this.state.chatGroupMixers} />
<SessionTrackVU orientation="vertical" lightCount={13} lightWidth={3} lightHeight={17} side="best" mixers={this.state.chatGroupMixers} />
</div>
<div className="track-label">
<div>Volume</div>
<div>{chatVolumeLeft}dB</div>
</div>
<SessionTrackGain mixers={this.state.chatGroupMixers} />
<div className={chatMuteClasses} data-control="mute" data-mixer-id={chatMuteMixerId} onClick={this.handleChatMute}/>
<div className={chatMuteClasses} data-control="mute" onClick={this.handleChatMute}/>
<input type="checkbox" name="mute"/>
<label htmlFor="mute">Mute</label>
@ -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)

View File

@ -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
`<div className="track-gain">
<div className="fader vertical" data-control="fader" data-fader-id={mixerId} data-orientation="vertical">
@ -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);
})

View File

@ -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
`<div className="track-pan">
<div className="left-label">Left</div>
@ -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)
})

View File

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

View File

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

View File

@ -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')})

View File

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

View File

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

View File

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

View File

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