Преглед на файлове

Added more audio handling

Kenneth van Ewijk преди 10 години
родител
ревизия
615934557c
променени са 4 файла, в които са добавени 128 реда и са изтрити 30 реда
  1. 90 28
      MusicPlayer/MusicPlayer/AudioHandler.cs
  2. 26 0
      MusicPlayer/MusicPlayer/MainForm.Designer.cs
  3. 11 1
      MusicPlayer/MusicPlayer/MainForm.cs
  4. 1 1
      MusicPlayer/MusicPlayer/Song.cs

+ 90 - 28
MusicPlayer/MusicPlayer/AudioHandler.cs

@@ -12,47 +12,109 @@ namespace MusicPlayer
 {
     public class AudioHandler
     {
-        public static Stream ms = new MemoryStream();
+        public enum AudioState { PLAYING, STOPPED, PAUSED }
+        public AudioState State { get; set; }
 
-        public static void PlayMp3FromUrl(string url)
+        private Stream ms;
+
+        private Thread network;
+        private Thread audio;
+
+        private Song CurrentSong;
+
+        public AudioHandler()
+        {
+            ms = new MemoryStream();
+            network = new Thread(LoadAudio);
+            audio = new Thread(PlayAudio);
+            network.IsBackground = true;
+            audio.IsBackground = true;
+            State = AudioState.STOPPED;
+        }
+
+        public void Play(Song s)
         {
-            new Thread(delegate (object o)
+            if (CurrentSong == s)
+                State = AudioState.PLAYING;
+            else
             {
-                var response = WebRequest.Create(url).GetResponse();
-                using (var stream = response.GetResponseStream())
+                State = AudioState.STOPPED;
+
+                network = new Thread(LoadAudio);
+                audio = new Thread(PlayAudio);
+
+                CurrentSong = s;
+                network.Start(s);
+                audio.Start();
+            }
+        }
+
+        public void Stop()
+        {
+            State = AudioState.STOPPED;
+        }
+
+        public void Pause()
+        {
+            State = AudioState.PAUSED;
+        }
+
+        private void PlayAudio()
+        {
+            while (ms.Length < 65536 * 10)
+                Thread.Sleep(1000);
+
+            ms.Position = 0;
+            using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms))))
+            {
+                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                 {
-                    byte[] buffer = new byte[65536]; // 64KB chunks
-                    int read;
-                    while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
+                    waveOut.Init(blockAlignedStream);
+                    waveOut.Play();
+                    while (waveOut.PlaybackState != PlaybackState.Stopped)
                     {
-                        var pos = ms.Position;
-                        ms.Position = ms.Length;
-                        ms.Write(buffer, 0, read);
-                        ms.Position = pos;
+                        System.Threading.Thread.Sleep(100);
+                        if(State == AudioState.PAUSED && waveOut.PlaybackState == PlaybackState.Playing)
+                        {
+                            waveOut.Pause();
+                        }
+                        if (State == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused)
+                        {
+                            waveOut.Play();
+                        }
+                        if (State == AudioState.STOPPED)
+                        {
+                            waveOut.Stop();
+                        }
                     }
+                    State = AudioState.STOPPED;
                 }
-            }).Start();
+            }
+        }
 
-            new Thread(delegate (object o)
+        private void LoadAudio(object o)
+        {
+            Song s = (Song) o;
+            var response = WebRequest.Create(s.Url).GetResponse();
+            State = AudioState.PLAYING;
+            using (var stream = response.GetResponseStream())
             {
-                // Pre-buffering some data to allow NAudio to start playing
-                while (ms.Length < 65536 * 10)
-                    Thread.Sleep(1000);
-
-                ms.Position = 0;
-                using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms))))
+                byte[] buffer = new byte[65536]; // 64KB chunks
+                int read;
+                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                 {
-                    using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
+                    var pos = ms.Position;
+                    ms.Position = ms.Length;
+                    ms.Write(buffer, 0, read);
+                    ms.Position = pos;
+                    if(State == AudioState.STOPPED)
                     {
-                        waveOut.Init(blockAlignedStream);
-                        waveOut.Play();
-                        while (waveOut.PlaybackState == PlaybackState.Playing)
-                        {
-                            System.Threading.Thread.Sleep(100);
-                        }
+                        stream.Close();
+                        return;
                     }
                 }
