banshee r3662 - in trunk/banshee: . src/Backends/Banshee.GStreamer/Banshee.GStreamer src/Extensions/Banshee.AudioCd/Banshee.AudioCd src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea



Author: abock
Date: Fri Apr  4 00:03:32 2008
New Revision: 3662
URL: http://svn.gnome.org/viewvc/banshee?rev=3662&view=rev

Log:
2008-04-03  Aaron Bockover  <abock gnome org>

    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:
    Implemented all of the rip queue/interaction logic and user job stuff;
    very nice and pretty status reporting including speed calculations; this
    part of the ripper is mostly done, only need to do the GStreamer work now

    * src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs:
    Implemented a dummy ripper that pretends to be ripping but is really
    just some fancy clock work so I could have something to test the
    extension ripper code as I went without destroying my drive

    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:
    Added UnlockAllTracks

    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs:
    Added RipEnabled property that we'll connect to check boxes at some point

    * src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs:
    Force the icon size to 22px so it doesn't look funny - the image was
    choosing a 16px icon which looked like ass and didn't fit in



Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
   trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs

Modified: trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/AudioCdRipper.cs	Fri Apr  4 00:03:32 2008
@@ -27,6 +27,7 @@
 //
 
 using System;
+using System.Threading;
 
 using Banshee.Base;
 using Banshee.Collection;
@@ -49,26 +50,48 @@
         
         public void Cancel ()
         {
+            Finish ();
         }
         
         public void RipTrack (TrackInfo track, SafeUri outputUri)
         {
+            ThreadPool.QueueUserWorkItem (delegate {
+                DateTime start_time = DateTime.Now;    
+                TimeSpan duration = TimeSpan.FromSeconds (5);
+                
+                while (true) {
+                    TimeSpan ellapsed = DateTime.Now - start_time;
+                    if (ellapsed >= duration) {
+                        break;
+                    }
+                    
+                    TimeSpan progress = TimeSpan.FromMilliseconds ((ellapsed.TotalMilliseconds 
+                        / duration.TotalMilliseconds) * track.Duration.TotalMilliseconds);
+                    
+                    ThreadAssist.ProxyToMain (delegate { OnProgress (track, progress); });
+                    
+                    Thread.Sleep (50);
+                }
+                
+                ThreadAssist.ProxyToMain (delegate { OnTrackFinished (track, outputUri); });
+            });
+            
             return;
         }
         
-        protected virtual void OnProgress ()
+        protected virtual void OnProgress (TrackInfo track, TimeSpan ellapsedTime)
         {
             AudioCdRipperProgressHandler handler = Progress;
             if (handler != null) {
-                handler (this, new AudioCdRipperProgressArgs (null, TimeSpan.Zero, TimeSpan.Zero));
+                handler (this, new AudioCdRipperProgressArgs (track, ellapsedTime, track.Duration));
             }
         }
         
-        protected virtual void OnTrackFinished ()
+        protected virtual void OnTrackFinished (TrackInfo track, SafeUri outputUri)
         {
             AudioCdRipperTrackFinishedHandler handler = TrackFinished;
             if (handler != null) {
-                handler (this, new AudioCdRipperTrackFinishedArgs (null, null));
+                handler (this, new AudioCdRipperTrackFinishedArgs (track, outputUri));
             }
         }
     }

Modified: trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs	Fri Apr  4 00:03:32 2008
@@ -27,6 +27,8 @@
 //
 
 using System;
+using System.Collections.Generic;
+
 using Mono.Unix;
 using Mono.Addins;
 
@@ -60,14 +62,29 @@
             }
         }
         
+        // State that does real work
         private IAudioCdRipper ripper;
         private AudioCdSource source;
         private UserJob user_job;
-         
+        
+        // State to process the rip operation
+        private Queue<AudioCdTrackInfo> queue = new Queue<AudioCdTrackInfo> ();
+        private TimeSpan ripped_duration;
+        private TimeSpan total_duration;
+        private int track_index;
+        
+        // State to compute/display the rip speed (i.e. 24x)
+        private TimeSpan last_speed_poll_duration;
+        private DateTime last_speed_poll_time;
+        private double last_speed_poll_factor;
+        private string status;
+        
         public AudioCdRipper (AudioCdSource source)
         {
             if (ripper_extension_node != null) {
                 ripper = (IAudioCdRipper)ripper_extension_node.CreateInstance ();
+                ripper.TrackFinished += OnTrackFinished;
+                ripper.Progress += OnProgress;
             } else {
                 throw new ApplicationException ("No AudioCdRipper extension is installed");
             }
@@ -76,14 +93,139 @@
         }
         
         public void Start ()
