Exemplo n.º 1
0
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // INIT COMMAND BINDINGS
            CommandBinding playBinding = new CommandBinding(MediaCommands.Play);

            CommandBindings.Add(playBinding);
            playBinding.CanExecute += playCommandBinding_CanExecute;
            playBinding.Executed   += playCommandBinding_Executed;

            CommandBinding pauseBinding = new CommandBinding(MediaCommands.Pause);

            CommandBindings.Add(pauseBinding);
            pauseBinding.CanExecute += pauseCommandBinding_CanExecute;
            pauseBinding.Executed   += pauseCommandBinding_Executed;

            CommandBinding playToggleBinding = new CommandBinding(Commands.PlayToggle);

            CommandBindings.Add(playToggleBinding);
            playToggleBinding.Executed += playToggleBinding_Executed;

            // Execute the following code after window and controls are fully loaded and initialized
            // http://stackoverflow.com/a/1746975
            Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, (Action)(() => {
                multiTrackViewer1.ItemsSource = trackList;
                multiTrackViewer1.Matches.Add(match);
                multiTrackViewer1.SelectedMatch = match;
                this.Focus();
            }));
            // the following must be called separately on the dispatcher, else the track controls are not initialized yet
            Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, (Action)ZoomToMatch);


            // INIT PLAYER
            player = new MultitrackPlayer(trackList);
            player.VolumeAnnounced += (sender2, e2) => Dispatcher.BeginInvoke((Action)(() => {
                if (e2.MaxSampleValues.Length >= 2)
                {
                    stereoVUMeter1.AmplitudeLeft = e2.MaxSampleValues[0];
                    stereoVUMeter1.AmplitudeRight = e2.MaxSampleValues[1];
                }
            }));

            player.CurrentTimeChanged += (sender2, e2) => multiTrackViewer1.Dispatcher.BeginInvoke((Action)(() => {
                multiTrackViewer1.VirtualCaretOffset = e2.Value.Ticks;
                // autoscroll
                if (multiTrackViewer1.VirtualViewportInterval.To <= multiTrackViewer1.VirtualCaretOffset)
                {
                    multiTrackViewer1.VirtualViewportOffset = multiTrackViewer1.VirtualCaretOffset;
                }
            }));

            player.PlaybackStateChanged += (sender2, e2) =>
                                           multiTrackViewer1.Dispatcher.BeginInvoke((Action)CommandManager.InvalidateRequerySuggested);

            volumeSlider.ValueChanged += (sender2, e2) => player.Volume = (float)e2.NewValue;

            // INIT PROGRESSBAR
            progressBar.IsEnabled                      = false;
            progressMonitor.ProcessingStarted         += Instance_ProcessingStarted;
            progressMonitor.ProcessingProgressChanged += Instance_ProcessingProgressChanged;
            progressMonitor.ProcessingFinished        += Instance_ProcessingFinished;
            ProgressMonitor.GlobalInstance.AddChild(progressMonitor);
        }
