Как я могу остановить воспроизведение звука с помощью кнопки другой модели ViewModel? - PullRequest
0 голосов
/ 01 июля 2019

Используя MVVM, у меня есть окно с 3-мя моделями представлений.2, представляющими данные, и один аудиоплеер ViewModel.Взаимодействие пользовательского интерфейса с двумя из них должно вызвать команду «Стоп» аудиоустройства, т. Е.

PlaybackDevice.Stop();

Поскольку у меня есть одна и та же кнопка для «воспроизведения» и «остановки», событиями воспроизведения / остановки можно управлять с помощью одного и того жеКоманда с этой же кнопки.Но не с любой другой кнопки.Я попытался создать экземпляр класса Player и вызвать метод Stop, содержащий PlaybackDevice.Stop ();Не сработало, поэтому я создал статическое устройство PlaybackDevice и вызвал его напрямую из ViewModels - все еще не работает.Как я должен этого достичь?

Player ViewModel:

  #region Commands
        public ICommand PlayStopTrack { get; set; }
       // public ICommand 
        #endregion

        #region Classes

        HardwareManager hm = new HardwareManager();
        public Mp3FileReader TrackMp3 { get; set; }
        public WaveFileReader TrackWav { get; set; }
        #endregion
        #region Properties

        private static string trackToPlay;

        public static string TrackToPlay
        {
            get { return trackToPlay; }
            set
            {
                trackToPlay = value;
            }
        }

        //public string TrackToPLay { get; set; }

        public string DidTrackStop{get;set;}

        public static WasapiOut PlaybackDevice { get; set; }
 public PlayerVM()
        { 
PlayStopTrack = new RelayCommand(PlayPressed, CanExecute);
}

 private bool CanExecute(object obj)
        {
            return true;
        }

//take the default audio device
 void GetDevice()
        {
            Console.WriteLine("Prepare Device");
            if (PlaybackDevice == null)
            {
                PlaybackDevice = hm.InitialiseAudioPlaybackDevice();
            }
        }


 public void PlayTrackFromBeginning(string trackFullPath)
        {

            if (trackFullPath != null )
            {
                string fileExtension = Path.GetExtension(trackFullPath);
                switch (fileExtension)
                {
                    case ".mp3":
                        try
                        {
                            Console.WriteLine("Init Playing");
                        TrackMp3 = new Mp3FileReader(trackFullPath);
                        if (PlaybackDevice == null)
                        {
                            GetDevice();
                            PlaybackDevice.PlaybackStopped += OnPlaybackStopped;



                        }
                        if (PlaybackDevice.PlaybackState == PlaybackState.Stopped)
                        {
                            PlaybackDevice.Init(TrackMp3);
                            PlaybackDevice.Play();
                            GetTrackLength();
                        }

                        //}
                        //catch (Exception e)
                        //{
                        //    MessageBox.Show(e.Message + " 1- " + e.InnerException);
                        //}
                        break;
                    case ".wav":
                        //try
                        //{
                        Console.WriteLine("Init Playing");
                        GetDevice();
                         PlaybackDevice.PlaybackStopped += OnPlaybackStopped;
                        //TODO implement wav reader.
                        TrackWav = new WaveFileReader(trackFullPath);
                        PlaybackDevice.Init(TrackWav);
                        PlaybackDevice.Play();
                        GetTrackLength();
                        //}
                        //catch (Exception e)
                        //{
                        //    MessageBox.Show(e.Message + " - " + e.InnerException);
                        //}
                        break;
                }
                ButtonLabel = "Stop";
            }

//the actual stop method

private void OnPlaybackStopped(object sender, StoppedEventArgs e)
        {
            if (TrackMp3 != null)
            {
                Console.WriteLine("Init StopEvent");
                TrackMp3.Dispose();
                PlaybackDevice.Dispose();
                TrackMp3 = null;
                Position = 0;
                CurrentTime = "00:00";
                isPlaying = false;
            }
            if (TrackWav != null)
            {
                TrackWav.Dispose();
                PlaybackDevice.Dispose();
                TrackWav = null;
                Position = 0;
                CurrentTime = "00:00";
                isPlaying = false;
            }
            ButtonLabel = "Play";
        }

  public void PlayPressed(object o)
        { 
            if (Path.GetExtension(TrackToPlay) == ".mp3")
            {
                if (isPlaying == false
                    && TrackMp3 == null
                    && TrackToPlay != null)
                {
                    PlayTrackFromBeginning(TrackToPlay);

                  //  IsTrackPlaying = true;
                    isPlaying = true;
                    Timer.Start();

                }

                else if (PlaybackDevice.PlaybackState==PlaybackState.Playing)
                {
                    MessageBox.Show("Stopping ama kur!");
                    PlaybackDevice.Stop();
                    isPlaying = false;
                    //Thread.Sleep(1000);
                    // PlayTrackFromBeginning(TrackToPLay);

                }
            }

            if (Path.GetExtension(TrackToPlay) == ".wav")
            {
                if (isPlaying == false
                    && TrackWav == null
                    && TrackToPlay != null)
                {
                    PlayTrackFromBeginning(TrackToPlay);
                   // IsTrackPlaying = true;
                    isPlaying = true;
                    Timer.Start();

                }

                else if (isPlaying == true)
                {
                    PlaybackDevice.Stop();
                    isPlaying = false;
                    //Thread.Sleep(1000);
                    // PlayTrackFromBeginning(TrackToPLay);

                }
            }
        }

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Я решил свою проблему с классом Singleton. Таким образом, я всегда использовал один и тот же объект, который изначально воспроизводил музыку, и останавливал музыку с помощью кнопки «Воспроизведение / Стоп» из другой модели представления.

0 голосов
/ 02 июля 2019

Я не уверен, что правильно понимаю, но я постараюсь вам помочь. Где ваш PlayPressed метод? Вы создаете RelayCommand в ctor с помощью PlayPressed и CanExecute, но я не вижу код для первого метода?

...