banshee r3662 - in trunk/banshee: . src/Backends/Banshee.GStreamer/Banshee.GStreamer src/Extensions/Banshee.AudioCd/Banshee.AudioCd src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea
- From: abock svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r3662 - in trunk/banshee: . src/Backends/Banshee.GStreamer/Banshee.GStreamer src/Extensions/Banshee.AudioCd/Banshee.AudioCd src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea
- Date: Fri, 4 Apr 2008 00:03:33 +0100 (BST)
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]