/// <summary>
        ///     Draws the current selected position.
        /// </summary>
        private void DrawCurrentPosition()
        {
            var position = AudioStreamHelper.GetPosition(BassPlayer.RawLoopTrack);

            BeginInvoke((MethodInvoker) delegate
            {
                var oldBitmap = picWaveForm.Image;
                var bitmap    = new Bitmap(picWaveForm.Width, picWaveForm.Height);

                if (position >= ZoomStart && position <= ZoomEnd)
                {
                    var positionPercent = (position - ZoomStart) / (double)ZoomLength;
                    var x = Convert.ToInt32(Math.Round(positionPercent * picWaveForm.Width, 0));

                    using (var pen = new Pen(Color.Gray))
                        using (var graphics = Graphics.FromImage(bitmap))
                        {
                            graphics.Clear(Color.Black);
                            graphics.DrawLine(pen, x, 0, x, picWaveForm.Height - 1);
                        }
                }
                bitmap.MakeTransparent(Color.Black);
                picWaveForm.Image = bitmap;

                oldBitmap?.Dispose();
            });
        }
        /// <summary>
        ///     Mutes the track FX.
        /// </summary>
        public void StopTrackFxSend()
        {
            if (CurrentTrack == null || LastTrackFxTrigger == null || LastTrackFxTriggerTrack == null)
            {
                return;
            }

            // DebugHelper.WriteLine("Start StopTrackFXSend");

            _trackSendMixer.SetVolume(0);

            // DebugHelper.WriteLine("Calculate TrackFXSend Length");

            var position        = AudioStreamHelper.GetPosition(LastTrackFxTriggerTrack);
            var positionSeconds = LastTrackFxTriggerTrack.SamplesToSeconds(position);
            var length          = positionSeconds - LastTrackFxTrigger.Start;

            if (length <= 0 || position >= LastTrackFxTriggerTrack.FadeOutStart)
            {
                length = LastTrackFxTriggerTrack.SamplesToSeconds(LastTrackFxTriggerTrack.FadeOutStart) -
                         LastTrackFxTrigger.Start;
            }

            LastTrackFxTrigger.Length = length;

            // DebugHelper.WriteLine("End StopTrackFXSend");
        }
        public void StopRecordingManualExtendedMix(bool powerDownAfterFade)
        {
            if (CurrentTrack == null)
            {
                return;
            }
            if (PreviousTrack == null)
            {
                return;
            }
            if (!IsManualMixMode)
            {
                return;
            }
            if (PreviousManaulExtendedFadeType == ExtendedFadeType.PowerDown)
            {
                return;
            }

            CreateLastExtendedMixAttributes();

            var attributes = LastExtendedMixAttributes;

            attributes.FadeEnd            = AudioStreamHelper.GetPosition(PreviousTrack);
            attributes.FadeLength         = GetAdjustedPositionSeconds(CurrentTrack);
            attributes.FadeEndLoop        = PreviousTrack.CurrentEndLoop;
            attributes.FadeEndVolume      = Convert.ToSingle(AudioStreamHelper.GetVolume(PreviousTrack) / 100);
            attributes.PowerDownAfterFade = powerDownAfterFade;

            if (IsManualMixMode)
            {
                RaiseOnEndFadeIn();
            }
        }
        private void ApplySyncIfOneExistsForCurrentPosition(AudioStream audioStream)
        {
            var position = AudioStreamHelper.GetPosition(audioStream);
            var sync     = GetAudioSync(audioStream, position);

            if (sync != null && sync.SyncType != SyncType.AudioStreamEvent)
            {
                OnSync(sync.Id, audioStream.ChannelId, int.MinValue, IntPtr.Zero);
            }
        }
        /// <summary>
        ///     Gets the current automated track FX.
        /// </summary>
        /// <returns>The current automated track FX.</returns>
        private SampleTrigger GetCurrentSampleTrigger(AutomationAttributes attributes = null)
        {
            if (CurrentTrack == null)
            {
                return(null);
            }
            if (attributes == null)
            {
                attributes = AutomationAttributesHelper.GetAutomationAttributes(CurrentTrack.Description);
            }

            var position = AudioStreamHelper.GetPosition(CurrentTrack);

            return(GetCurrentSampleTriggers(attributes)
                   .OrderBy(t => Math.Abs(t.StartSample - position))
                   .FirstOrDefault());
        }
        private void StopRecordingSampleTrigger()
        {
            if (CurrentTrack == null || LastSampleTrigger == null || LastSampleTriggerTrack == null)
            {
                return;
            }

            var position        = AudioStreamHelper.GetPosition(LastSampleTriggerTrack);
            var positionSeconds = LastSampleTriggerTrack.SamplesToSeconds(position);
            var length          = positionSeconds - LastSampleTrigger.Start;

            if (length <= 0 || position >= LastSampleTriggerTrack.FadeOutStart)
            {
                length = LastSampleTriggerTrack.SamplesToSeconds(LastSampleTriggerTrack.FadeOutStart) -
                         LastSampleTrigger.Start;
            }

            LastSampleTrigger.Length = length;
        }
        /// <summary>
        ///     Silences the track FX.
        /// </summary>
        public void StartTrackFxSend()
        {
            _trackSendMixer.SetVolume(50M);
            if (CurrentTrack == null)
            {
                return;
            }

            LastTrackFxTriggerTrack = CurrentTrack;

            var position = AudioStreamHelper.GetPosition(LastTrackFxTriggerTrack);

            LastTrackFxTrigger = new TrackFXTrigger
            {
                Start      = LastTrackFxTriggerTrack.SamplesToSeconds(position),
                DelayNotes = TrackSendFxDelayNotes
            };

            _trackSendMixer.SetPluginBpm();
        }
        /// <summary>
        ///     Gets the current automated track FX.
        /// </summary>
        /// <returns>The current automated track FX.</returns>
        private TrackFXTrigger GetPrevTrackFxTrigger(AutomationAttributes attributes = null)
        {
            if (CurrentTrack == null)
            {
                return(null);
            }

            if (attributes == null)
            {
                attributes = AutomationAttributesHelper.GetAutomationAttributes(CurrentTrack.Description);
            }

            var position = AudioStreamHelper.GetPosition(CurrentTrack);

            return(attributes
                   .TrackFXTriggers
                   .Where(ta => ta.StartSample <= position)
                   .OrderBy(ta => Math.Abs(ta.StartSample - position))
                   .FirstOrDefault());
        }
        private void StartRecordingSampleTrigger(Sample sample)
        {
            if (CurrentTrack == null)
            {
                return;
            }
            if (sample == null)
            {
                return;
            }

            LastSampleTriggerTrack = CurrentTrack;
            LastSampleTriggerNextTrackDescription = NextTrack == null ? "" : NextTrack.Description;
            LastSampleTriggerPrevTrackDescription = PreviousTrack == null ? "" : PreviousTrack.Description;

            var position = AudioStreamHelper.GetPosition(LastSampleTriggerTrack);

            LastSampleTrigger = new SampleTrigger
            {
                Start      = LastSampleTriggerTrack.SamplesToSeconds(position),
                DelayNotes = SamplerDelayNotes,
                SampleId   = sample.SampleId
            };
        }
        public void ForceFadeNow(ForceFadeType fadeType)
        {
            if (PlayState != PlayState.Playing)
            {
                return;
            }

            if (NextTrack == null || CurrentTrack == null)
            {
                return;
            }

            if (fadeType == ForceFadeType.SkipToEnd)
            {
                AudioStreamHelper.SetPosition(CurrentTrack,
                                              CurrentTrack.FadeOutStart - CurrentTrack.SecondsToSamples(0.01M));
            }
            else
            {
                CurrentForceFadeType = fadeType;
                IsForceFadeNowMode   = true;

                var length = 0D;
                switch (fadeType)
                {
                case ForceFadeType.Cut:
                    length = GetCutFadeLength(CurrentTrack);
                    break;

                case ForceFadeType.PowerDown:
                    length = GetPowerDownFadeLength(CurrentTrack);
                    CurrentTrack.PowerDownOnEnd = true;
                    break;

                case ForceFadeType.QuickFade:
                    length = GetCutFadeLength(CurrentTrack);
                    break;

                case ForceFadeType.SkipToEnd:
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(fadeType), fadeType, null);
                }

                if (CurrentTrack.FadeOutLengthSeconds < length)
                {
                    length = CurrentTrack.FadeOutLengthSeconds;
                }

                CurrentTrack.EndLoopCount = 0;

                BassMix.BASS_Mixer_ChannelRemoveSync(CurrentTrack.ChannelId, CurrentTrack.FadeOutStartSyncId);
                CurrentTrack.FadeOutStartSyncId = int.MinValue;
                BassMix.BASS_Mixer_ChannelRemoveSync(CurrentTrack.ChannelId, CurrentTrack.FadeOutEndSyncId);
                CurrentTrack.FadeOutEndSyncId = int.MinValue;

                var position = AudioStreamHelper.GetPosition(CurrentTrack);
                CurrentTrack.FadeOutStart = position + CurrentTrack.SecondsToSamples(0.05M);
                SetTrackSync(CurrentTrack, CurrentTrack.FadeOutStart, SyncType.StartFadeOut);

                CurrentTrack.FadeOutEnd = CurrentTrack.FadeOutStart + CurrentTrack.SecondsToSamples(length);
                SetTrackSync(CurrentTrack, CurrentTrack.FadeOutEnd, SyncType.EndFadeOut);
            }
        }