jam-cloud/web/app/assets/javascripts/react-components/stores/ConfigureTracksStore.js.coffee

579 lines
18 KiB
CoffeeScript
Raw Permalink Normal View History

2015-10-27 01:20:26 +00:00
$ = jQuery
context = window
logger = context.JK.logger
2015-10-27 14:19:14 +00:00
ASSIGNMENT = context.JK.ASSIGNMENT
VOICE_CHAT = context.JK.VOICE_CHAT
MAX_TRACKS = context.JK.MAX_TRACKS
MAX_OUTPUTS = context.JK.MAX_OUTPUTS
gearUtils = context.JK.GearUtils
AUDIO_UNIT_TYPE_ID = 0
2015-12-23 03:28:19 +00:00
MIDI_TRACK = context.JK.MIDI_TRACK
2015-10-27 01:20:26 +00:00
2015-11-01 12:39:51 +00:00
###
QVariantMap scanForPlugins();
QVariantMap VSTListVsts();
void VSTClearAll();
QVariantMap VSTSetTrackAssignment(const QVariantMap vst, const QString& trackId);
QVariantMap VSTListTrackAssignments();
void VSTShowHideGui(bool show,const QString& trackId);
void VST_ScanForMidiDevices();
QVariantMap VST_GetMidiDeviceList();
bool VST_EnableMidiForTrack(const QString& trackId, bool enableMidi, int midiDeviceIndex);
QVariantMap listSearchPaths();
void addSearchPath(int typeId, QString pathToAdd);
void removeSearchPath(int typeId, QString pathToRemove);
2015-11-01 12:39:51 +00:00
###
2015-10-27 01:20:26 +00:00
@ConfigureTracksStore = Reflux.createStore(
{
2015-10-27 14:19:14 +00:00
listenables: ConfigureTracksActions
2015-10-27 01:20:26 +00:00
2015-11-09 21:33:04 +00:00
musicPorts: {inputs: [], outputs: []}
2015-10-30 14:59:50 +00:00
trackNumber: null
editingTrack: null
2015-11-09 21:33:04 +00:00
vstPluginList: {vsts: []}
vstTrackAssignments: {vsts: []}
attachedMidiDevices: {midiDevices: []}
midiTrackAssignments: {tracks: []}
scanPaths: {paths:[]}
2015-11-13 21:35:13 +00:00
scanningVsts: false
2015-11-09 21:33:04 +00:00
trackType: 'audio'
hasVst: true
2015-11-09 21:33:04 +00:00
2015-10-27 01:20:26 +00:00
init: () ->
2015-11-09 21:33:04 +00:00
this.listenTo(context.AppStore, this.onAppInit)
this.listenTo(context.MixerStore, this.onMixersChanged)
this.listenTo(context.PlatformStore, this.onPlatformChanged)
2015-10-27 01:20:26 +00:00
onAppInit: (@app) ->
2015-11-09 21:33:04 +00:00
editingTrackValid: () ->
true
onMixersChanged: (mixers) ->
@loadChannels()
@loadTrackInstruments()
@changed()
onPlatformChanged: (platform) ->
@platform = platform
2015-12-23 15:51:43 +00:00
onReset: (loadProfile) ->
2015-10-27 14:19:14 +00:00
logger.debug("ConfigureTracksStore:reset", this)
2015-11-01 12:39:51 +00:00
@trackNumber = null
@editingTrack = null
2015-12-23 15:51:43 +00:00
# you have to load the current profile in order to see track info, which we need
#if loadProfile
#currentProfile = context.jamClient.LastUsedProfileName();
#result = context.jamClient.FTUELoadAudioConfiguration(currentProfile);
2015-10-27 01:20:26 +00:00
@loadChannels()
2015-11-09 21:33:04 +00:00
@loadTrackInstruments()
2015-12-04 21:29:59 +00:00
#if force || context.jamClient.hasVstAssignment()
# @performVstScan()
@listVsts()
@performMidiScan()
@listPaths()
2015-11-09 21:33:04 +00:00
@changed()
2015-10-27 01:20:26 +00:00
onEnableVst: () ->
logger.debug("enabling VSTs")
context.jamClient.VSTLoad()
setTimeout((() =>
@listVsts()
@changed()
), 250)
2015-10-27 01:20:26 +00:00
onTrySave: () ->
logger.debug("ConfigureTracksStore:trySave")
2015-10-27 14:19:14 +00:00
@trySave()
trySave: () ->
2015-10-27 01:20:26 +00:00
2015-10-30 14:59:50 +00:00
onVstScan: () ->
2015-11-09 21:33:04 +00:00
@performVstScan(true)
2015-11-13 21:35:13 +00:00
@changed()
2015-11-09 21:33:04 +00:00
performVstScan: (sendChanged) ->
#@hasVst = gon.global.vst_enabled & context.jamClient.hasVstHost()
2015-11-01 12:39:51 +00:00
logger.debug("hasVst", @hasVst)
if @hasVst
2015-10-30 14:59:50 +00:00
logger.debug("vstScan starting")
2015-11-13 21:35:13 +00:00
@scanningVsts = true
@scannedBefore = true
2015-11-09 21:33:04 +00:00
result = context.jamClient.VSTScan("window.ConfigureTracksStore.onVstScanComplete")
2015-10-30 14:59:50 +00:00
2015-11-09 21:33:04 +00:00
onClearVsts: () ->
context.jamClient.VSTClearAll()
setTimeout((() =>
@listVsts()
@changed()
), 250)
onManageVsts:() ->
logger.debug("manage vst selected")
@app.layout.showDialog('manage-vsts-dialog')
2015-11-09 21:33:04 +00:00
onVstScanComplete: () ->
2015-11-21 21:29:15 +00:00
# XXX must wait a long time to get track assignments after scan/
logger.debug("vst scan complete")
2015-12-04 18:08:40 +00:00
@scanningVsts = false
2015-11-11 11:39:28 +00:00
setTimeout((() =>
@listVsts()
@changed()
2015-12-04 21:29:59 +00:00
), 100 )
2015-11-21 21:29:15 +00:00
onVstChanged: () ->
2015-12-04 21:29:59 +00:00
setTimeout()
2015-11-21 21:29:15 +00:00
logger.debug("vst changed")
setTimeout((() =>
@listVsts()
@changed()
2015-11-11 11:39:28 +00:00
), 0)
2015-11-09 21:33:04 +00:00
listPaths: () ->
@scanPaths = context.jamClient.VSTListSearchPaths()
# this comes from the JUCE library behavior
vstTypeId: () ->
if @platform.isWindows
logger.debug("vstTypeId is windows")
0
else
logger.debug("vstTypeId is not-windows")
1
onAddSearchPath: (path) ->
logger.debug("VSTAddSearchPath: " + path)
context.jamClient.VSTAddSearchPath(@vstTypeId(), path)
@listPaths()
@changed()
onRemoveSearchPath: (path) ->
logger.debug("VSTRemoveSearchPath: " + path)
context.jamClient.VSTRemoveSearchPath(@vstTypeId(), path)
@listPaths()
@changed()
onSelectVSTDirectory:() ->
context.jamClient.ShowSelectVSTScanDialog("window.ConfigureTracksStore.onVSTPathSelected")
onVSTPathSelected: (result) ->
success = result.success
path = result.vstPath
if success
logger.debug("vst path selected!", path)
@onAddSearchPath(path)
else
logger.debug("nothing selected")
2015-11-09 21:33:04 +00:00
listVsts: () ->
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
@vstPluginList = context.jamClient.VSTListVsts()
@vstTrackAssignments = context.jamClient.VSTListTrackAssignments()
2015-10-30 14:59:50 +00:00
2015-11-01 12:39:51 +00:00
onMidiScan: () ->
2015-11-09 21:33:04 +00:00
@performMidiScan()
@changed()
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
performMidiScan: () ->
2015-11-13 20:00:37 +00:00
if !@hasVst
logger.debug("performMidiScan skipped due to no VST")
return
2015-11-09 21:33:04 +00:00
context.jamClient.VST_ScanForMidiDevices();
@attachedMidiDevices = context.jamClient.VST_GetMidiDeviceList();
2015-11-01 12:39:51 +00:00
2015-11-09 21:33:04 +00:00
# trackNumber is 0-based, and optional
onShowVstSettings: (trackNumber) ->
2015-11-13 20:00:37 +00:00
if !@hasVst
logger.debug("onShowVstSettings skipped due to no VST")
return
2015-11-09 21:33:04 +00:00
if !trackNumber?
trackNumber = @trackNumber - 1 if @trackNumber?
logger.debug("show VST GUI", trackNumber)
context.jamClient.VSTShowHideGui(true, trackNumber) if trackNumber?
2015-10-30 14:59:50 +00:00
2015-12-23 03:28:19 +00:00
findMidiTrack: () ->
midi = null
for assignment in @trackAssignments.inputs.assigned
if assignment.assignment == MIDI_TRACK
midi = assignment
break
midi
removeMidiTrack: () ->
removeIndex = -1
for assignment, i in @trackAssignments.inputs.assigned
if assignment.assignment == MIDI_TRACK
# remove this
removeIndex = i
break
if removeIndex > -1
@trackAssignments.inputs.assigned.splice(removeIndex, 1)
defaultTrackInstrument: (trackNumber) ->
clientInstrument = context.jamClient.TrackGetInstrument(trackNumber)
if clientInstrument == 0
logger.debug("defaulting midi instrument for assignment #{trackNumber}")
# ensure that we always have an instrument set (50 = electric guitar
context.jamClient.TrackSetInstrument(trackNumber, 50)
clientInstrument = 50
context.JK.client_to_server_instrument_map[clientInstrument];
# the backend does not have a consistent way of tracking assigned inputs for midi.
# let's make it seem consistent
injectMidiToTrackAssignments: () ->
if @vstTrackAssignments?
for vst in @vstTrackAssignments.vsts
if vst.track == MIDI_TRACK - 1
if vst.midiDeviceIndex > -1
# first see if midi is already there
midi = @findMidiTrack()
if !midi?
instrument = @defaultTrackInstrument(MIDI_TRACK)
midi = [{assignment: MIDI_TRACK}]
midi.instrument_id = instrument?.server_id
midi.assignment = MIDI_TRACK
@trackAssignments.inputs.assigned.push(midi)
else
@removeMidiTrack()
2015-10-27 01:20:26 +00:00
changed: () ->
2015-12-23 03:28:19 +00:00
@injectMidiToTrackAssignments()
2015-11-09 21:33:04 +00:00
@editingTrack = []
@editingTrack.assignment = @trackNumber
if @trackNumber?
for inputsForTrack in @trackAssignments.inputs.assigned
if inputsForTrack.assignment == @trackNumber
@editingTrack = inputsForTrack
break
2015-11-13 20:00:37 +00:00
# slap on vst, if any, from list of vst assignments
for vst in @vstTrackAssignments.vsts
if vst.track == @editingTrack.assignment - 1
@editingTrack.vst = vst
@editingTrack.midiDeviceIndex = vst.midiDeviceIndex
break
2015-12-04 18:08:40 +00:00
for inputsForTrack in @trackAssignments.inputs.assigned
if vst.track == inputsForTrack.assignment - 1
inputsForTrack.vst = vst
2015-11-13 20:00:37 +00:00
if @editingTrack.vst?
logger.debug("current track has a VST assigned:" + @editingTrack.vst.file)
2015-11-09 21:33:04 +00:00
2015-12-04 21:29:59 +00:00
unscanned = !@scannedBefore && @vstPluginList.vsts.length <= 1
2015-12-23 03:28:19 +00:00
2015-11-09 21:33:04 +00:00
@item = {
unscanned: unscanned,
2015-11-09 21:33:04 +00:00
musicPorts: @musicPorts,
trackAssignments: @trackAssignments,
trackNumber: @trackNumber,
editingTrack: @editingTrack,
vstPluginList: @vstPluginList,
vstTrackAssignments: @vstTrackAssignments,
attachedMidiDevices: @attachedMidiDevices,
nextTrackNumber: @nextTrackNumber,
newTrack: @newTrack,
midiTrackAssignments: @midiTrackAssignments,
2015-11-13 21:35:13 +00:00
scanningVsts: @scanningVsts,
trackType: @trackType,
scanPaths: @scanPaths
2015-11-09 21:33:04 +00:00
}
2015-10-27 14:19:14 +00:00
@trigger(@item)
2015-10-27 01:20:26 +00:00
loadChannels: (forceInputsToUnassign, inputChannelFilter) ->
# inputChannelFilter is an optional argument that is used by the Gear Wizard.
# basically, if an input channel isn't in there, it's not going to be displayed
@musicPorts = context.jamClient.FTUEGetChannels()
2015-10-30 14:59:50 +00:00
# let's populate this bad boy
2015-11-09 21:33:04 +00:00
@trackAssignments = {inputs: {unassigned: [], assigned: [], chat: []}, outputs: {unassigned: [], assigned: []}}
nextTrackNumber = 0
2015-10-30 14:59:50 +00:00
2015-10-27 14:19:14 +00:00
for input in @musicPorts.inputs
2015-10-30 14:59:50 +00:00
if input.assignment == ASSIGNMENT.UNASSIGNED
2015-10-27 14:19:14 +00:00
@trackAssignments.inputs.unassigned.push(input)
else if input.assignment == ASSIGNMENT.CHAT
@trackAssignments.inputs.chat.push(input)
else
2015-11-09 21:33:04 +00:00
nextTrackNumber = input.assignment if input.assignment > nextTrackNumber
2015-10-27 14:19:14 +00:00
# make sure this assignment isn't already preset (you can have multiple inputs per 'track slot')
found = false
for assigned in @trackAssignments.inputs.assigned
2015-10-30 14:59:50 +00:00
if assigned.assignment == input.assignment
2015-10-27 14:19:14 +00:00
assigned.push(input)
found = true
2015-10-27 01:20:26 +00:00
2015-10-27 14:19:14 +00:00
if !found
2015-10-30 14:59:50 +00:00
initial = [input]
initial.assignment = input.assignment # store the assignment on the array itself, so we don't have to check inside the array for an input's assignment (which will all be the same)
@trackAssignments.inputs.assigned.push(initial)
for output in @musicPorts.outputs
2015-10-27 14:19:14 +00:00
if output.assignment == ASSIGNMENT.OUTPUT
@trackAssignments.outputs.assigned.push(output)
else
@trackAssignments.outputs.unassigned.push(output)
2015-10-27 01:20:26 +00:00
2015-11-09 21:33:04 +00:00
@nextTrackNumber = nextTrackNumber + 1
2015-11-01 12:39:51 +00:00
2015-10-30 14:59:50 +00:00
loadTrackInstruments: (forceInputsToUnassign) ->
for inputsForTrack in @trackAssignments.inputs.assigned
2015-11-13 20:00:37 +00:00
2015-11-09 21:33:04 +00:00
clientInstrument = context.jamClient.TrackGetInstrument(inputsForTrack.assignment)
2015-10-30 14:59:50 +00:00
2015-11-13 20:00:37 +00:00
if clientInstrument == 0
logger.debug("defaulting track instrument for assignment #{@trackNumber}")
# ensure that we always have an instrument set (50 = electric guitar
context.jamClient.TrackSetInstrument(inputsForTrack.assignment, 50)
clientInstrument = 50
2015-10-30 14:59:50 +00:00
instrument = context.JK.client_to_server_instrument_map[clientInstrument];
inputsForTrack.instrument_id = instrument?.server_id
2015-11-09 21:33:04 +00:00
onAssociateInputsWithTrack: (inputId1, inputId2) ->
return unless @trackNumber?
for inputs in @editingTrack
context.jamClient.TrackSetAssignment(inputs.id, true, ASSIGNMENT.UNASSIGNED)
if inputId1?
logger.debug("setting input1 #{inputId1} to #{@trackNumber}")
context.jamClient.TrackSetAssignment(inputId1, true, @trackNumber)
if inputId2?
logger.debug("setting input2 #{inputId2} to #{@trackNumber}")
context.jamClient.TrackSetAssignment(inputId2, true, @trackNumber)
result = context.jamClient.TrackSaveAssignments();
if(!result || result.length == 0)
else
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
onAssociateInstrumentWithTrack: (instrumentId) ->
return unless @trackNumber?
logger.debug("context.jamClient.TrackSetInstrument(trackNumber, track.instrument_id)", @trackNumber, instrumentId)
2015-12-23 03:28:19 +00:00
clientInstrumentId = null
2015-11-09 21:33:04 +00:00
if instrumentId != null && instrumentId != ''
2015-12-23 03:28:19 +00:00
clientInstrumentId = context.JK.instrument_id_to_instrument[instrumentId].client_id
2015-11-09 21:33:04 +00:00
else
2015-12-23 03:28:19 +00:00
clientInstrumentId = 0
context.jamClient.TrackSetInstrument(@trackNumber, clientInstrumentId)
if @trackNumber == MIDI_TRACK
logger.debug("checking midi track for track instrument synchronization")
# keep artificial midi track in sync
midi = @findMidiTrack()
if midi?
logger.debug("synced midi track with #{instrumentId}")
midi.instrument_id = instrumentId
2015-11-09 21:33:04 +00:00
if(!result || result.length == 0)
else
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
result = context.jamClient.TrackSaveAssignments()
if(!result || result.length == 0)
else
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
onAssociateVSTWithTrack: (vst) ->
2015-11-13 20:00:37 +00:00
if !@hasVst
logger.debug("onAssociateVSTWithTrack skipped due to no VST")
return
2015-11-09 21:33:04 +00:00
if vst?
2015-12-04 21:29:59 +00:00
logger.debug("associating track:#{@trackNumber - 1} with VST:#{vst.file}")
2015-11-09 21:33:04 +00:00
found = null
for knownVst in @vstPluginList.vsts
if knownVst.file == vst.file
found = knownVst
break
if found?
context.jamClient.VSTSetTrackAssignment(found, @trackNumber - 1)
else
logger.error("unable to locate vst for #{vst}")
else
logger.debug("unassociated track:#{@trackNumber} with VST")
# no way to unset VST assignment yet
setTimeout((() => (
@listVsts()
@changed()
)), 250)
onCancelEdit: () ->
if @newTrack
for input in @editingTrack
context.jamClient.TrackSetAssignment(input.id, true, ASSIGNMENT.UNASSIGNED)
result = context.jamClient.TrackSaveAssignments()
if(!result || result.length == 0)
else
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
else
logger.error("unable to process cancel for an existing track")
onDeleteTrack: (assignment) ->
2015-12-23 03:28:19 +00:00
logger.debug("deleting track with assignment #{assignment}")
if assignment != MIDI_TRACK
track = null
for inputsForTrack in @trackAssignments.inputs.assigned
if inputsForTrack.assignment == assignment
track = inputsForTrack
break
2015-11-09 21:33:04 +00:00
2015-12-23 03:28:19 +00:00
if track?
for input in inputsForTrack
context.jamClient.TrackSetAssignment(input.id, true, ASSIGNMENT.UNASSIGNED)
result = context.jamClient.TrackSaveAssignments()
2015-11-09 21:33:04 +00:00
2015-12-23 03:28:19 +00:00
if(!result || result.length == 0)
2015-11-09 21:33:04 +00:00
2015-12-23 03:28:19 +00:00
else
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
else
logger.error("unable to find track to delete")
2015-11-09 21:33:04 +00:00
else
2015-12-23 03:28:19 +00:00
logger.debug("deleting midi track")
@onAssociateMIDIWithTrack(null)
@removeMidiTrack()
@changed()
2015-11-09 21:33:04 +00:00
2015-12-23 03:28:19 +00:00
onShowAddNewTrack: (type) ->
2015-11-09 21:33:04 +00:00
# check if we have what we need... namely, free ports
2015-12-23 03:28:19 +00:00
if type == 'audio'
if @trackAssignments.inputs.unassigned.length == 0
context.JK.Banner.showAlert('You have no more unassigned input ports.<br/><br/>You can free some up by editing an AUDIO track.')
return
@openLiveTrackDialog(@nextTrackNumber)
else
if @findMidiTrack()?
context.JK.Banner.showAlert('You have only one MIDI input.')
return
@openLiveTrackDialog(MIDI_TRACK)
2015-11-09 21:33:04 +00:00
onShowEditTrack: (trackNumber) ->
@openLiveTrackDialog(trackNumber)
2015-10-30 14:59:50 +00:00
openLiveTrackDialog: (trackNumber) ->
@trackNumber = trackNumber
2015-12-23 15:51:43 +00:00
logger.debug("opening live track dialog for track #{trackNumber}", @trackAssignments.inputs.assigned)
2015-10-30 14:59:50 +00:00
2015-11-09 21:33:04 +00:00
@newTrack = true
2015-10-30 14:59:50 +00:00
for inputsForTrack in @trackAssignments.inputs.assigned
2015-11-09 21:33:04 +00:00
logger.debug("inputsForTrack.assignment @trackNumber", inputsForTrack.assignment, @trackNumber )
if inputsForTrack.assignment == @trackNumber
@newTrack = false
2015-10-30 14:59:50 +00:00
break
2015-12-23 03:28:19 +00:00
if @trackNumber == MIDI_TRACK
@trackType = 'midi'
2015-11-09 21:33:04 +00:00
else
2015-12-23 03:28:19 +00:00
@trackType = 'audio'
2015-11-09 21:33:04 +00:00
if @newTrack
2015-11-13 20:00:37 +00:00
assignment = context.jamClient.TrackGetInstrument(@trackNumber)
if assignment == 0
logger.debug("defaulting track instrument for assignment #{@trackNumber}")
# ensure that we always have an instrument set (50 = electric guitar
context.jamClient.TrackSetInstrument(@trackNumber, 50)
2015-11-09 21:33:04 +00:00
#@performVstScan()
2015-12-04 21:29:59 +00:00
@performMidiScan()
2015-10-30 14:59:50 +00:00
@changed()
@app.layout.showDialog('configure-live-tracks-dialog')
2015-11-09 21:33:04 +00:00
onDesiredTrackType: (trackType) ->
@trackType = trackType
2015-12-04 21:29:59 +00:00
if @trackType == 'midi'
2015-12-23 03:28:19 +00:00
@trackNumber = MIDI_TRACK
2015-11-09 21:33:04 +00:00
@changed()
onUpdateOutputs: (outputId1, outputId2) ->
context.jamClient.TrackSetAssignment(outputId1, true, ASSIGNMENT.OUTPUT);
context.jamClient.TrackSetAssignment(outputId2, true, ASSIGNMENT.OUTPUT);
result = context.jamClient.TrackSaveAssignments();
if(!result || result.length == 0)
else
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
onShowEditOutputs: () ->
@app.layout.showDialog('configure-outputs-dialog')
onAssociateMIDIWithTrack: (midiInterface) ->
2015-12-23 03:28:19 +00:00
@trackNumber = MIDI_TRACK
2015-12-04 21:29:59 +00:00
2015-11-09 21:33:04 +00:00
if !midiInterface? || midiInterface == ''
logger.debug("disabling midiInterface:#{midiInterface}, track:#{@trackNumber - 1}")
context.jamClient.VST_EnableMidiForTrack(@trackNumber - 1, false, 0)
else
logger.debug("enabling midiInterface:#{midiInterface}, track:#{@trackNumber - 1}")
context.jamClient.VST_EnableMidiForTrack(@trackNumber - 1, true, midiInterface)
setTimeout((() => (
@listVsts()
@changed()
)), 250)
2015-10-27 01:20:26 +00:00
}
)