public bool CanAddPoint(PhonemeType phonemeType, ProjectLine projectLine) { if (projectLine.Recline == null) { return(false); } var phonemes = projectLine.Recline.PhonemesOfType(phonemeType); var neededCount = phonemes.Count * 2; var realPhonemes = projectLine.PointsOfType(phonemeType, virtuals: false).Count; var canIfNoSkip = realPhonemes < neededCount; if (!IsConfigured()) { return(canIfNoSkip); } var filename = projectLine.Recline.Name; if (!wavGroupsByFilename.ContainsKey(filename)) { return(canIfNoSkip); } var wavGroup = wavGroupsByFilename[filename][0]; var skips = wavGroup.GetSkippedPhonemesOfType(phonemeType); var neededByGroup = 0; for (var i = 0; i < phonemes.Count; i++) { if (!skips.Contains(i)) { neededByGroup += 2; } } return(realPhonemes < neededByGroup); }
private bool ApplyZonesAndReturnCompleted(ProjectLine projectLine, PhonemeType type) { var points = projectLine.PointsOfType(type, false); var zones = projectLine.ZonesOfType(type); var phonemes = projectLine.Recline.PhonemesOfType(type); var filename = projectLine.Recline.Name; zones.Clear(); var completed = true; int pointI = 0; if (type == PhonemeType.Rest) { for (int i = 0; i < phonemes.Count; i++) { while (WavMask.MustSkipPhoneme(filename, type, i) && i < phonemes.Count) { phonemes[i].IsSkipped = true; i++; } if (i >= phonemes.Count) { return(completed); } var phoneme = phonemes[i]; phoneme.IsSkipped = false; if ((i == 0 || i == phonemes.Count - 1) && pointI < points.Count) { var pointIn = points[pointI]; var pointOut = points[pointI]; pointI++; phoneme.Zone = new Zone(pointIn, pointOut); phoneme.HasZone = true; zones.Add(phoneme.Zone); } else if (pointI + 1 >= points.Count) { completed = false; phoneme.Zone = new Zone(); phoneme.HasZone = false; } else { var pointIn = points[pointI]; pointI++; var pointOut = points[pointI]; pointI++; phoneme.Zone = new Zone(pointIn, pointOut); phoneme.HasZone = true; zones.Add(phoneme.Zone); } } } else { for (int i = 0; i < phonemes.Count; i++) { while (WavMask.MustSkipPhoneme(filename, type, i) && i < phonemes.Count) { phonemes[i].IsSkipped = true; i++; } if (i >= phonemes.Count) { return(completed); } var phoneme = phonemes[i]; phoneme.IsSkipped = false; if (pointI + 1 >= points.Count) { completed = false; phoneme.Zone = new Zone(); phoneme.HasZone = false; } else { var pointIn = points[pointI]; pointI++; var pointOut = points[pointI]; pointI++; phoneme.Zone = new Zone(pointIn, pointOut); phoneme.HasZone = true; zones.Add(phoneme.Zone); } } } return(completed); }