[banshee] [Equalizer] Big refactor of EQ preset management



commit 3f5deb903cdc00dd041a90be908e3052cf44487e
Author: Aaron Bockover <abockover novell com>
Date:   Wed Feb 10 17:18:57 2010 -0500

    [Equalizer] Big refactor of EQ preset management
    
    As I began to merge some predefined presets into the equalizer, I ran into
    quite a few confusing, inefficient, and redundant chunks of code, scattered
    across various places leading to lots of confusion.
    
    This refactor better defines the roles of EqualizerManager vs EqualizerSetting.
    
    In addition, I changed from an XML storage format to JSON. After moving from
    the slow XmlDocument (DOM-based) API to XmlTextReader (tokenizer API), which
    saved lots of time loading the presets, I then tried the Hyena JSON parser,
    which saved even more time. The progression went something like this:
    
      XML DOM (0.075s) => XML Tokenizer (0.012s) => Hyena JSON (0.007s)
    
    The old XML format will be loaded if the JSON format is not found, and in turn
    saved to the new JSON format, so no presets should be lost.
    
    Additionally, due to the clean up, equalizer band gain values should not be
    excessively flushed to the engine, which could solve some of the noise-related
    bugs that have been filed (not confirmed though, but things are much cleaner
    and make more sense, so it's plausible).
    
    Finally, the catalyst for this massive cleanup, I introduce some predefined
    presets based on the data from bgo#607495.
    
    I am not sure however how to introduce these presets. In this current
    implementation, the presets are only loaded if there were no existing presets
    defined by the user. Maybe it is useful to force these presets into the user's
    set if the user does not have a preset existing with the same name? I need
    some feedback about what a good behavior here is.

 .../Banshee.Equalizer/EqualizerManager.cs          |  305 +++++++++++++-------
 .../Banshee.Equalizer/EqualizerSetting.cs          |  156 ++++++-----
 .../Banshee.MediaEngine/PlayerEngineService.cs     |   21 +--
 .../EqualizerPresetComboBox.cs                     |   16 -
 .../Banshee.Equalizer.Gui/EqualizerView.cs         |   21 ++-
 .../Banshee.Equalizer.Gui/EqualizerWindow.cs       |   30 +--
 6 files changed, 317 insertions(+), 232 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
index d7fd5f7..bede9f7 100644
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
@@ -5,7 +5,7 @@
 //   Aaron Bockover <abockover novell com>
 //   Alexander Hixon <hixon alexander mediati org>
 //
-// Copyright (C) 2006-2007 Novell, Inc.
+// Copyright 2006-2010 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -33,46 +33,53 @@ using System.Xml;
 using System.Collections;
 using System.Collections.Generic;
 
+using Mono.Unix;
+
 using Hyena;
+using Hyena.Json;
+
 using Banshee.Base;
 using Banshee.MediaEngine;
 using Banshee.ServiceStack;
+using Banshee.Configuration;
 
 namespace Banshee.Equalizer
 {
     public class EqualizerManager : IEnumerable<EqualizerSetting>, IEnumerable
     {
-        private List<EqualizerSetting> equalizers = new List<EqualizerSetting> ();
-        private string path;
-
-        public delegate void EqualizerSettingEventHandler (object o, Hyena.EventArgs<EqualizerSetting> args);
-        public event EqualizerSettingEventHandler EqualizerAdded;
-        public event EqualizerSettingEventHandler EqualizerRemoved;
-        public event EqualizerSettingEventHandler EqualizerChanged;
+        private static string legacy_xml_path = System.IO.Path.Combine (
+            Paths.ApplicationData, "equalizers.xml");
 
         private static EqualizerManager instance;
         public static EqualizerManager Instance {
             get {
                 if (instance == null) {
                     instance = new EqualizerManager (System.IO.Path.Combine (
-                        Paths.ApplicationData, "equalizers.xml"));
+                        Paths.ApplicationData, "equalizers.json"));
                 }
 
                 return instance;
             }
         }
 
-        public EqualizerManager ()
-        {
-        }
+        private List<EqualizerSetting> equalizers = new List<EqualizerSetting> ();
+
+        public string Path { get; private set; }
+        public EqualizerSetting SelectedEqualizer { get; private set; }
+
+        public delegate void EqualizerSettingEventHandler (object o, Hyena.EventArgs<EqualizerSetting> args);
+        public event EqualizerSettingEventHandler EqualizerAdded;
+        public event EqualizerSettingEventHandler EqualizerRemoved;
+        public event EqualizerSettingEventHandler EqualizerChanged;
 
-        public EqualizerManager (string path)
+        private EqualizerManager (string path)
         {
-            this.path = path;
+            Path = path;
 
             try {
                 Load ();
-            } catch {
+            } catch (Exception e) {
+                Log.Exception ("Failed to load equalizer", e);
             }
         }
 
@@ -113,124 +120,216 @@ namespace Banshee.Equalizer
             QueueSave ();
         }
 
