banshee r3649 - in trunk/banshee: . libbanshee src/Backends/Banshee.GStreamer/Banshee.GStreamer src/Core/Banshee.Services/Banshee.MediaEngine src/Extensions/Banshee.AudioCd/Banshee.AudioCd



Author: abock
Date: Thu Apr  3 01:36:58 2008
New Revision: 3649
URL: http://svn.gnome.org/viewvc/banshee?rev=3649&view=rev

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

    * libbanshee/banshee-player.c: Implement better null/pause state selection
    when handling a playback stop request; always go to NULL if the caller
    requests it, but override PAUSED requests with NULL if the playing 
    resource is not CDDA

    * src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:
    * src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs:
    * src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:
    Allow Close callers to force the NULL state (e.g. release all resources
    forcefully so ejecting media can happen cleanly, for instance)

    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs:
    * src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs:
    Stubbed some more stuff out, still not working (ripping); ejecting while
    playing works again



Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/libbanshee/banshee-player.c
   trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdRipper.cs
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd/AudioCdSource.cs

Modified: trunk/banshee/libbanshee/banshee-player.c
==============================================================================
--- trunk/banshee/libbanshee/banshee-player.c	(original)
+++ trunk/banshee/libbanshee/banshee-player.c	Thu Apr  3 01:36:58 2008
@@ -113,7 +113,7 @@
     g_free (player);
     player = NULL;
     
-    bp_debug ("bp: disposed player");
+    bp_debug ("bp_destroy: disposed player");
 }
 
 P_INVOKE BansheePlayer *
@@ -167,7 +167,17 @@
 {
     // Some times "stop" really means "pause", particularly with
     // CDDA track transitioning; a NULL state will release resources
-    bp_pipeline_set_state (player, nullstate ? GST_STATE_NULL : GST_STATE_PAUSED);
+    GstState state = nullstate ? GST_STATE_NULL : GST_STATE_PAUSED;
+    
+    if (!nullstate && player->cdda_device == NULL) {
+        // only allow going to PAUSED if we're playing CDDA
+        state = GST_STATE_NULL;
+    }
+    
+    bp_debug ("bp_stop: setting state to %s", 
+        state == GST_STATE_NULL ? "GST_STATE_NULL" : "GST_STATE_PAUSED");
+    
+    bp_pipeline_set_state (player, state);
 }
 
 P_INVOKE void
@@ -182,7 +192,6 @@
     bp_pipeline_set_state (player, GST_STATE_PLAYING);
 }
 
-
 P_INVOKE gboolean
 bp_set_position (BansheePlayer *player, guint64 time_ms)
 {

Modified: trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	Thu Apr  3 01:36:58 2008
@@ -123,10 +123,10 @@
             bp_destroy (handle);
         }
         
-        public override void Close ()
+        public override void Close (bool fullShutdown)
         {
-            bp_stop (handle, false);
-            base.Close ();
+            bp_stop (handle, fullShutdown);
+            base.Close (fullShutdown);
         }
         
         protected override void OpenUri (SafeUri uri)
@@ -175,7 +175,7 @@
 
         private void OnEos (IntPtr player)
         {
-            Close ();
+            Close (false);
             OnEventChanged (PlayerEngineEvent.EndOfStream);
         }
         
@@ -186,7 +186,7 @@
         
         private void OnError (IntPtr player, uint domain, int code, IntPtr error, IntPtr debug)
         {
-            Close ();
+            Close (true);
             
             string error_message = error == IntPtr.Zero
                 ? Catalog.GetString ("Unknown Error")

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs	Thu Apr  3 01:36:58 2008
@@ -59,14 +59,14 @@
             OnStateChanged (idle_state);
         }
         
-        public virtual void Close ()
+        public virtual void Close (bool fullShutdown)
         {
             OnStateChanged (idle_state);
         }
         
         public virtual void Dispose ()
         {
-            Close ();
+            Close (true);
         }
         
         public void Open (TrackInfo track)
@@ -88,7 +88,7 @@
         private void HandleOpen (SafeUri uri)
         {
             if (current_state != PlayerEngineState.Idle && current_state != PlayerEngineState.NotReady) {
-                Close ();
+                Close (false);
             }
         
             try {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs	Thu Apr  3 01:36:58 2008
@@ -347,8 +347,13 @@
         
         public void Close ()
         {
+            Close (false);
+        }
+        
+        public void Close (bool fullShutdown)
+        {
             active_engine.Reset ();
-            active_engine.Close ();
+            active_engine.Close (fullShutdown);
         }
         
         public void Play ()

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	Thu Apr  3 01:36:58 2008
@@ -58,8 +58,24 @@
             }
         }
         
+        private IAudioCdRipper ripper;
+        private AudioCdSource source;
+        
         public AudioCdRipper (AudioCdSource source)
         {
+            if (ripper_extension_node != null) {
+                ripper = (IAudioCdRipper)ripper_extension_node.CreateInstance ();
+            } else {
+                throw new ApplicationException ("No AudioCdRipper extension is installed");
+            }
+            
+            this.source = source;
+        }
+        
+        public void Start ()
+        {
+            source.LockAllTracks ();
+            ripper.Begin ();
         }
     }
 }

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	Thu Apr  3 01:36:58 2008
@@ -71,6 +71,13 @@
             }
         }            
         
+        public void StopPlayingDisc ()
+        {
+            if (DiscIsPlaying) {
+                ServiceManager.PlayerEngine.Close (true);
+            }
+        }
+        
         public void Dispose ()
         {
             ClearMessages ();
@@ -137,13 +144,33 @@
 
         private void OnImportDisc (object o, EventArgs args)
         {
-            Hyena.Log.Information ("This feature is not implemented yet.", true);
+            if (AudioCdRipper.Supported) {
+                AudioCdRipper ripper = new AudioCdRipper (this);
+                ripper.Start ();
+            }
         }
 
         private void OnDuplicateDisc (object o, EventArgs args)
         {
             Hyena.Log.Information ("This feature is not implemented yet.", true);
         }
+        
+        internal void LockAllTracks ()
+        {
+            StopPlayingDisc ();
+        
+            foreach (AudioCdTrackInfo track in disc_model) {
+                track.CanPlay = false;
+            }
+            
+            OnUpdated ();
+        }
+        
+        internal void UnlockTrack (AudioCdTrackInfo track)
+        {
+            track.CanPlay = true;
+            OnUpdated ();
+        }
 
 #region Source Overrides
 
@@ -210,9 +237,7 @@
 
         public bool Unmap ()
         {
-            if (DiscIsPlaying) {
-                ServiceManager.PlayerEngine.Close ();
-            }
+            StopPlayingDisc ();
             
             foreach (TrackInfo track in disc_model) {
                 track.CanPlay = false;



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