-        {
-            source.LockAllTracks ();
-            ripper.Begin ();
+        {   
+            ResetState ();
+
+            foreach (AudioCdTrackInfo track in (AudioCdDiscModel)source.TrackModel) {
+                if (track.RipEnabled) {
+                    total_duration += track.Duration;
+                    queue.Enqueue (track);
+                }
+            }
+            
+            if (queue.Count == 0) {
+                return;
+            }
             
-            user_job = new UserJob (Catalog.GetString ("Importing Audio CD"), Catalog.GetString ("Initializing Drive"));
-            user_job.IconNames = new string [] { "cd-action-rip" };
+            source.LockAllTracks ();
+                                                
+            user_job = new UserJob (Catalog.GetString ("Importing Audio CD"), 
+                Catalog.GetString ("Initializing Drive"), "media-import-audio-cd");
             user_job.CanCancel = true;
+            user_job.CancelRequested += OnCancelRequested;
+            user_job.Finished += OnFinished;
             user_job.Register ();
+            
+            ripper.Begin ();
+            RipNextTrack ();
+        }
+        
+        private void ResetState ()
+        {
+            track_index = 0;
+            ripped_duration = TimeSpan.Zero;
+            total_duration = TimeSpan.Zero;
+            last_speed_poll_duration = TimeSpan.Zero;
+            last_speed_poll_time = DateTime.MinValue;
+            last_speed_poll_factor = 0;
+            status = null;
+            queue.Clear ();
+        }
+        
+        private void RipNextTrack ()
+        {
+            if (queue.Count == 0) {
+                ResetState ();
+                
+                if (ripper != null) {
+                    ripper.Finish ();
+                }
+                
+                if (user_job != null) {
+                    user_job.Finish ();
+                }
+                return;
+            }
+            
+            AudioCdTrackInfo track = queue.Dequeue ();
+
+            user_job.Title = String.Format (Catalog.GetString ("Importing {0} of {1}"), 
+                ++track_index, source.TrackModel.Count);
+            status = String.Format("{0} - {1}", track.ArtistName, track.TrackTitle);
+            user_job.Status = status;
+
+            SafeUri uri = new SafeUri (FileNamePattern.BuildFull (track, "mp3"));
+            ripper.RipTrack (track, uri);
+        }
+
+#region Ripper Event Handlers
+
+        private void OnTrackFinished (object o, AudioCdRipperTrackFinishedArgs args)
+        {
+            if (user_job == null || ripper == null) {
+                return;
+            }
+        
+            ripped_duration += args.Track.Duration;
+            args.Track.Uri = args.Uri;
+            source.UnlockTrack ((AudioCdTrackInfo)args.Track);
+            RipNextTrack ();
+        }
+        
+        private void OnProgress (object o, AudioCdRipperProgressArgs args)
+        {
+            if (user_job == null) {
+                return;
+            }
+        
+            TimeSpan total_ripped_duration = ripped_duration + args.EncodedTime;
+            user_job.Progress = total_ripped_duration.TotalMilliseconds / total_duration.TotalMilliseconds;
+            
+            TimeSpan poll_diff = DateTime.Now - last_speed_poll_time;
+            double factor = 0;
+            
+            if (poll_diff.TotalMilliseconds >= 1000) {
+                factor = ((total_ripped_duration - last_speed_poll_duration).TotalMilliseconds 
+                    * (poll_diff.TotalMilliseconds / 1000.0)) / 1000.0;
+                
+                last_speed_poll_duration = total_ripped_duration;
+                last_speed_poll_time = DateTime.Now;
+                last_speed_poll_factor = factor > 1 ? factor : 0;
+            }
+            
+            user_job.Status = last_speed_poll_factor > 1 ? String.Format ("{0} ({1:0.0}x)", 
+                status, last_speed_poll_factor) : status;
         }
+
+#endregion
+                                
+#region User Job Event Handlers        
+        
+        private void OnCancelRequested (object o, EventArgs args)
+        {
+            ResetState ();
+            
+            if (ripper != null) {
+                ripper.Cancel ();
+            }
+        
+            if (user_job != null) {
+                user_job.Finish ();
+            }
+        }
+        
+        private void OnFinished (object o, EventArgs args)
+        {
+            if (user_job != null) {
+                user_job.CancelRequested -= OnCancelRequested;
+                user_job.Finished -= OnFinished;
+                user_job = null;
+            }
+            
+            source.UnlockAllTracks ();
+        }
+        
+#endregion
+
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs	Fri Apr  4 00:03:32 2008
@@ -166,6 +166,15 @@
             OnUpdated ();
         }
         
+        internal void UnlockAllTracks ()
+        {
+            foreach (AudioCdTrackInfo track in disc_model) {
+                track.CanPlay = true;
+            }
+            
+            OnUpdated ();
+        }
+        
         internal void UnlockTrack (AudioCdTrackInfo track)
         {
             track.CanPlay = true;

Modified: trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdTrackInfo.cs	Fri Apr  4 00:03:32 2008
@@ -52,5 +52,11 @@
         public int IndexOnDisc {
             get { return index_on_disc; }
         }
+        
+        private bool rip_enabled = true;
+        public bool RipEnabled {
+            get { return rip_enabled; }
+            set { rip_enabled = value; }
+        }
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs	Fri Apr  4 00:03:32 2008
@@ -59,6 +59,7 @@
         {
             event_box = new EventBox ();
             image = new Image ();
+            image.IconSize = 22;
             image.IconName = Banshee.ServiceStack.Application.IconName;
             event_box.Add (image);
             Add (event_box);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]