[banshee] GStreamerSharp: Properly handle GStreamer errors (bgo#643407)



commit be43b91996c7f5c8f5c265e7016b15d9dcf33f3e
Author: Pete Johanson <peter peterjohanson com>
Date:   Sun Feb 27 06:50:35 2011 -0500

    GStreamerSharp: Properly handle GStreamer errors (bgo#643407)
    
    Signed-off-by: Gabriel Burt <gabriel burt gmail com>

 .../Banshee.GStreamerSharp/PlayerEngine.cs         |   63 +++++++++++++++++++-
 1 files changed, 62 insertions(+), 1 deletions(-)
---
diff --git a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
index dd05eb1..f9d3574 100644
--- a/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamerSharp/Banshee.GStreamerSharp/PlayerEngine.cs
@@ -126,7 +126,9 @@ namespace Banshee.GStreamerSharp
                     Enum error_type;
                     string err_msg, debug;
                     msg.ParseError (out error_type, out err_msg, out debug);
-                    Log.Error (err_msg, debug);
+
+                    HandleError (error_type, err_msg, debug);
+
                     break;
             }
 
@@ -138,6 +140,59 @@ namespace Banshee.GStreamerSharp
             OnEventChanged (PlayerEvent.Volume);
         }
 
+        private void HandleError (Enum domain, string error_message, string debug)
+        {
+            Close (true);
+
+            error_message = error_message ?? Catalog.GetString ("Unknown Error");
+
+            if (domain is ResourceError) {
+                ResourceError domain_code = (ResourceError)domain;
+                if (CurrentTrack != null) {
+                    switch (domain_code) {
+                    case ResourceError.NotFound:
+                        CurrentTrack.SavePlaybackError (StreamPlaybackError.ResourceNotFound);
+                        break;
+                    default:
+                        break;
+                    }
+                }
+                Log.Error (String.Format ("GStreamer resource error: {0}", domain_code), false);
+            } else if (domain is StreamError) {
+                StreamError domain_code = (StreamError)domain;
+                if (CurrentTrack != null) {
+                    switch (domain_code) {
+                    case StreamError.CodecNotFound:
+                        CurrentTrack.SavePlaybackError (StreamPlaybackError.CodecNotFound);
+                        break;
+                    default:
+                        break;
+                    }
+                }
+
+                Log.Error (String.Format ("GStreamer stream error: {0}", domain_code), false);
+            } else if (domain is CoreError) {
+                CoreError domain_code = (CoreError)domain;
+                if (CurrentTrack != null) {
+                    switch (domain_code) {
+                    case CoreError.MissingPlugin:
+                        CurrentTrack.SavePlaybackError (StreamPlaybackError.CodecNotFound);
+                        break;
+                    default:
+                        break;
+                    }
+                }
+
+                if (domain_code != CoreError.MissingPlugin) {
+                    Log.Error (String.Format ("GStreamer core error: {0}", (CoreError)domain), false);
+                }
+            } else if (domain is LibraryError) {
+                Log.Error (String.Format ("GStreamer library error: {0}", (LibraryError)domain), false);
+            }
+
+            OnEventChanged (new PlayerEventErrorArgs (error_message));
+        }
+
         private void HandleBuffering (int buffer_percent)
         {
             OnEventChanged (new PlayerEventBufferingArgs (buffer_percent / 100.0));
@@ -228,6 +283,12 @@ namespace Banshee.GStreamerSharp
             OnStateChanged (PlayerState.Paused);
         }
 
+        public override void Close (bool fullShutdown)
+        {
+            pipeline.SetState (State.Null);
+            base.Close (fullShutdown);
+        }
+
         public override string GetSubtitleDescription (int index)
         {
             return playbin.GetTextTags (index)



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