private void RunCue(int cueId, Cue cue, bool snap, bool lastCue)
{
var watch = Stopwatch.StartNew();
CancellationTokenSource cancelSource;
if (this.triggerCancelSources.TryGetValue(cue, out cancelSource))
{
cancelSource.Cancel();
}
this.currentCueId.OnNext(cueId);
var cueInstance = new CueInstance();
if (cue.PartIntensity != null)
{
foreach (var device in cue.Devices)
{
var brightnessDevice = device as IReceivesBrightness;
if (brightnessDevice == null)
continue;
var observer = GetControlledObserverBrightness(brightnessDevice);
StopCurrentTask(device, Cue.CueParts.Intensity);
var fadeTask = Executor.Current.MasterEffect.Fade(
observer,
brightnessDevice.Brightness,
cue.PartIntensity.Destination,
snap ? 0 : cue.PartIntensity.FadeMs);
cueInstance.AddNewTask(device, Cue.CueParts.Intensity, fadeTask, () => MibCheck(cueId, device));
}
}
if (cue.PartColor != null)
{
foreach (var device in cue.Devices)
{
var colorDevice = device as IReceivesColor;
if (colorDevice == null)
continue;
var observer = GetControlledObserverColor(colorDevice);
StopCurrentTask(device, Cue.CueParts.Color);
var fadeTask = Executor.Current.MasterEffect.Fade(
observer,
colorDevice.Color,
cue.PartColor.Destination,
snap ? 0 : cue.PartColor.FadeMs);
cueInstance.AddNewTask(device, Cue.CueParts.Color, fadeTask);
}
}
if (cue.PartPan != null)
{
foreach (var device in cue.Devices)
{
var panTiltDevice = device as IReceivesPanTilt;
if (panTiltDevice == null)
continue;
var observer = GetControlledObserverPan(panTiltDevice);
StopCurrentTask(device, Cue.CueParts.Pan);
var fadeTask = Executor.Current.MasterEffect.Fade(
observer,
panTiltDevice.Pan,
cue.PartPan.Destination,
snap ? 0 : cue.PartPan.FadeMs);
cueInstance.AddNewTask(device, Cue.CueParts.Pan, fadeTask);
}
}
if (cue.PartTilt != null)
{
foreach (var device in cue.Devices)
{
var panTiltDevice = device as IReceivesPanTilt;
if (panTiltDevice == null)
continue;
var observer = GetControlledObserverTilt(panTiltDevice);
StopCurrentTask(device, Cue.CueParts.Tilt);
var fadeTask = Executor.Current.MasterEffect.Fade(
observer, panTiltDevice.Tilt,
cue.PartTilt.Destination,
snap ? 0 : cue.PartTilt.FadeMs);
cueInstance.AddNewTask(device, Cue.CueParts.Tilt, fadeTask);
}
}
this.currentInstance = cueInstance;
var allTasks = cueInstance.GetAllTasks();
if (allTasks.Length > 0)
{
Task.WhenAll(allTasks).ContinueWith(x =>
{
watch.Stop();
this.cueCompleted.OnNext(Tuple.Create(cueId, watch.ElapsedMilliseconds));
if (!snap && lastCue)
{
this.currentCueId.OnNext(null);
this.currentInstance = null;
ReleaseLocks();
}
});
}
else
{
watch.Stop();
this.cueCompleted.OnNext(Tuple.Create(cueId, watch.ElapsedMilliseconds));
}
}