banshee r4409 - in trunk/banshee: . libbanshee src/Backends/Banshee.GStreamer/Banshee.GStreamer src/Core/Banshee.Services src/Core/Banshee.Services/Banshee.MediaEngine



Author: abock
Date: Wed Aug 20 19:28:11 2008
New Revision: 4409
URL: http://svn.gnome.org/viewvc/banshee?rev=4409&view=rev

Log:
2008-08-20  Aaron Bockover  <abock gnome org>

    Committed a revised/reorganized version of Chris Howie's <cdhowie gmail com>
    visualization support patch (BGO #529479); this does not actually implement
    visualization, but adds support for extensions to do so by harvesting
    spectrum data that is now readily available.

    * src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs:
    * src/Core/Banshee.Services/Banshee.MediaEngine/VisualizationDataCallback.cs:
    Add interface for PlayerEngines that can provide data for visualizations.

    * src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:
    Implement IVisualizationDataSource, binding the unmanaged visualization
    support from libbanshee's BansheePlayer

    * libbanshee/banshee-player-vis.c
    * libbanshee/banshee-player-vis.h: Unmanaged support for gathering
    visualization data on the pipeline using the spectrum element

    * libbanshee/banshee-player-pipeline.c:
    * libbanshee/banshee-player-private.h: Integrate new vis code into the
    pipeline and player object



Added:
   trunk/banshee/libbanshee/banshee-player-vis.c
   trunk/banshee/libbanshee/banshee-player-vis.h
   trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/libbanshee/Makefile.am
   trunk/banshee/libbanshee/banshee-player-pipeline.c
   trunk/banshee/libbanshee/banshee-player-private.h
   trunk/banshee/libbanshee/libbanshee.mdp
   trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
   trunk/banshee/src/Core/Banshee.Services/Makefile.am

Modified: trunk/banshee/libbanshee/Makefile.am
==============================================================================
--- trunk/banshee/libbanshee/Makefile.am	(original)
+++ trunk/banshee/libbanshee/Makefile.am	Wed Aug 20 19:28:11 2008
@@ -19,6 +19,7 @@
 	banshee-player-pipeline.c \
 	banshee-player-replaygain.c \
 	banshee-player-video.c \
+	banshee-player-vis.c \
 	banshee-ripper.c \
 	banshee-tagger.c \
 	banshee-transcoder.c
@@ -32,6 +33,7 @@
 	banshee-player-private.h \
 	banshee-player-replaygain.h \
 	banshee-player-video.h \
+	banshee-player-vis.h \
 	banshee-tagger.h
 
 libbanshee_la_LIBADD = \

Modified: trunk/banshee/libbanshee/banshee-player-pipeline.c
==============================================================================
--- trunk/banshee/libbanshee/banshee-player-pipeline.c	(original)
+++ trunk/banshee/libbanshee/banshee-player-pipeline.c	Wed Aug 20 19:28:11 2008
@@ -32,6 +32,7 @@
 #include "banshee-player-equalizer.h"
 #include "banshee-player-missing-elements.h"
 #include "banshee-player-replaygain.h"
+#include "banshee-player-vis.h"
 
 // ---------------------------------------------------------------------------
 // Private Functions
@@ -161,6 +162,7 @@
         
         case GST_MESSAGE_ELEMENT: {
             _bp_missing_elements_process_message (player, message);
+            _bp_vis_process_message (player, message);
             break;
         }
         
@@ -259,6 +261,8 @@
         gst_element_link (audiosinkqueue, audiosink);
     }
     
+    _bp_vis_pipeline_setup (player);
+    
     // Now that our internal audio sink is constructed, tell playbin to use it
     g_object_set (G_OBJECT (player->playbin), "audio-sink", player->audiobin, NULL);
     
@@ -288,5 +292,7 @@
         gst_object_unref (GST_OBJECT (player->playbin));
     }
     
+    _bp_vis_pipeline_destroy (player);
+    
     player->playbin = NULL;
 }

