[banshee] GStreamerSharp: Only iterate while playing
- From: Gabriel Burt <gburt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [banshee] GStreamerSharp: Only iterate while playing
- Date: Sat, 19 Feb 2011 23:53:27 +0000 (UTC)
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]