Exemplo n.º 2
0
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Title = Title + (Environment.Is64BitProcess ? " (x64)" : " (x86)");

            multiTrackViewer1.ItemsSource = trackList;

            // INIT COMMAND BINDINGS
            CommandBinding playBinding = new CommandBinding(MediaCommands.Play);

            CommandBindings.Add(playBinding);
            playBinding.CanExecute += new CanExecuteRoutedEventHandler(playCommandBinding_CanExecute);
            playBinding.Executed   += new ExecutedRoutedEventHandler(playCommandBinding_Executed);

            CommandBinding pauseBinding = new CommandBinding(MediaCommands.Pause);

            CommandBindings.Add(pauseBinding);
            pauseBinding.CanExecute += new CanExecuteRoutedEventHandler(pauseCommandBinding_CanExecute);
            pauseBinding.Executed   += new ExecutedRoutedEventHandler(pauseCommandBinding_Executed);

            CommandBinding playToggleBinding = new CommandBinding(Commands.PlayToggle);

            CommandBindings.Add(playToggleBinding);
            playToggleBinding.Executed += new ExecutedRoutedEventHandler(playToggleBinding_Executed);


            //// INIT TRACKLIST STUFF
            //trackList.PropertyChanged += delegate(object sender2, PropertyChangedEventArgs e2) {
            //    if (e2.PropertyName == "TotalLength") {
            //        multiTrackViewer1.VirtualViewportMaxWidth = trackList.TotalLength.Ticks;
            //    }
            //};


            // INIT PLAYER
            player = new MultitrackPlayer(trackList);
            player.VolumeAnnounced += Player_VolumeAnnounced_VolumeMeter;

            player.CurrentTimeChanged += new EventHandler <ValueEventArgs <TimeSpan> >(
                delegate(object sender2, ValueEventArgs <TimeSpan> e2) {
                multiTrackViewer1.Dispatcher.BeginInvoke((Action) delegate {
                    multiTrackViewer1.VirtualCaretOffset = e2.Value.Ticks;
                    // autoscroll
                    if (multiTrackViewer1.VirtualViewportInterval.To <= multiTrackViewer1.VirtualCaretOffset)
                    {
                        multiTrackViewer1.VirtualViewportOffset = multiTrackViewer1.VirtualCaretOffset;
                    }
                });
            });

            player.PlaybackStateChanged += new EventHandler(
                delegate(object sender2, EventArgs e2) {
                multiTrackViewer1.Dispatcher.BeginInvoke((Action) delegate {
                    // CommandManager must be called on the GUI-thread, else it won't do anything
                    CommandManager.InvalidateRequerySuggested();
                });
            });

            volumeSlider.ValueChanged += new RoutedPropertyChangedEventHandler <double>(
                delegate(object sender2, RoutedPropertyChangedEventArgs <double> e2) {
                player.Volume = (float)e2.NewValue;
            });


            // INIT PROGRESSBAR
            progressBar1.IsEnabled = false;
            ProgressMonitor.GlobalInstance.ProcessingStarted += new EventHandler(
                delegate(object sender2, EventArgs e2) {
                progressBar1.Dispatcher.BeginInvoke((Action) delegate {
                    progressBar1.IsEnabled    = true;
                    progressBar1Label.Text    = ProgressMonitor.GlobalInstance.StatusMessage;
                    win7TaskBar.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Normal;
                    win7TaskBar.ProgressValue = 0;
                });
            });

            ProgressMonitor.GlobalInstance.ProcessingProgressChanged += new EventHandler <ValueEventArgs <float> >(
                delegate(object sender2, ValueEventArgs <float> e2) {
                progressBar1.Dispatcher.BeginInvoke((Action) delegate {
                    progressBar1.Value        = e2.Value;
                    win7TaskBar.ProgressValue = e2.Value / 100;
                    progressBar1Label.Text    = ProgressMonitor.GlobalInstance.StatusMessage;
                });
            });

            ProgressMonitor.GlobalInstance.ProcessingFinished += new EventHandler(
                delegate(object sender2, EventArgs e2) {
                progressBar1.Dispatcher.BeginInvoke((Action) delegate {
                    progressBar1.Value        = 0;
                    progressBar1.IsEnabled    = false;
                    progressBar1Label.Text    = "";
                    win7TaskBar.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
                });
            });


            // INIT RANDOM STUFF
            multiTrackViewer1.KeyUp += new KeyEventHandler(delegate(object sender2, KeyEventArgs e2) {
                if (e2.Key == Key.Delete)
                {
                    // create temporary list to avoid concurrent modification exception
                    var selectedAudioTracks = new List <AudioTrack>(multiTrackViewer1.SelectedItems.Cast <AudioTrack>());

                    // delete tracks
                    foreach (AudioTrack audioTrack in selectedAudioTracks)
                    {
                        if (audioTrack != null)
                        {
                            // 1. delete all related matches
                            List <Match> deleteList = new List <Match>();
                            // 1a find all related matches
                            foreach (Match m in multiTrackViewer1.Matches)
                            {
                                if (m.Track1 == audioTrack || m.Track2 == audioTrack)
                                {
                                    deleteList.Add(m);
                                }
                            }
                            // 1b delete
                            foreach (Match m in deleteList)
                            {
                                multiTrackViewer1.Matches.Remove(m);
                            }
                            // 2. delete track
                            trackList.Remove(audioTrack);
                        }
                    }
                    e2.Handled = true;
                }
            });


            // INIT FFT
            int    fftSize     = 1024;
            double correlation = 0;

            fftAnalyzer         = new FFTAnalyzer(fftSize);
            fftAnalyzerConsumer = 2;
            correlationConsumer = 1;
            WindowFunction fftWindow = WindowUtil.GetFunction(WindowType.BlackmanHarris, fftSize);

            fftAnalyzer.WindowFunction  = fftWindow;
            fftAnalyzer.WindowAnalyzed += FftAnalyzer_WindowAnalyzed_FrequencyGraph;
            fftAnalyzer.WindowAnalyzed += FftAnalyzer_WindowAnalyzed_Spectrogram;
            player.SamplesMonitored    += new EventHandler <StreamDataMonitorEventArgs>(delegate(object sender2, StreamDataMonitorEventArgs e2) {
                if (fftAnalyzerConsumer > 0 || correlationConsumer > 0)
                {
                    float[][] uninterleaved = AudioUtil.Uninterleave(e2.Properties, e2.Buffer, e2.Offset, e2.Length, true);
                    if (fftAnalyzerConsumer > 0)
                    {
                        fftAnalyzer.PutSamples(uninterleaved[0]); // put the summed up mono samples into the analyzer
                    }
                    if (correlationConsumer > 0)
                    {
                        correlation = CrossCorrelation.Correlate(uninterleaved[1], uninterleaved[2]);
                        Dispatcher.BeginInvoke((Action) delegate {
                            correlationMeter.Value = correlation;
                        });
                    }
                }
            });
            spectrogram.SpectrogramSize = fftSize / 2;
        }
        /// <summary>
        /// Initializes a new instance of the DropInfo class.
        /// </summary>
        /// 
        /// <param name="sender">
        /// The sender of the drag event.
        /// </param>
        /// 
        /// <param name="e">
        /// The drag event.
        /// </param>
        /// 
        /// <param name="dragInfo">
        /// Information about the source of the drag, if the drag came from within the framework.
        /// </param>
        public DropInfo(object sender, DragEventArgs e, MultitrackPlayer.Utils.DragDrop.DragInfo dragInfo)
        {
            string dataFormat = MultitrackPlayer.Utils.DragDrop.DragDrop.DataFormat.Name;
            Data = (e.Data.GetDataPresent(dataFormat)) ? e.Data.GetData(dataFormat) : e.Data;
            DragInfo = dragInfo;

            VisualTarget = sender as UIElement;
            DropPosition = e.GetPosition(VisualTarget);

            if (sender is ItemsControl)
            {
                ItemsControl itemsControl = (ItemsControl)sender;
                UIElement item = itemsControl.GetItemContainerAt(DropPosition);
                bool directlyOverItem = item != null;

                TargetGroup = FindGroup(itemsControl, DropPosition);
                VisualTargetOrientation = itemsControl.GetItemsPanelOrientation();

                if (item == null)
                {
                    item = itemsControl.GetItemContainerAt(DropPosition, VisualTargetOrientation);
                    directlyOverItem = false;
                }

                if (item != null)
                {
                    ItemsControl itemParent = ItemsControl.ItemsControlFromItemContainer(item);

                    InsertIndex = itemParent.ItemContainerGenerator.IndexFromContainer(item);
                    TargetCollection = itemParent.ItemsSource ?? itemParent.Items;

                    if (directlyOverItem)
                    {
                        TargetItem = itemParent.ItemContainerGenerator.ItemFromContainer(item);
                        VisualTargetItem = item;
                    }

                    if (VisualTargetOrientation == Orientation.Vertical)
                    {
                        if (e.GetPosition(item).Y > item.RenderSize.Height / 2) InsertIndex++;
                    }
                    else
                    {
                        if (e.GetPosition(item).X > item.RenderSize.Width / 2) InsertIndex++;
                    }
                }
                else
                {
                    TargetCollection = itemsControl.ItemsSource ?? itemsControl.Items;
                    InsertIndex = itemsControl.Items.Count;
                }
            }
        }