-        public void Enable (EqualizerSetting eq)
+        public EqualizerSetting Find (string name)
+        {
+            return String.IsNullOrEmpty (name) ? null : equalizers.Find (eq => eq.Name == name);
+        }
+
+        public void Select ()
+        {
+            Select (PresetSchema.Get ());
+        }
+
+        public void Select (string name)
         {
+            Select (Find (name));
+        }
+
+        public void Select (EqualizerSetting eq)
+        {
+            if (SelectedEqualizer == eq) {
+                return;
+            }
+
+            bool sync = SelectedEqualizer != eq;
+            SelectedEqualizer = eq;
+
             if (eq != null) {
-                eq.Enabled = true;
+                PresetSchema.Set (eq.Name);
+                Log.DebugFormat ("Selected equalizer: {0}", eq.Name);
+            }
 
-                // Make a copy of the Dictionary first, otherwise it'll become out of sync
-                // when we begin to change the gain on the bands.
-                Dictionary<uint, double> bands = new Dictionary<uint, double> (eq.Bands);
+            if (IsActive && sync) {
+                FlushToEngine (eq);
+            }
+        }
 
-                foreach(KeyValuePair<uint, double> band in bands)
-                {
-                    eq.SetGain (band.Key, band.Value);
+        private void FlushToEngine (EqualizerSetting eq)
+        {
+            if (eq == null) {
+                var engine_eq = (IEqualizer)ServiceManager.PlayerEngine.ActiveEngine;
+                engine_eq.AmplifierLevel = 0;
+                for (uint i = 0; i < engine_eq.EqualizerFrequencies.Length; i++) {
+                    engine_eq.SetEqualizerGain (i, 0);
                 }
 
-                // Reset preamp.
-                eq.AmplifierLevel = eq.AmplifierLevel;
+                Log.DebugFormat ("Disabled equalizer");
+            } else {
+                eq.FlushToEngine ();
+                Log.DebugFormat ("Syncing equalizer to engine: {0}", eq.Name);
             }
         }
 
-        public void Disable (EqualizerSetting eq)
-        {
-            if (eq != null) {
-                eq.Enabled = false;
+        public bool IsActive {
+            get { return EnabledSchema.Get (); }
+            set {
+                EnabledSchema.Set (value);
 
-                // Set the actual equalizer gain on all bands to 0 dB,
-                // but don't change the gain in the dictionary (we can use/change those values
-                // later, but not affect the actual audio stream until we're enabled again).
-                for (uint i = 0; i < eq.BandCount; i++) {
-                    ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).SetEqualizerGain (i, 0);
+                if (value) {
+                    if (SelectedEqualizer != null) {
+                        FlushToEngine (SelectedEqualizer);
+                    }
+                } else {
+                    FlushToEngine (null);
                 }
-
-                ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).AmplifierLevel = 0;
             }
         }
 
         public void Load ()
         {
-            Load (path);
+            Load (Path);
         }
 
         public void Load (string path)
         {
-            XmlDocument doc = new XmlDocument ();
-
-            try {
-                doc.Load (path);
-            } catch {
-            }
+            var timer = Log.DebugTimerStart ();
 
             Clear ();
 
-            if (doc.DocumentElement == null || doc.DocumentElement.ChildNodes == null) {
-                return;
-            }
-
-            foreach (XmlNode node in doc.DocumentElement.ChildNodes) {
-                if(node.Name != "equalizer") {
-                    throw new XmlException ("equalizer node was expected");
+            try {
+                if (File.Exists (Path)) {
+                    using (var reader = new StreamReader (path)) {
+                        var deserializer = new Deserializer (reader);
+                        foreach (var node in (JsonObject)deserializer.Deserialize ()) {
+                            var eq_data = (JsonObject)node.Value;
+                            var eq = new EqualizerSetting (this, node.Key);
+                            eq.SetAmplifierLevel (Convert.ToDouble (eq_data["preamp"]), false);
+                            var bands = (JsonArray)eq_data["bands"];
+                            for (uint band = 0; band < bands.Count; band++) {
+                                eq.SetGain (band, Convert.ToDouble (bands[(int)band]), false);
+                            }
+                            Add (eq);
+                        }
+                    }
                 }
-
-                EqualizerSetting eq = new EqualizerSetting (node.Attributes["name"].Value);
-
-                foreach (XmlNode child in node) {
-                    if (child.Name == "preamp") {
-                        eq.AmplifierLevel = Convert.ToDouble (child.InnerText);
-                    } else if (child.Name == "band") {
-                        eq.SetGain (Convert.ToUInt32 (child.Attributes["num"].Value),
-                            Convert.ToDouble (child.InnerText));
-                    } else {
-                        throw new XmlException ("Invalid node, expected one of preamp or band");
+            } catch (Exception e) {
+                try {
+                    if (File.Exists (legacy_xml_path)) {
+                        var reader = new XmlTextReader (legacy_xml_path);
+                        if (reader.ReadToDescendant ("equalizers")) {
+                            while (reader.ReadToFollowing ("equalizer")) {
+                                var eq = new EqualizerSetting (this, reader["name"]);
+                                while (reader.Read () && !(reader.NodeType == XmlNodeType.EndElement &&
+                                    reader.Name == "equalizer")) {
+                                    if (reader.NodeType != XmlNodeType.Element) {
+                                        continue;
+                                    } else if (reader.Name == "preamp") {
+                                        eq.SetAmplifierLevel (reader.ReadElementContentAsDouble (), false);
+                                    } else if (reader.Name == "band") {
+                                        eq.SetGain (Convert.ToUInt32 (reader["num"]),
+                                            reader.ReadElementContentAsDouble (), false);
+                                    }
+                                }
+                                Add (eq);
+                            }
+                        }
+                        Log.Information ("Converted legaxy XML equalizer presets to new JSON format");
                     }
+                } catch (Exception xe) {
+                    Log.Exception ("Could not load equalizers.xml", xe);
                 }
 
-                Add (eq);
+                Log.Exception ("Could not load equalizers.json", e);
             }
+
+            if (equalizers.Count == 0) {
+                LoadDefaults ();
+            }
+
+            Log.DebugTimerPrint (timer, "Loaded equalizer presets: {0}");
+        }
+
+        private void LoadDefaults ()
+        {
+            equalizers = new List<EqualizerSetting> () {
+                new EqualizerSetting (this, Catalog.GetString ("Classical"), 0, new [] {
+                    0, 0, 0, 0, 0, 0, -7.2, -7.2, -7.2, -9.6
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Club"), 0, new [] {
+                    0, 0, 8, 5.6, 5.6, 5.6, 3.2, 0, 0, 0
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Dance"), -1.1, new [] {
+                    9.6, 7.2, 2.4, -1.1, -1.1, -5.6, -7.2, -7.2, -1.1, -1.1
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Full Bass"), -1.1, new [] {
+                    -8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Full Bass and Treble"), -1.1, new [] {
+                    7.2, 5.6, -1.1, -7.2, -4.8, 1.6, 8, 11.2, 12, 12
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Full Treble"), -1.1, new [] {
+                    -9.6, -9.6, -9.6, -4, 2.4, 11.2, 11.5, 11.8, 11.8, 12
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Laptop Speakers and Headphones"), -1.1, new [] {
+                    4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 11.9, 11.9
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Large Hall"), -1.1, new [] {
+                    10.4, 10.4, 5.6, 5.6, -1.1, -4.8, -4.8, -4.8, -1.1, -1.1
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Live"), -1.1, new [] {
+                    -4.8, -1.1, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Party"), -1.1, new [] {
+                    7.2, 7.2, -1.1, -1.1, -1.1, -1.1, -1.1, -1.1, 7.2, 7.2
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Pop"), -1.1, new [] {
+                    -1.6, 4.8, 7.2, 8, 5.6, -1.1, -2.4, -2.4, -1.6, -1.6
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Reggae"), -1.1, new [] {
+                    -1.1, -1.1, -1.1, -5.6, -1.1, 6.4, 6.4, -1.1, -1.1, -1.1
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Rock"), -1.1, new [] {
+                    8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Ska"), -1.1, new [] {
+                    -2.4, -4.8, -4, -1.1, 4, 5.6, 8.8, 9.6, 11.2, 9.6
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Soft"), -1.1, new [] {
+                    4.8, 1.6, -1.1, -2.4, -1.1, 4, 8, 9.6, 11.2, 12,
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Soft Rock"), -1.1, new [] {
+                    4, 4, 2.4, -1.1, -4, -5.6, -3.2, -1.1, 2.4, 8.8,
+                }),
+                new EqualizerSetting (this, Catalog.GetString ("Techno"), -1.1, new [] {
+                    8, 5.6, -1.1, -5.6, -4.8, -1.1, 8, 9.6, 9.6, 8.8
+                })
+            };
+
+            Select ("Pop");
         }
 
         public void Save ()
         {
-            Save (path);
+            Save (Path);
         }
 
         public void Save (string path)
         {
-            XmlDocument doc = new XmlDocument ();
-            XmlNode root = doc.CreateNode (XmlNodeType.Element, "equalizers", null);
-            doc.AppendChild (root);
-
-            foreach (EqualizerSetting eq in this) {
-                XmlNode root_node = doc.CreateNode (XmlNodeType.Element, "equalizer", null);
-
-                XmlAttribute name_node = doc.CreateAttribute ("name");
-                name_node.Value = eq.Name;
-                XmlNode preamp_node = doc.CreateNode (XmlNodeType.Element, "preamp", null);
-                XmlNode preamp_node_value = doc.CreateNode (XmlNodeType.Text, "value", null);
-                preamp_node_value.Value = Convert.ToString (eq.AmplifierLevel);
-                preamp_node.AppendChild (preamp_node_value);
-
-                root_node.Attributes.Append (name_node);
-                root_node.AppendChild (preamp_node);
-
-                foreach (KeyValuePair<uint, double> band in eq.Bands) {
-                    XmlNode band_node = doc.CreateNode (XmlNodeType.Element, "band", null);
-                    XmlNode band_node_value = doc.CreateNode (XmlNodeType.Text, "value", null);
-                    band_node_value.Value = Convert.ToString (band.Value);
-                    band_node.AppendChild (band_node_value);
-
-                    XmlAttribute frequency_node = doc.CreateAttribute ("num");
-                    frequency_node.Value = Convert.ToString (band.Key);
-                    band_node.Attributes.Append (frequency_node);
-
-                    root_node.AppendChild (band_node);
+            try {
+                using (var writer = new StreamWriter (Path)) {
+                    writer.Write ("{");
+                    writer.WriteLine ();
+                    foreach (var eq in this) {
+                        writer.Write (eq);
+                        writer.Write (",");
+                        writer.WriteLine ();
+                    }
+                    writer.Write ("}");
                 }
-
-                root.AppendChild (root_node);
+                Log.Debug ("EqualizerManager", "Saved equalizers to disk");
+            } catch (Exception e) {
+                Log.Exception ("Unable to save equalizers", e);
             }
-
-            doc.Save (path);
         }
 
         protected virtual void OnEqualizerAdded (EqualizerSetting eq)
@@ -287,8 +386,18 @@ namespace Banshee.Equalizer
             return equalizers.GetEnumerator ();
         }
 
-        public string Path {
-            get { return path; }
-        }
+        public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
+            "player_engine", "equalizer_enabled",
+            false,
+            "Equalizer status",
+            "Whether or not the equalizer is set to be enabled."
+        );
+
+        public static readonly SchemaEntry<string> PresetSchema = new SchemaEntry<string> (
+            "player_engine", "equalizer_preset",
+            "",
+            "Equalizer preset",
+            "Default preset to load into equalizer."
+        );
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
index a12fce9..0a381ae 100644
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
+++ b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
@@ -1,10 +1,11 @@
 //
 // EqualizerSetting.cs
 //
-// Author:
+// Authors:
+//   Aaron Bockover <abockover novell com>
 //   Alexander Hixon <hixon alexander mediati org>
 //
-// Copyright (C) 2007 Novell, Inc.
+// Copyright 2007-2010 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -37,96 +38,99 @@ namespace Banshee.Equalizer
 {
     public class EqualizerSetting
     {
-        private string name;
-        private Dictionary<uint, double> bands = new Dictionary<uint, double> ();
-        private double amp = 0;    // amplifier dB (0 dB == passthrough)
-        private bool enabled = true;
         private const uint bandcount = 10;
 
+        private EqualizerManager manager;
+        private string name;
+        private double [] bands = new double[bandcount];
+        private double amp = 0; // amplifier dB (0 dB == passthrough)
+
         public event EventHandler Changed;
 
-        public EqualizerSetting (string name)
+        internal EqualizerSetting (EqualizerManager manager,
+            string name, double amp, double [] gains) : this (manager, name)
         {
-            this.name = name;
-
-            // Fill in 0 dB for all bands at init.
-            for (uint i = 0; i < bandcount; i++) {
-                bands.Add(i, 0);
+            for (uint i = 0; i < gains.Length; i++) {
+                SetGain (i, gains[i], false);
             }
         }
 
-        /// <summary>
-        /// Human-readable name of this equalizer instance.
-        /// </summary>
+        public EqualizerSetting (EqualizerManager manager, string name)
+        {
+            this.manager = manager;
+            this.name = name;
+        }
+
         public string Name {
             get { return name; }
-            set
-            {
+            set {
                 name = value;
-                PresetSchema.Set (this.name);
                 OnChanged ();
             }
         }
 
-        public bool Enabled {
-            get { return enabled; }
-            set
-            {
-                enabled = value;
-                EnabledSchema.Set (value);
-
-                // Make this the new default preset (last changed).
-                PresetSchema.Set (this.name);
-            }
-        }
-
-        public Dictionary<uint, double> Bands {
-            get { return bands; }
-        }
-
         public uint BandCount {
             get { return bandcount; }
         }
 
-        /// <summary>
-        /// Sets/gets the preamp gain.
-        /// </summary>
+        public double this[uint band] {
+            get { return bands[band]; }
+            set { SetGain (band, value, true); }
+        }
+
         public double AmplifierLevel {
             get { return amp; }
-            set
-            {
-                amp = value;
-                if (enabled) {
-                    ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).AmplifierLevel = value;
-                }
-                OnChanged ();
+            set { SetAmplifierLevel (value, true); }
+        }
+
+        public void SetAmplifierLevel (double value, bool flushToEngine)
+        {
+            amp = value;
+
+            if (!flushToEngine) {
+                return;
             }
+
+            if (manager.IsActive) {
+                ((IEqualizer)ServiceManager.PlayerEngine.ActiveEngine).AmplifierLevel = value;
+            }
+
+            OnChanged ();
         }
 
-        /// <summary>
-        /// Sets the gain on a selected band.
-        /// </summary>
-        /// <param name="band">The band to adjust gain.</param>
-        /// <param name="val">The value in dB to set the band gain to.</param>
-        public void SetGain (uint band, double val)
+        public void SetGain (uint band, double value, bool flushToEngine)
         {
-            if (bands.ContainsKey (band)) {
-                bands[band] = val;
-            } else {
-                bands.Add (band, val);
+            if (band >= bandcount) {
+                throw new ArgumentOutOfRangeException (String.Format (
+                    "Band number {0} invalid - only up to {1} bands supported.", band, bandcount));
             }
 
-            // Tell engine that we've changed.
-            if (enabled) {
-                ((IEqualizer) ServiceManager.PlayerEngine.ActiveEngine).SetEqualizerGain (band, val);
+            bands[band] = value;
+
+            if (!flushToEngine) {
+                return;
+            }
+
+            if (manager.IsActive) {
+                ((IEqualizer)ServiceManager.PlayerEngine.ActiveEngine).SetEqualizerGain (band, value);
             }
 
             OnChanged ();
         }
 
-        public double this[uint band] {
-            get { return bands[band]; }
-            set { SetGain (band, value); }
+        public void FlushToEngine ()
+        {
+            if (!manager.IsActive) {
+                return;
+            }
+
+            var engine_eq = (IEqualizer)ServiceManager.PlayerEngine.ActiveEngine;
+            engine_eq.AmplifierLevel = AmplifierLevel;
+            for (uint band = 0; band < bands.Length; band++) {
+                engine_eq.SetEqualizerGain (band, bands[band]);
+            }
+
+            OnChanged ();
         }
 
         protected virtual void OnChanged ()
@@ -137,18 +141,24 @@ namespace Banshee.Equalizer
             }
         }
 
-        public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
-            "player_engine", "equalizer_enabled",
-            false,
-            "Equalizer status",
-            "Whether or not the equalizer is set to be enabled."
-        );
-
-        public static readonly SchemaEntry<string> PresetSchema = new SchemaEntry<string> (
-            "player_engine", "equalizer_preset",
-            "",
-            "Equalizer preset",
-            "Default preset to load into equalizer."
-        );
+        public override string ToString ()
+        {
+            var builder = new System.Text.StringBuilder ();
+            builder.AppendFormat ("    \"{0}\": {{", Name.Replace ("\"", "\\\""));
+            builder.AppendLine ();
+            builder.AppendFormat ("        \"preamp\": {0},", AmplifierLevel);
+            builder.AppendLine ();
+            builder.Append ("        \"bands\": [ ");
+            for (uint band = 0; band < bands.Length; band++) {
+                builder.Append (bands[band]);
+                if (band < bands.Length - 1) {
+                    builder.Append (", ");
+                }
+            }
+            builder.Append (" ]");
+            builder.AppendLine ();
+            builder.Append ("    }");
+            return builder.ToString ();
+        }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index 0ff9a71..a72dbfd 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -200,25 +200,8 @@ namespace Banshee.MediaEngine
                 MetadataService.Instance.Lookup (CurrentTrack);
             } else if (args.Current == PlayerState.Ready) {
                 // Enable our preferred equalizer if it exists and was enabled last time.
-                if (SupportsEqualizer && EqualizerSetting.EnabledSchema.Get ()) {
-                    string name = EqualizerSetting.PresetSchema.Get();
-                    if (!String.IsNullOrEmpty (name)) {
-                        // Don't use EqualizerManager.Instance - used by the eq dialog window.
-                        EqualizerManager manager = new EqualizerManager (EqualizerManager.Instance.Path);
-                        manager.Load ();
-                        EqualizerSetting equalizer = null;
-                        foreach (EqualizerSetting eq in manager) {
-                            if (eq.Name == name) {
-                                equalizer = eq;
-                                break;
-                            }
-                        }
-
-                        if (equalizer != null) {
-                            Log.DebugFormat ("Enabling equalizer preset: {0}", equalizer.Name);
-                            manager.Enable (equalizer);
-                        }
-                    }
+                if (SupportsEqualizer) {
+                    EqualizerManager.Instance.Select ();
                 }
 
                 if (pending_playback_for_not_ready != null) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
index 2daf799..2588f08 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
@@ -100,22 +100,6 @@ namespace Banshee.Equalizer.Gui
             }
         }
 
-        public bool ActivatePreferredEqualizer (string name)
-        {
-            if (name == null || name == "") {
-                return ActivateFirstEqualizer ();
-            } else {
-                foreach (EqualizerSetting eq in manager) {
-                    if (eq.Name == name) {
-                        ActiveEqualizer = eq;
-                        return true;
-                    }
-                }
-
-                return false;
-            }
-        }
-
         public bool ActivateFirstEqualizer ()
         {
             TreeIter iter;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
index 6e7dc94..2379df2 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
@@ -6,7 +6,7 @@
 //   Ivan N. Zlatev <contact i-nZ.net>
 //   Alexander Hixon <hixon alexander mediati org>
 //
-// Copyright (C) 2006-2007 Novell, Inc.
+// Copyright 2006-2010 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -48,6 +48,7 @@ namespace Banshee.Equalizer.Gui
         private EqualizerBandScale amplifier_scale;
         private EqualizerSetting active_eq;
         private int [] range = new int[3];
+        private bool loading;
 
         public event EqualizerChangedEventHandler EqualizerChanged;
         public event AmplifierChangedEventHandler AmplifierChanged;
@@ -128,10 +129,14 @@ namespace Banshee.Equalizer.Gui
 
         private void OnEqualizerValueChanged (object o, EventArgs args)
         {
+            if (loading) {
+                return;
+            }
+
             EqualizerBandScale scale = o as EqualizerBandScale;
 
             if (active_eq != null) {
-                active_eq.SetGain (scale.Band, (double)scale.Value / 10);
+                active_eq.SetGain (scale.Band, (double)scale.Value / 10, true);
             }
 
             if (EqualizerChanged != null) {
@@ -141,6 +146,10 @@ namespace Banshee.Equalizer.Gui
 
         private void OnAmplifierValueChanged (object o, EventArgs args)
         {
+            if (loading) {
+                return;
+            }
+
             EqualizerBandScale scale = o as EqualizerBandScale;
             if (active_eq != null) {
                 active_eq.AmplifierLevel = (double) (scale.Value / 10.0);
@@ -189,10 +198,16 @@ namespace Banshee.Equalizer.Gui
         public EqualizerSetting EqualizerSetting {
             get { return active_eq; }
             set {
+                if (active_eq == value) {
+                    return;
+                }
+
+                loading = true;
                 active_eq = value;
 
                 if (active_eq == null) {
                     AmplifierLevel = 0;
+                    loading = false;
                     return;
                 }
 
@@ -202,6 +217,8 @@ namespace Banshee.Equalizer.Gui
                     uint x = (uint) i;
                     SetBand (x, active_eq[x]);
                 }
+
+                loading = false;
             }
         }
     }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
index 07caa71..e43d04e 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
@@ -102,24 +102,9 @@ namespace Banshee.Equalizer.Gui
 
             box.PackStart (eq_view, true, true, 0);
 
-            eq_enabled_checkbox.Active = EqualizerSetting.EnabledSchema.Get ();
-            eq_preset_combo.ActivatePreferredEqualizer (EqualizerSetting.PresetSchema.Get ());
-
-            if (eq_enabled_checkbox.Active) {
-                // enable equalizer if was enabled last session
-                EqualizerManager.Instance.Enable (eq_preset_combo.ActiveEqualizer);
-            }
-
-            if (eq_preset_combo.ActiveEqualizer == null) {
-                // user has no presets, so create one
-                OnNewPreset (null, null);
-
-                // enable our new preset (it has no effect though, since all bands are 0db)
-                eq_enabled_checkbox.Active = true;
-                OnEnableDisable (null, null);
-            }
-
+            eq_enabled_checkbox.Active = EqualizerManager.Instance.IsActive;
             eq_enabled_checkbox.Clicked += OnEnableDisable;
+            eq_preset_combo.ActiveEqualizer = EqualizerManager.Instance.SelectedEqualizer;
 
             Gdk.Geometry limits = new Gdk.Geometry ();
             limits.MinWidth = -1;
@@ -155,7 +140,8 @@ namespace Banshee.Equalizer.Gui
 
         private void OnNewPreset (object o, EventArgs args)
         {
-            EqualizerSetting eq = new EqualizerSetting (Catalog.GetString ("New Preset"));
+            EqualizerSetting eq = new EqualizerSetting (EqualizerManager.Instance,
+                Catalog.GetString ("New Preset"));
             EqualizerManager.Instance.Add (eq);
             eq_preset_combo.ActiveEqualizer = eq;
             eq_preset_combo.Entry.SelectRegion (0, eq_preset_combo.Entry.Text.Length);
@@ -170,17 +156,13 @@ namespace Banshee.Equalizer.Gui
         {
             if (eq_preset_combo.ActiveEqualizer != eq_view.EqualizerSetting) {
                 eq_view.EqualizerSetting = eq_preset_combo.ActiveEqualizer;
-                OnEnableDisable (null, null);
+                EqualizerManager.Instance.Select (eq_preset_combo.ActiveEqualizer);
             }
         }
 
         private void OnEnableDisable (object o, EventArgs args)
         {
-            if (eq_enabled_checkbox.Active) {
-                EqualizerManager.Instance.Enable (eq_preset_combo.ActiveEqualizer);
-            } else {
-                EqualizerManager.Instance.Disable (eq_preset_combo.ActiveEqualizer);
-            }
+            EqualizerManager.Instance.IsActive = eq_enabled_checkbox.Active;
         }
     }
 }



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