[banshee] [PlayerEngine] Added Initialize/DelayedInitialize



commit 978959dd1e0fece7d0247ebebf5ce4007a1f440a
Author: Aaron Bockover <abockover novell com>
Date:   Tue May 26 21:07:56 2009 -0400

    [PlayerEngine] Added Initialize/DelayedInitialize
    
    PlayerEngine now has an Initialize method which can be invoked
    delayed by PlayerEngineService.DelayedInitialize
    (ala IDelayedInitializeService). Just before a PlayerEngine is
    initialized, the EngineBeforeInitialize event is raised on the
    PlayerEngineService, and after it is initialized, the
    EngineAfterInitialize event is raised.
    
    This provides hooks for other services to configure the engine
    before it is constructed, and interact with it after it is
    safely constructed.
---
 .../Banshee.GStreamer/PlayerEngine.cs              |   23 +++----------
 .../Banshee.MediaEngine/PlayerEngine.cs            |   12 ++++++-
 .../Banshee.MediaEngine/PlayerEngineService.cs     |   36 ++++++++++++++++++-
 3 files changed, 50 insertions(+), 21 deletions(-)

diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
index 306b91c..ffb89be 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
@@ -108,25 +108,12 @@ namespace Banshee.GStreamer
                 }
             }
         }
-        
-        public PlayerEngine ()
-        {
-            if (ServiceManager.IsInitialized) {
-                Initialize ();
-            } else {
-                ServiceManager.ServiceStarted += OnServiceStarted;
-            }
-        }
-        
-        private void OnServiceStarted (ServiceStartedArgs args)
-        {
-            if (args.Service is Service) {
-                ServiceManager.ServiceStarted -= OnServiceStarted;
-                Initialize ();
-            }
+
+        protected override bool DelayedInitialize {
+            get { return true; }
         }
-        
-        private void Initialize ()
+
+        protected override void Initialize ()
         {
             IntPtr ptr = bp_new ();
             
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
index 9ae85f8..1f7a1ec 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
@@ -54,7 +54,17 @@ namespace Banshee.MediaEngine
         private PlayerState idle_state = PlayerState.NotReady; 
         
         protected abstract void OpenUri (SafeUri uri);
-        
+
+        internal protected virtual bool DelayedInitialize {
+            get { return false; }
+        }
+
+        public bool IsInitialized { get; internal set; }
+
+        internal protected virtual void Initialize ()
+        {
+        }
+
         public void Reset ()
         {
             current_track = null;
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index 6c40bc6..ebd455e 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -47,7 +47,8 @@ namespace Banshee.MediaEngine
 {
     public delegate bool TrackInterceptHandler (TrackInfo track);
 
-    public class PlayerEngineService : IInitializeService, IRequiredService, IPlayerEngineService, IDisposable
+    public class PlayerEngineService : IInitializeService, IDelayedInitializeService, 
+        IRequiredService, IPlayerEngineService, IDisposable
     {   
         private List<PlayerEngine> engines = new List<PlayerEngine> ();
         private PlayerEngine active_engine;
@@ -61,6 +62,8 @@ namespace Banshee.MediaEngine
 
         public event EventHandler PlayWhenIdleRequest;
         public event TrackInterceptHandler TrackIntercept;
+        public event Action<PlayerEngine> EngineBeforeInitialize;
+        public event Action<PlayerEngine> EngineAfterInitialize;
         
         private event DBusPlayerEventHandler dbus_event_changed;
         event DBusPlayerEventHandler IPlayerEngineService.EventChanged {
@@ -78,7 +81,7 @@ namespace Banshee.MediaEngine
         {
         }
         
-        public void Initialize ()
+        void IInitializeService.Initialize ()
         {
             preferred_engine_id = EngineSchema.Get();
             
@@ -112,6 +115,31 @@ namespace Banshee.MediaEngine
             TrackInfo.IsPlayingMethod = track => IsPlaying (track) &&
                 ServiceManager.PlaybackController.Source == ServiceManager.SourceManager.ActiveSource;
         }
+
+        private void InitializeEngine (PlayerEngine engine)
+        {
+            var handler = EngineBeforeInitialize;
+            if (handler != null) {
+                handler (engine);
+            }
+            
+            engine.Initialize ();
+            engine.IsInitialized = true;
+            
+            handler = EngineAfterInitialize;
+            if (handler != null) {
+                handler (engine);
+            }
+        }
+        
+        void IDelayedInitializeService.DelayedInitialize ()
+        {
+            foreach (var engine in Engines) {
+                if (engine.DelayedInitialize) {
+                    InitializeEngine (engine);
+                }
+            }
+        }
         
         private void LoadEngine (TypeExtensionNode node)
         {
@@ -120,6 +148,10 @@ namespace Banshee.MediaEngine
         
         private void LoadEngine (PlayerEngine engine)
         {
+            if (!engine.DelayedInitialize) {
+                InitializeEngine (engine);
+            }
+            
             engine.EventChanged += OnEngineEventChanged;
 
             if (engine.Id == preferred_engine_id) {



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