예제 #1
0
        private void MyWaveFormCallback(int framesDone, int framesTotal, TimeSpan elapsedTime, bool finished)
        {
            if (finished)
            {
                _WF.SyncPlayback(_currentTrack.Channel);

                // and do pre-calculate the next track position
                // in this example we will only use the end-position
                long startPos = 0L;
                long endPos   = 0L;
                if (_WF.GetCuePoints(ref startPos, ref endPos, -24.0, -12.0, true))
                {
                    _currentTrack.NextTrackPos = endPos;
                    // if there is already a sync set, remove it first
                    if (_currentTrack.NextTrackSync != 0)
                    {
                        BassMix.BASS_Mixer_ChannelRemoveSync(_currentTrack.Channel, _currentTrack.NextTrackSync);
                    }

                    // set the next track sync automatically
                    _currentTrack.NextTrackSync = BassMix.BASS_Mixer_ChannelSetSync(_currentTrack.Channel, BASSSync.BASS_SYNC_POS | BASSSync.BASS_SYNC_MIXTIME, _currentTrack.NextTrackPos, _currentTrack.TrackSync, new IntPtr(1));

                    _WF.AddMarker("Next", _currentTrack.NextTrackPos);
                }
            }
            // will be called during rendering...
            DrawWave();
        }
        /// <summary>
        ///     Clears the automation sync positions.
        /// </summary>
        /// <param name="track">The track.</param>
        private void ClearAutomationSyncPositions(AudioStream track)
        {
            foreach (var trigger in AutomationAttributesHelper.GetAutomationAttributes(track.Description).TrackFXTriggers)
            {
                if (trigger.StartSyncId != int.MinValue)
                {
                    BassMix.BASS_Mixer_ChannelRemoveSync(track.ChannelId, trigger.StartSyncId);
                    trigger.StartSyncId = int.MinValue;
                }
                if (trigger.EndSyncId == int.MinValue)
                {
                    continue;
                }

                BassMix.BASS_Mixer_ChannelRemoveSync(track.ChannelId, trigger.EndSyncId);
                trigger.EndSyncId = int.MinValue;
            }

            foreach (var trigger in GetCurrentSampleTriggers())
            {
                if (trigger.StartSyncId != int.MinValue)
                {
                    BassMix.BASS_Mixer_ChannelRemoveSync(track.ChannelId, trigger.StartSyncId);
                    trigger.StartSyncId = int.MinValue;
                }

                if (trigger.EndSyncId == int.MinValue)
                {
                    continue;
                }

                BassMix.BASS_Mixer_ChannelRemoveSync(track.ChannelId, trigger.EndSyncId);
                trigger.EndSyncId = int.MinValue;
            }
        }
예제 #3
0
 private static void RemoveSyncFromStream(AudioStream audioStream, AudioSync sync)
 {
     if (sync.Id == int.MinValue)
     {
         return;
     }
     BassMix.BASS_Mixer_ChannelRemoveSync(audioStream.ChannelId, sync.Id);
     sync.Id = int.MinValue;
 }
예제 #4
0
        private void pictureBoxWaveForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (_WF == null)
            {
                return;
            }

            bool doubleClick = e.Clicks > 1;
            bool lowerHalf   = (e.Y > pictureBoxWaveForm.Height / 2);

            if (lowerHalf && doubleClick)
            {
                ToggleZoom();
            }
            else if (!lowerHalf && e.Button == MouseButtons.Left)
            {
                // left button will set the position
                long pos = _WF.GetBytePositionFromX(e.X, pictureBoxWaveForm.Width, _zoomStart, _zoomEnd);
                SetEnvelopePos(_currentTrack.Channel, pos);
            }
            else if (!lowerHalf)
            {
                _currentTrack.NextTrackPos = _WF.GetBytePositionFromX(e.X, pictureBoxWaveForm.Width, _zoomStart, _zoomEnd);
                // if there is already a sync set, remove it first
                if (_currentTrack.NextTrackSync != 0)
                {
                    BassMix.BASS_Mixer_ChannelRemoveSync(_currentTrack.Channel, _currentTrack.NextTrackSync);
                }

                // right button will set a next track position sync
                _currentTrack.NextTrackSync = BassMix.BASS_Mixer_ChannelSetSync(_currentTrack.Channel, BASSSync.BASS_SYNC_POS | BASSSync.BASS_SYNC_MIXTIME, _currentTrack.NextTrackPos, _currentTrack.TrackSync, new IntPtr(1));

                _WF.AddMarker("Next", _currentTrack.NextTrackPos);
                DrawWave();
            }
        }
        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);
            }
        }