[banshee] GStreamerSharp: Only iterate while playing



commit 5691fef66de3953a08a641155cd0c66b8c490575
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Sat Feb 19 17:51:48 2011 -0600

    GStreamerSharp: Only iterate while playing

 .../Banshee.GStreamerSharp.csproj                  |    8 +++--
 .../Banshee.GStreamerSharp/PlayerEngine.cs         |   36 ++++++++++++++++---
 2 files changed, 35 insertions(+), 9 deletions(-)
---
diff --git a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp.csproj b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp.csproj
index 2c705d9..7464ed5 100644
--- a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp.csproj
+++ b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp.csproj
@@ -32,15 +32,17 @@
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="gstreamer-sharp">
+    <Reference Include="System.Core">
+    </Reference>
+    <Reference Include="gstreamer-sharp, Version=0.9.2.0, Culture=neutral, PublicKeyToken=4956b48baf980190">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\bin\bin\gstreamer-sharp.dll</HintPath>
     </Reference>
-    <Reference Include="Mono.Posix">
+    <Reference Include="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\bin\bin\Mono.Posix.dll</HintPath>
     </Reference>
+    <Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\Core\Banshee.Services\Banshee.Services.csproj">
diff --git a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
index 7fcda9b..dd05eb1 100644
--- a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
@@ -53,6 +53,7 @@ namespace Banshee.GStreamerSharp
     {
         Pipeline pipeline;
         PlayBin2 playbin;
+        uint iterate_timeout_id = 0;
 
         public PlayerEngine ()
         {
@@ -88,12 +89,6 @@ namespace Banshee.GStreamerSharp
             playbin.AddNotification ("volume", OnVolumeChanged);
             pipeline.Bus.AddWatch (OnBusMessage);
 
-            // TODO pretty sure we should only iterate when playing
-            Banshee.ServiceStack.Application.RunTimeout (200, delegate {
-                OnEventChanged (PlayerEvent.Iterate);
-                return true;
-            });
-
             OnStateChanged (PlayerState.Ready);
         }
 
@@ -101,6 +96,7 @@ namespace Banshee.GStreamerSharp
         {
             switch (msg.Type) {
                 case MessageType.Eos:
+                    StopIterating ();
                     Close (false);
                     OnEventChanged (PlayerEvent.EndOfStream);
                     OnEventChanged (PlayerEvent.RequestNextTrack);
@@ -149,6 +145,7 @@ namespace Banshee.GStreamerSharp
 
         private void HandleStateChange (State old_state, State new_state, State pending_state)
         {
+            StopIterating ();
             if (CurrentState != PlayerState.Loaded && old_state == State.Ready && new_state == State.Paused && pending_state == State.Playing) {
                 OnStateChanged (PlayerState.Loaded);
             } else if (old_state == State.Paused && new_state == State.Playing && pending_state == State.VoidPending) {
@@ -156,6 +153,7 @@ namespace Banshee.GStreamerSharp
                     OnEventChanged (PlayerEvent.StartOfStream);
                 }
                 OnStateChanged (PlayerState.Playing);
+                StartIterating ();
             } else if (CurrentState == PlayerState.Playing && old_state == State.Playing && new_state == State.Paused) {
                 OnStateChanged (PlayerState.Paused);
             }
@@ -180,6 +178,32 @@ namespace Banshee.GStreamerSharp
             }
         }
 
+        private bool OnIterate ()
+        {
+            // Actual iteration.
+            OnEventChanged (PlayerEvent.Iterate);
+            // Run forever until we are stopped
+            return true;
+        }
+
+        private void StartIterating ()
+        {
+            if (iterate_timeout_id > 0) {
+                GLib.Source.Remove (iterate_timeout_id);
+                iterate_timeout_id = 0;
+            }
+
+            iterate_timeout_id = GLib.Timeout.Add (200, OnIterate);
+        }
+
+        private void StopIterating ()
+        {
+            if (iterate_timeout_id > 0) {
+                GLib.Source.Remove (iterate_timeout_id);
+                iterate_timeout_id = 0;
+            }
+        }
+
         protected override void OpenUri (SafeUri uri, bool maybeVideo)
         {
             if (pipeline.CurrentState == State.Playing || pipeline.CurrentState == State.Paused) {



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