-            }).Start();
+            }
         }
+
     }
 }

+ 26 - 0
MusicPlayer/MusicPlayer/MainForm.Designer.cs

@@ -41,6 +41,8 @@
             this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.ControlsPanel = new System.Windows.Forms.Panel();
             this.PlayButton = new System.Windows.Forms.Button();
+            this.PauseButton = new System.Windows.Forms.Button();
+            this.StopButton = new System.Windows.Forms.Button();
             ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit();
             this.MainPanel.SuspendLayout();
             this.MenuStrip.SuspendLayout();
@@ -158,6 +160,8 @@
             // ControlsPanel
             // 
             this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame;
+            this.ControlsPanel.Controls.Add(this.StopButton);
+            this.ControlsPanel.Controls.Add(this.PauseButton);
             this.ControlsPanel.Controls.Add(this.PlayButton);
             this.ControlsPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
             this.ControlsPanel.Location = new System.Drawing.Point(0, 343);
@@ -175,6 +179,26 @@
             this.PlayButton.UseVisualStyleBackColor = true;
             this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click);
             // 
+            // PauseButton
+            // 
+            this.PauseButton.Location = new System.Drawing.Point(108, 13);
+            this.PauseButton.Name = "PauseButton";
+            this.PauseButton.Size = new System.Drawing.Size(75, 23);
+            this.PauseButton.TabIndex = 1;
+            this.PauseButton.Text = "Pause";
+            this.PauseButton.UseVisualStyleBackColor = true;
+            this.PauseButton.Click += new System.EventHandler(this.PauseButton_Click);
+            // 
+            // StopButton
+            // 
+            this.StopButton.Location = new System.Drawing.Point(203, 13);
+            this.StopButton.Name = "StopButton";
+            this.StopButton.Size = new System.Drawing.Size(75, 23);
+            this.StopButton.TabIndex = 2;
+            this.StopButton.Text = "Stop";
+            this.StopButton.UseVisualStyleBackColor = true;
+            this.StopButton.Click += new System.EventHandler(this.StopButton_Click);
+            // 
             // MainForm
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -213,6 +237,8 @@
         private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
         private System.Windows.Forms.Panel ControlsPanel;
         private System.Windows.Forms.Button PlayButton;
+        private System.Windows.Forms.Button StopButton;
+        private System.Windows.Forms.Button PauseButton;
     }
 }
 

+ 11 - 1
MusicPlayer/MusicPlayer/MainForm.cs

@@ -34,12 +34,22 @@ namespace MusicPlayer
 
         private void PlayButton_Click(object sender, EventArgs e)
         {
-            AudioHandler.PlayMp3FromUrl("http://imegumii.nl/music/English/Monstercat/Direct%20-%20Eternity.mp3");
+            main.audio.Play(new Song("102", "Test", "Test", "Test", main.api));
         }
 
         private void SongsTableView_SelectionChanged(object sender, EventArgs e)
         {
             DataGridViewSelectedRowCollection col = SongsTableView.SelectedRows;
         }
+
+        private void PauseButton_Click(object sender, EventArgs e)
+        {
+            main.audio.Pause();
+        }
+
+        private void StopButton_Click(object sender, EventArgs e)
+        {
+            main.audio.Stop();
+        }
     }
 }

+ 1 - 1
MusicPlayer/MusicPlayer/Song.cs

@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 
 namespace MusicPlayer
 {
-    class Song
+    public class Song
     {
         public string SongID { get; set; }
         public string Name { get; set; }