Modified: trunk/banshee/libbanshee/banshee-player-private.h
==============================================================================
--- trunk/banshee/libbanshee/banshee-player-private.h	(original)
+++ trunk/banshee/libbanshee/banshee-player-private.h	Wed Aug 20 19:28:11 2008
@@ -35,6 +35,7 @@
 
 #include <string.h>
 #include <gst/gst.h>
+#include <gst/base/gstadapter.h>
 #include <gdk/gdk.h>
 
 #ifdef HAVE_GST_PBUTILS
@@ -64,9 +65,9 @@
 typedef void (* BansheePlayerIterateCallback)      (BansheePlayer *player);
 typedef void (* BansheePlayerBufferingCallback)    (BansheePlayer *player, gint buffering_progress);
 typedef void (* BansheePlayerTagFoundCallback)     (BansheePlayer *player, const gchar *tag, const GValue *value);
+typedef void (* BansheePlayerVisDataCallback)      (BansheePlayer *player, gint channels, gint samples, gfloat *data, gfloat *spectrum);
 
 struct BansheePlayer {
-
     // Player Callbacks
     BansheePlayerEosCallback eos_cb;
     BansheePlayerErrorCallback error_cb;
@@ -74,6 +75,7 @@
     BansheePlayerIterateCallback iterate_cb;
     BansheePlayerBufferingCallback buffering_cb;
     BansheePlayerTagFoundCallback tag_found_cb;
+    BansheePlayerVisDataCallback vis_data_cb;
 
     // Pipeline Elements
     GstElement *playbin;
@@ -97,6 +99,10 @@
     GdkWindow *video_window;
     #endif
     
+    // Visualization State
+    GstAdapter *vis_buffer;
+    gfloat *spectrum_buffer;
+    
     // Plugin Installer State
     GdkWindow *window;
     GSList *missing_element_details;

Added: trunk/banshee/libbanshee/banshee-player-vis.c
==============================================================================
--- (empty file)
+++ trunk/banshee/libbanshee/banshee-player-vis.c	Wed Aug 20 19:28:11 2008
@@ -0,0 +1,181 @@
+//
+// banshee-player-vis.c
+//
+// Author:
+//   Chris Howie <cdhowie gmail com>
+//
+// Copyright (C) 2008 Chris Howie
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#include "banshee-player-vis.h"
+
+#define SPECTRUM_SIZE 512
+
+static GstStaticCaps vis_data_sink_caps = GST_STATIC_CAPS (
+    "audio/x-raw-float, "
+    "rate = (int) 30720, "
+    "channels = (int) 2, "
+    "endianness = (int) BYTE_ORDER, "
+    "width = (int) 32"
+);
+
+// ---------------------------------------------------------------------------
+// Private Functions
+// ---------------------------------------------------------------------------
+
+static void
+bp_vis_pcm_handoff (GstElement *sink, GstBuffer *buffer, GstPad *pad, gpointer userdata)
+{
+    BansheePlayer *player = (BansheePlayer*)userdata;
+    GstStructure *structure;
+    gint channels, wanted_size;
+    gfloat *data;
+    
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
+    
+    if (player->vis_data_cb == NULL) {
+        return;
+    }
+    
+    structure = gst_caps_get_structure (gst_buffer_get_caps (buffer), 0);
+    gst_structure_get_int (structure, "channels", &channels);
+    
+    wanted_size = channels * SPECTRUM_SIZE * sizeof (gfloat);
+    
+    gst_adapter_push (player->vis_buffer, gst_buffer_copy (buffer));
+    
+    while ((data = (gfloat *)gst_adapter_peek (player->vis_buffer, wanted_size)) != NULL) {
+        gfloat *deinterlaced = g_malloc (wanted_size);
+        gint i, j;
+        
+        for (i = 0; i < SPECTRUM_SIZE; i++) {
+            for (j = 0; j < channels; j++) {
+                deinterlaced[j * SPECTRUM_SIZE + i] = data[i * channels + j];
+            }
+        }
+        
+        player->vis_data_cb (player, channels, SPECTRUM_SIZE, deinterlaced, player->spectrum_buffer);
+        
+        g_free (deinterlaced);
+        gst_adapter_flush (player->vis_buffer, wanted_size);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Internal Functions
+// ---------------------------------------------------------------------------
+
+void
+_bp_vis_process_message (BansheePlayer *player, GstMessage *message)
+{
+    const GstStructure *st;
+    const GValue *spec;
+    gint i;
+    
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
+    
+    st = gst_message_get_structure (message);
+    if (strcmp (gst_structure_get_name (st), "spectrum") != 0) {
+        return;
+    }
+    
+    spec = gst_structure_get_value (st, "magnitude");
+    
+    for (i = 0; i < SPECTRUM_SIZE; i++) {
+        // v is in the range -60 to 0.  Move this up to 0 to 1.
+        gfloat v = g_value_get_float (gst_value_list_get_value (spec, i));
+        player->spectrum_buffer[i] = (v + 60.0f) / 60.0f;
+    }
+}
+
+void
+_bp_vis_pipeline_setup (BansheePlayer *player)
+{
+    GstElement *fakesink, *converter, *resampler, *audiosinkqueue, *spectrum;
+    GstCaps *caps;
+    GstPad *pad;
+    
+    player->vis_buffer = NULL;
+    player->spectrum_buffer = NULL;
+    
+    // Privided by gst-plugins-good
+    spectrum = gst_element_factory_make ("spectrum", "vis-spectrum");
+    if (spectrum == NULL) {
+        bp_debug ("Could not create the spectrum element. Visualization will be disabled.");
+        return;
+    }
+    
+    g_object_set (G_OBJECT (spectrum), "bands", SPECTRUM_SIZE, "interval", GST_SECOND / 60, NULL);
+    
+    // Core elements, if something fails here, it's the end of the world
+    audiosinkqueue = gst_element_factory_make ("queue", "vis-queue");
+    resampler = gst_element_factory_make ("audioresample", "vis-resample");
+    converter = gst_element_factory_make ("audioconvert", "vis-convert");
+    fakesink = gst_element_factory_make ("fakesink", "vis-sink");
+    
+    if (audiosinkqueue == NULL || resampler == NULL || converter == NULL || fakesink == NULL) {
+        bp_debug ("Could not construct visualization pipeline, a fundamental element could not be created");
+        return;
+    }
+    
+    g_signal_connect (G_OBJECT (fakesink), "handoff", G_CALLBACK (bp_vis_pcm_handoff), player);
+    g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, "sync", TRUE, NULL);
+    
+    gst_bin_add_many (GST_BIN (player->audiobin), audiosinkqueue, resampler, converter, spectrum, fakesink, NULL);
+    
+    pad = gst_element_get_static_pad (audiosinkqueue, "sink");
+    gst_pad_link (gst_element_get_request_pad (player->audiotee, "src%d"), pad);
+    gst_object_unref (GST_OBJECT (pad));
+    
+    gst_element_link_many (audiosinkqueue, resampler, converter, NULL);
+    
+    caps = gst_static_caps_get (&vis_data_sink_caps);
+    gst_element_link_filtered (converter, spectrum, caps);
+    gst_caps_unref (caps);
+    
+    gst_element_link (spectrum, fakesink);
+    
+    player->vis_buffer = gst_adapter_new ();
+    player->spectrum_buffer = g_new0 (gfloat, SPECTRUM_SIZE);
+}
+
+void
+_bp_vis_pipeline_destroy (BansheePlayer *player)
+{
+    if (player->vis_buffer != NULL) {
+        gst_object_unref (player->vis_buffer);
+        player->vis_buffer = NULL;
+        
+        g_free (player->spectrum_buffer);
+        player->spectrum_buffer = NULL;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Public Functions
+// ---------------------------------------------------------------------------
+
+P_INVOKE void
+bp_set_vis_data_callback (BansheePlayer *player, BansheePlayerVisDataCallback cb)
+{
+    SET_CALLBACK (vis_data_cb);
+}

Added: trunk/banshee/libbanshee/banshee-player-vis.h
==============================================================================
--- (empty file)
+++ trunk/banshee/libbanshee/banshee-player-vis.h	Wed Aug 20 19:28:11 2008
@@ -0,0 +1,38 @@
+//
+// banshee-player-vis.h
+//
+// Author:
+//   Chris Howie <cdhowie gmail com>
+//
+// Copyright (C) 2008 Chris Howie
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#ifndef _BANSHEE_PLAYER_VIS_H
+#define _BANSHEE_PLAYER_VIS_H
+
+#include "banshee-player-private.h"
+
+void _bp_vis_process_message  (BansheePlayer *player, GstMessage *message);
+void _bp_vis_pipeline_setup   (BansheePlayer *player);
+void _bp_vis_pipeline_destroy (BansheePlayer *player);
+
+#endif /* _BANSHEE_PLAYER_VIS_H */

Modified: trunk/banshee/libbanshee/libbanshee.mdp
==============================================================================
--- trunk/banshee/libbanshee/libbanshee.mdp	(original)
+++ trunk/banshee/libbanshee/libbanshee.mdp	Wed Aug 20 19:28:11 2008
@@ -28,6 +28,8 @@
     <File name="banshee-player-equalizer.h" subtype="Code" buildaction="Nothing" />
     <File name="banshee-player-replaygain.c" subtype="Code" buildaction="Compile" />
     <File name="banshee-player-replaygain.h" subtype="Code" buildaction="Nothing" />
+    <File name="banshee-player-vis.c" subtype="Code" buildaction="Compile" />
+    <File name="banshee-player-vis.h" subtype="Code" buildaction="Nothing" />
   </Contents>
   <compiler ctype="GccCompiler" />
   <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="Makefile.am">

Modified: trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	Wed Aug 20 19:28:11 2008
@@ -56,10 +56,11 @@
     internal delegate void BansheePlayerStateChangedCallback (IntPtr player, GstState old_state, GstState new_state, GstState pending_state);
     internal delegate void BansheePlayerIterateCallback (IntPtr player);
     internal delegate void BansheePlayerBufferingCallback (IntPtr player, int buffering_progress);
+    internal delegate void BansheePlayerVisDataCallback (IntPtr player, int channels, int samples, IntPtr data, IntPtr spectrum);
 
     internal delegate void GstTaggerTagFoundCallback (IntPtr player, string tagName, ref GLib.Value value);
     
-    public class PlayerEngine : Banshee.MediaEngine.PlayerEngine, Banshee.MediaEngine.IEqualizer
+    public class PlayerEngine : Banshee.MediaEngine.PlayerEngine, IEqualizer, IVisualizationDataSource
     {
         private uint GST_CORE_ERROR = 0;
         private uint GST_LIBRARY_ERROR = 0;
@@ -73,12 +74,38 @@
         private BansheePlayerStateChangedCallback state_changed_callback;
         private BansheePlayerIterateCallback iterate_callback;
         private BansheePlayerBufferingCallback buffering_callback;
+        private BansheePlayerVisDataCallback vis_data_callback;
         private GstTaggerTagFoundCallback tag_found_callback;
         
         private bool buffering_finished;
         private int pending_volume = -1;
         private bool xid_is_set = false;
         
+        private event VisualizationDataHandler data_available = null;
+        public event VisualizationDataHandler DataAvailable {
+            add {
+                if (value == null) {
+                    return;
+                } else if (data_available == null) {
+                    bp_set_vis_data_callback (handle, vis_data_callback);
+                }
+
+                data_available += value;
+            }
+            
+            remove {
+                if (value == null) {
+                    return;
+                }
+
+                data_available -= value;
+
+                if (data_available == null) {
+                    bp_set_vis_data_callback (handle, null);
+                }
+            }
+        }
+        
         public PlayerEngine ()
         {
             if (ServiceManager.IsInitialized) {
@@ -114,6 +141,7 @@
             state_changed_callback = new BansheePlayerStateChangedCallback (OnStateChange);
             iterate_callback = new BansheePlayerIterateCallback (OnIterate);
             buffering_callback = new BansheePlayerBufferingCallback (OnBuffering);
+            vis_data_callback = new BansheePlayerVisDataCallback (OnVisualizationData);
             tag_found_callback = new GstTaggerTagFoundCallback (OnTagFound);
             
             bp_set_eos_callback (handle, eos_callback);
@@ -293,7 +321,35 @@
         {
             OnTagFound (ProcessNativeTagResult (tagName, ref value));
         }
+        
+        private void OnVisualizationData (IntPtr player, int channels, int samples, IntPtr data, IntPtr spectrum)
+        {
+            VisualizationDataHandler handler = data_available;
+            
+            if (handler == null) {
+                return;
+            }
+            
+            float [] flat = new float[channels * samples];
+            Marshal.Copy (data, flat, 0, flat.Length);
+            
+            float [][] cbd = new float[channels][];
+            for (int i = 0; i < channels; i++) {
+                float [] channel = new float[samples];
+                Array.Copy (flat, i * samples, channel, 0, samples);
+                cbd[i] = channel;
+            }
             
+            float [] spec = new float[512];
+            Marshal.Copy (spectrum, spec, 0, 512);
+            
+            try {
+                handler (cbd, new float[][] { spec });
+            } catch (Exception e) {
+                Log.Exception ("Uncaught exception during visualization data post.", e);
+            }
+        }
+        
         private static StreamTag ProcessNativeTagResult (string tagName, ref GLib.Value valueRaw)
         {
             if (tagName == String.Empty || tagName == null) {
@@ -487,6 +543,9 @@
         private static extern void bp_set_error_callback (HandleRef player, BansheePlayerErrorCallback cb);
         
         [DllImport ("libbanshee")]
+        private static extern void bp_set_vis_data_callback (HandleRef player, BansheePlayerVisDataCallback cb);
+        
+        [DllImport ("libbanshee")]
         private static extern void bp_set_state_changed_callback (HandleRef player, 
             BansheePlayerStateChangedCallback cb);
             

Added: trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/IVisualizationDataSource.cs	Wed Aug 20 19:28:11 2008
@@ -0,0 +1,38 @@
+// IVisualizationDataSource.cs
+//
+// Author:
+//   Chris Howie <cdhowie gmail com>
+//
+// Copyright (C) 2008 Chris Howie
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Banshee.MediaEngine
+{
+    public delegate void VisualizationDataHandler (float [][] pcm, float [][] spectrum);
+    
+    public interface IVisualizationDataSource
+    {
+        event VisualizationDataHandler DataAvailable;
+    }
+}

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp	Wed Aug 20 19:28:11 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Services" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Services" fileversion="2.0" language="C#" UseParentDirectoryAsNamespace="True" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Banshee.Services" />
@@ -182,6 +182,8 @@
     <File name="Banshee.Collection.Database/FilterModelProvider.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Collection.Database/QueryFilterInfo.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Sources/IFilterableSource.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.MediaEngine/IVisualizationDataSource.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection/MoveOnInfoSaveJob.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
@@ -200,6 +202,7 @@
     <ProjectReference type="Project" localcopy="False" refto="Lastfm" />
   </References>
   <Deployment.LinuxDeployData generateScript="False" />
+  <GtkDesignInfo gtkVersion="2.12.1" />
   <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="Makefile.am">
     <BuildFilesVar Sync="True" Name="SOURCES" />
     <DeployFilesVar />
@@ -209,4 +212,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
+</Project>
\ No newline at end of file

Modified: trunk/banshee/src/Core/Banshee.Services/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Makefile.am	Wed Aug 20 19:28:11 2008
@@ -68,6 +68,7 @@
 	Banshee.MediaEngine/IEqualizer.cs \
 	Banshee.MediaEngine/IPlayerEngineService.cs \
 	Banshee.MediaEngine/ITranscoder.cs \
+	Banshee.MediaEngine/IVisualizationDataSource.cs \
 	Banshee.MediaEngine/NullPlayerEngine.cs \
 	Banshee.MediaEngine/PlayerEngine.cs \
 	Banshee.MediaEngine/PlayerEngineService.cs \



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