summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Oesterholt <hans@oesterholt.net>2013-01-16 14:35:13 +0100
committerHans Oesterholt <hans@oesterholt.net>2013-01-16 14:35:13 +0100
commit27f3e103f60c8c3983ad32608fd3d9023c2a79eb (patch)
tree1fbf00c918c2dde1bd1a8f93ac4fce8a3f7f4279
parentf63cfb9eb5f38c1116d520a569233d39d7aba2c5 (diff)
CueSheets: Added functionality to split mp3s (libmp3splt is used) and added a refresh menu option.
CueSheets: This functionality can be used when I figure out how to interact with the extension to CueSheets: add music to devices. CueSheets: Added Resources
-rw-r--r--src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs37
-rw-r--r--src/CueSheets/Banshee.CueSheets/Gui/Actions.cs28
-rw-r--r--src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs49
-rw-r--r--src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs276
-rw-r--r--src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs87
-rw-r--r--src/CueSheets/CueSheets.csproj9
-rw-r--r--src/CueSheets/Makefile.am6
-rw-r--r--src/CueSheets/Resources/GlobalUI.xml6
-rw-r--r--src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj5
9 files changed, 498 insertions, 5 deletions
diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs
index 1e3c2f7..8d76afb 100644
--- a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs
+++ b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs
@@ -56,6 +56,9 @@ using Banshee.Configuration;
namespace Banshee.CueSheets
{
+
+
+
// We are inheriting from Source, the top-level, most generic type of Source.
// Other types include (inheritance indicated by indentation):
// DatabaseSource - generic, DB-backed Track source; used by PlaylistSource
@@ -73,9 +76,10 @@ namespace Banshee.CueSheets
private List<CueSheet> _sheets=new List<CueSheet>();
private CueSheet _sheet=null;
private CueSheetsPrefs _preferences;
+ private Actions _actions;
private CS_TrackInfoDb _track_info_db;
-
+
public CueSheetsSource () : base (AddinManager.CurrentLocalizer.GetString ("CueSheets"),
AddinManager.CurrentLocalizer.GetString ("CueSheets"),
sort_order,
@@ -93,6 +97,15 @@ namespace Banshee.CueSheets
Properties.SetString ("Icon.Name", "cueplay");
Hyena.Log.Information ("CueSheets source has been instantiated.");
+ try {
+ Properties.SetString("GtkActionPath","/CueSheetsPopup");
+ _actions = new Actions (this);
+ Hyena.Log.Information(_actions.ToString());
+ } catch (System.Exception ex) {
+ Hyena.Log.Information(ex.ToString ());
+ }
+
+
InterfaceActionService action_service = ServiceManager.Get<InterfaceActionService> ();
Gtk.Menu viewMenu = (action_service.UIManager.GetWidget ("/MainMenu/ViewMenu") as Gtk.MenuItem).Submenu as Gtk.Menu;
@@ -231,7 +244,7 @@ namespace Banshee.CueSheets
}
return _artistModel;
}
-
+
public CS_ComposerModel getComposerModel() {
if (_composerModel==null) {
Hyena.Log.Information ("ComposerModel init");
@@ -284,6 +297,11 @@ namespace Banshee.CueSheets
_view.fill ();
}
+ public void RefreshCueSheets() {
+ Hyena.Log.Information("refreshing");
+ _view.fill ();
+ }
+
private class CustomView : ISourceContents
{
private Gtk.ListStore store;
@@ -599,6 +617,10 @@ namespace Banshee.CueSheets
MySource.getArtistModel ().Reload ();
}
+ public void MusicFileToDevice(CueSheet s) {
+ MusicToDevice mtd=new MusicToDevice(s);
+ mtd.Do ();
+ }
public void ToggleGrid(string forId) {
Hyena.Log.Information ("ToggleGrid for id "+forId);
@@ -673,9 +695,20 @@ namespace Banshee.CueSheets
edit.Activated+=delegate(object sender,EventArgs a) {
_view.EditSheet(((CS_AlbumInfo) this.Model[Selection.FirstIndex]).getSheet ());
};
+
mnu.Append (play);
mnu.Append (new Gtk.SeparatorMenuItem());
mnu.Append (edit);
+ CueSheet s=((CS_AlbumInfo) this.Model[Selection.FirstIndex]).getSheet ();
+ if (Mp3Split.DllPresent()) {
+ if (Mp3Split.IsSupported(s.musicFileName ())) {
+ Gtk.ImageMenuItem split=new Gtk.ImageMenuItem(Gtk.Stock.Convert,null);
+ split.Activated+=delegate(object sender,EventArgs a) {
+ _view.MusicFileToDevice(((CS_AlbumInfo) this.Model[Selection.FirstIndex]).getSheet ());
+ };
+ mnu.Append (split);
+ }
+ }
mnu.ShowAll ();
mnu.Popup();
return false;
diff --git a/src/CueSheets/Banshee.CueSheets/Gui/Actions.cs b/src/CueSheets/Banshee.CueSheets/Gui/Actions.cs
new file mode 100644
index 0000000..93a01d5
--- /dev/null
+++ b/src/CueSheets/Banshee.CueSheets/Gui/Actions.cs
@@ -0,0 +1,28 @@
+using System;
+using Banshee.I18n;
+
+namespace Banshee.CueSheets
+{
+ public class Actions : Banshee.Gui.BansheeActionGroup
+ {
+ private CueSheetsSource _src;
+
+ public Actions (CueSheetsSource src) : base ("CueSheets") {
+
+ _src=src;
+
+ base.AddImportant (
+ new Gtk.ActionEntry ("Synchronize", Gtk.Stock.Refresh,
+ Catalog.GetString ("Refresh CueSheets"),
+ null, null,
+ (o, a) => { _src.RefreshCueSheets(); }
+ )
+ );
+
+ AddUiFromFile ("GlobalUI.xml");
+
+ Register ();
+ }
+ }
+}
+
diff --git a/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs b/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs
new file mode 100644
index 0000000..06a7525
--- /dev/null
+++ b/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs
@@ -0,0 +1,49 @@
+using System;
+
+namespace Banshee.CueSheets
+{
+ public class MusicToDevice : Gtk.Dialog
+ {
+ private CueSheet _sheet;
+ private Mp3Split _splt;
+
+ public MusicToDevice (CueSheet s) {
+ _sheet=s;
+ }
+
+ private void CreateGui() {
+ Gtk.Button btn=new Gtk.Button("Split!");
+ Gtk.ProgressBar bar=new Gtk.ProgressBar();
+ Gtk.ProgressBar nr=new Gtk.ProgressBar();
+ Gtk.Button ok=(Gtk.Button) base.AddButton ("OK",1);
+ btn.Clicked+=delegate(object sender,EventArgs args) {
+ ok.Sensitive=false;
+ _splt.SplitWithPaths ();
+ _splt.SplitToDir ("/tmp");
+ GLib.Timeout.Add(10,delegate () {
+ bar.Fraction=_splt.ProgressOfCurrentTrack;
+ int n=_splt.ProgressNTracks;
+ int i=_splt.ProgressCurrentTrack;
+ double d=((double) i)/((double) n);
+ nr.Fraction=d;
+ if (_splt.SplitFinished) { ok.Sensitive=true; }
+ return !_splt.SplitFinished;
+ });
+ };
+ base.VBox.Add (nr);
+ base.VBox.Add (bar);
+ base.VBox.Add (btn);
+ base.VBox.ShowAll ();
+ }
+
+ public void Do() {
+ _splt=new Mp3Split(_sheet);
+ Hyena.Log.Information ("splt="+_splt.ToString ()+" sheet="+_sheet);
+ CreateGui ();
+ base.Run ();
+ base.Hide ();
+ base.Destroy ();
+ }
+ }
+}
+
diff --git a/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs
new file mode 100644
index 0000000..0a3db4e
--- /dev/null
+++ b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs
@@ -0,0 +1,276 @@
+using System;
+using System.Runtime.InteropServices;
+using Mono.Unix;
+using System.Text.RegularExpressions;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.Runtime.CompilerServices;
+
+namespace Banshee.CueSheets
+{
+
+ enum Mp3SpltOptions {
+ SPLT_OPT_PRETEND_TO_SPLIT,
+ SPLT_OPT_QUIET_MODE,
+ SPLT_OPT_DEBUG_MODE,
+ SPLT_OPT_SPLIT_MODE,
+ SPLT_OPT_TAGS,
+ SPLT_OPT_XING,
+ SPLT_OPT_CREATE_DIRS_FROM_FILENAMES,
+ SPLT_OPT_OUTPUT_FILENAMES,
+ SPLT_OPT_FRAME_MODE,
+ SPLT_OPT_AUTO_ADJUST,
+ SPLT_OPT_INPUT_NOT_SEEKABLE,
+ SPLT_OPT_PARAM_NUMBER_TRACKS,
+ SPLT_OPT_PARAM_REMOVE_SILENCE,
+ SPLT_OPT_PARAM_GAP,
+ SPLT_OPT_ALL_REMAINING_TAGS_LIKE_X,
+ SPLT_OPT_AUTO_INCREMENT_TRACKNUMBER_TAGS,
+ SPLT_OPT_ENABLE_SILENCE_LOG,
+ SPLT_OPT_FORCE_TAGS_VERSION,
+ SPLT_OPT_LENGTH_SPLIT_FILE_NUMBER,
+ SPLT_OPT_REPLACE_TAGS_IN_TAGS,
+ SPLT_OPT_OVERLAP_TIME,
+ SPLT_OPT_SPLIT_TIME,
+ SPLT_OPT_PARAM_THRESHOLD,
+ SPLT_OPT_PARAM_OFFSET,
+ SPLT_OPT_PARAM_MIN_LENGTH,
+ SPLT_OPT_PARAM_MIN_TRACK_LENGTH,
+ SPLT_OPT_ARTIST_TAG_FORMAT,
+ SPLT_OPT_ALBUM_TAG_FORMAT,
+ SPLT_OPT_TITLE_TAG_FORMAT,
+ SPLT_OPT_COMMENT_TAG_FORMAT,
+ SPLT_OPT_REPLACE_UNDERSCORES_TAG_FORMAT,
+ SPLT_OPT_SET_FILE_FROM_CUE_IF_FILE_TAG_FOUND,
+ };
+
+ enum SpltOutputFileNamesOptions {
+ SPLT_OUTPUT_FORMAT,
+ SPLT_OUTPUT_DEFAULT,
+ SPLT_OUTPUT_CUSTOM
+ };
+
+ [StructLayout(LayoutKind.Sequential)]
+ struct splt_progres {
+ public int progress_text_max_char;
+ [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)]
+ public string filename_shorted;
+ public float percent_progress;
+ public int current_split;
+ public int max_splits;
+ public int progress_type;
+ public int silence_found_tracks;
+ public float silence_db_level;
+ public int user_data;
+ public IntPtr progress_callback_function; // void (*progress)(struct splt_progres*, void *);
+ public IntPtr progress_cb_data; // public void *progress_cb_data;
+ };
+
+ public class Mp3Split : IDisposable
+ {
+ private IntPtr _mp3_state;
+ private List<Mp3SplitTrack> _tracks=new List<Mp3SplitTrack>();
+
+ private int _progress_n_tracks;
+ private int _progress_current_track;
+ private float _progress_of_current_track;
+ private bool _finished;
+
+ public delegate void ProgressCallBack(IntPtr progres,IntPtr data);
+
+ public Mp3Split (CueSheet s) {
+ int error=0;
+
+ _mp3_state=mp3splt_new_state (out error);
+ error=mp3splt_find_plugins (_mp3_state);
+ Hyena.Log.Information ("mp3splt: find_plugins result:"+error);
+
+ mp3splt_set_int_option(_mp3_state,Mp3SpltOptions.SPLT_OPT_SET_FILE_FROM_CUE_IF_FILE_TAG_FOUND,1);
+ mp3splt_set_int_option(_mp3_state,Mp3SpltOptions.SPLT_OPT_OUTPUT_FILENAMES,(int) SpltOutputFileNamesOptions.SPLT_OUTPUT_FORMAT);
+ mp3splt_set_oformat(_mp3_state,"@A - @b - @n - @t",out error);
+ mp3splt_put_cue_splitpoints_from_file(_mp3_state,s.cueFile (),out error);
+ mp3splt_set_default_genre_tag(_mp3_state,s.genre ());
+
+ int count,ctags;
+ IntPtr pointarray=mp3splt_get_splitpoints(_mp3_state,out count,out error);
+ IntPtr tagarray=mp3splt_get_tags (_mp3_state,out ctags,out error);
+ Hyena.Log.Information ("count="+count+", ctags="+ctags);
+
+ {
+ int i;
+ _tracks.Clear ();
+ int N=(count<ctags) ? count : ctags;
+ for(i=0;i<N;i++) {
+ _tracks.Add (new Mp3SplitTrack(pointarray,tagarray,i));
+ }
+ }
+ }
+
+ public void SplitWithPaths() {
+ int error=0;
+ mp3splt_set_int_option(_mp3_state,Mp3SpltOptions.SPLT_OPT_CREATE_DIRS_FROM_FILENAMES,1);
+ mp3splt_set_oformat(_mp3_state,"@A/@b/@n @t",out error);
+ }
+
+ public int ProgressCurrentTrack {
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ get { return _progress_current_track; }
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ set { _progress_current_track = value; }
+ }
+
+ public int ProgressNTracks {
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ get { return _progress_n_tracks; }
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ set { _progress_n_tracks = value; }
+ }
+
+ public float ProgressOfCurrentTrack {
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ get { return _progress_of_current_track; }
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ set { _progress_of_current_track = value; }
+ }
+
+ public bool SplitFinished {
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ get { return _finished; }
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ set { _finished = value; }
+ }
+
+
+ public void Progress(IntPtr progr,IntPtr data) {
+ splt_progres pr=(splt_progres) Marshal.PtrToStructure (progr,typeof(splt_progres));
+ this.ProgressCurrentTrack=pr.current_split;
+ this.ProgressNTracks=pr.max_splits;
+ this.ProgressOfCurrentTrack=pr.percent_progress;
+ }
+
+ private void Splitter() {
+ int result=mp3splt_split (_mp3_state);
+ SplitFinished=true;
+ Hyena.Log.Information ("splitresult="+result);
+ }
+
+ public void SplitToDir(string directory) {
+
+ mp3splt_set_path_of_split(_mp3_state,directory);
+ mp3splt_set_progress_function (_mp3_state,new ProgressCallBack(Progress),IntPtr.Zero);
+ SplitFinished=false;
+ Thread split_thread=new Thread(new ThreadStart(Splitter));
+ split_thread.Start ();
+ Hyena.Log.Information ("thread:"+split_thread);
+ //Hyena.Log.Information ("split-to-dir: result="+result);
+ }
+
+ #region IDisposable implementation
+ public void Dispose ()
+ {
+ int error=0;
+ mp3splt_free_state(_mp3_state,out error);
+ Hyena.Log.Information ("mp3splt-free-state error="+error);
+ }
+ #endregion
+
+ public static bool IsSupported(string file) {
+ if (Regex.IsMatch (file,"[.][Mm][Pp][3]$") ||
+ Regex.IsMatch (file,"[.][Oo][Gg][Gg]$")) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void LogResult(int res) {
+ if (res<0) {
+ Hyena.Log.Error ("mp3splt: error="+res+", "+mp3splt_get_strerror(_mp3_state,res));
+ } else {
+ Hyena.Log.Information ("mp3splt: result="+res+", "+mp3splt_get_strerror(_mp3_state,res));
+ }
+ }
+
+ private static int _dll_present=0;
+
+ public static bool DllPresent() {
+ if (_dll_present==0) {
+ Hyena.Log.Information ("Checking presence of libmp3splt");
+ try {
+ string version=mp3splt_get_version();
+ Hyena.Log.Information ("libmp3splt found. Good thing. Version present: "+version);
+ _dll_present=1;
+ return true;
+ } catch (System.DllNotFoundException ex) {
+ Hyena.Log.Error("libmp3splt not present on this system");
+ Hyena.Log.Information (ex.ToString ());
+ _dll_present=-1;
+ return false;
+ }
+ } else {
+ return _dll_present>0;
+ }
+ }
+
+ public static string mp3splt_get_version() {
+ StringBuilder version=new StringBuilder(20);
+ mp3splt_get_version (version);
+ return version.ToString ();
+ }
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern IntPtr mp3splt_get_version(StringBuilder dest);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern IntPtr mp3splt_new_state(out int error);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern void mp3splt_free_state(IntPtr state,out int error);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern void mp3splt_put_cue_splitpoints_from_file(IntPtr state,string cuefile,out int err);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern string mp3splt_get_filename_to_split(IntPtr state);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern string mp3splt_get_strerror(IntPtr state, int error_code);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern void mp3splt_set_int_option(IntPtr state,Mp3SpltOptions op,int val);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern int mp3splt_set_default_genre_tag(IntPtr state, string default_genre_tag);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern void mp3splt_export_to_cue(IntPtr state, string out_file, short stop_at_total_time, out int error);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern IntPtr mp3splt_get_splitpoints(IntPtr state,out int count,out int err);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern IntPtr mp3splt_get_tags(IntPtr state,out int tags_number, out int error);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern void mp3splt_set_oformat(IntPtr state,string format_string,out int error);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern int mp3splt_set_path_of_split(IntPtr state, string path);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern int mp3splt_set_progress_function(IntPtr state,ProgressCallBack callback,IntPtr cb_data);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern int mp3splt_split(IntPtr state);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern int mp3splt_stop_split(IntPtr state);
+
+ [DllImport ("libmp3splt.dll")]
+ private static extern int mp3splt_find_plugins(IntPtr state);
+
+ }
+
+}
+
diff --git a/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs
new file mode 100644
index 0000000..b6f3414
--- /dev/null
+++ b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Runtime.InteropServices;
+using Mono.Unix;
+using System.Text.RegularExpressions;
+using System.Collections.Generic;
+
+namespace Banshee.CueSheets
+{
+ [StructLayout(LayoutKind.Sequential)]
+ struct SpltPoint {
+ public long val;
+ public IntPtr name;
+ public int type;
+ };
+
+ [StructLayout(LayoutKind.Sequential)]
+ struct Tag {
+ public IntPtr title;
+ public IntPtr artist;
+ public IntPtr album;
+ public IntPtr performer;
+ public IntPtr year;
+ public IntPtr comment;
+ public int track;
+ public IntPtr genre;
+ public int tags_version;
+ public int set_original_tags;
+ };
+
+ public class Mp3SplitTrack
+ {
+ private IntPtr _points;
+ private SpltPoint _splitpoint;
+ private Tag _tag;
+ private int _index;
+ private string _splitname;
+
+ public Mp3SplitTrack (IntPtr splitpoints,IntPtr tags,int index) {
+ _index=index;
+ _points=splitpoints;
+ _splitpoint=(SpltPoint) Marshal.PtrToStructure (_points+Marshal.SizeOf(_splitpoint)*index,typeof(SpltPoint));
+ _tag=(Tag) Marshal.PtrToStructure(tags+Marshal.SizeOf (_tag)*index,typeof(Tag));
+ _splitname=(string) Marshal.PtrToStringAnsi (_splitpoint.name);
+ }
+
+ public string TrackName {
+ get { return _splitname; }
+ }
+
+ public int TrackIndex {
+ get { return _index; }
+ }
+
+ public double OffsetInSeconds {
+ get { return ((double) _splitpoint.val)/100.0; }
+ }
+
+ public string Album {
+ get { return (string) Marshal.PtrToStringAnsi (_tag.album); }
+ }
+
+ public string Title {
+ get { return (string) Marshal.PtrToStringAnsi (_tag.title); }
+ }
+
+ public string Performer {
+ get { return (string) Marshal.PtrToStringAnsi (_tag.performer); }
+ }
+
+ public string Artist {
+ get { return (string) Marshal.PtrToStringAnsi (_tag.artist); }
+ }
+
+ public int TrackNumber {
+ get { return _tag.track; }
+ }
+
+ public string Genre {
+ get { return (string) Marshal.PtrToStringAnsi (_tag.genre); }
+ }
+
+ public override string ToString() {
+ return "nr="+TrackNumber+"album="+Album+",title="+Title+",performer="+Performer+", offset="+OffsetInSeconds+
+ "name="+TrackName;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/CueSheets/CueSheets.csproj b/src/CueSheets/CueSheets.csproj
index 207c57a..3c1cecf 100644
--- a/src/CueSheets/CueSheets.csproj
+++ b/src/CueSheets/CueSheets.csproj
@@ -109,6 +109,10 @@
<Compile Include="Banshee.CueSheets\Tools\Tools.cs" />
<Compile Include="Banshee.CueSheets\Data\CS_TrackInfoDb.cs" />
<Compile Include="Banshee.CueSheets\Version\CS_Info.cs" />
+ <Compile Include="Banshee.CueSheets\mp3splt\Mp3Split.cs" />
+ <Compile Include="Banshee.CueSheets\Gui\MusicToDevice.cs" />
+ <Compile Include="Banshee.CueSheets\mp3splt\Mp3SplitTrack.cs" />
+ <Compile Include="Banshee.CueSheets\Gui\Actions.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
@@ -133,5 +137,10 @@
<Folder Include="Banshee.CueSheets\Model\" />
<Folder Include="Banshee.CueSheets\Tools\" />
<Folder Include="Banshee.CueSheets\Version\" />
+ <Folder Include="Banshee.CueSheets\mp3splt\" />
+ <Folder Include="Resources\" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Resources\GlobalUI.xml" />
</ItemGroup>
</Project>
diff --git a/src/CueSheets/Makefile.am b/src/CueSheets/Makefile.am
index f62cecc..a23d478 100644
--- a/src/CueSheets/Makefile.am
+++ b/src/CueSheets/Makefile.am
@@ -10,18 +10,22 @@ SOURCES = \
Banshee.CueSheets/Data/CS_ComposerInfo.cs \
Banshee.CueSheets/Data/CS_TrackInfoDb.cs \
Banshee.CueSheets/Data/GenreInfo.cs \
+ Banshee.CueSheets/Gui/Actions.cs \
Banshee.CueSheets/Gui/ComposerListView.cs \
Banshee.CueSheets/Gui/CueSheetEditor.cs \
Banshee.CueSheets/Gui/CueSheetsPrefs.cs \
Banshee.CueSheets/Gui/GenreListView.cs \
+ Banshee.CueSheets/Gui/MusicToDevice.cs \
Banshee.CueSheets/Model/CS_AlbumModel.cs \
Banshee.CueSheets/Model/CS_ArtistModel.cs \
Banshee.CueSheets/Model/CS_ComposerModel.cs \
Banshee.CueSheets/Model/CS_GenreModel.cs \
+ Banshee.CueSheets/mp3splt/Mp3Split.cs \
+ Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs \
Banshee.CueSheets/Tools/Loosely.cs \
Banshee.CueSheets/Tools/Tools.cs \
Banshee.CueSheets/Version/CS_Info.cs
-RESOURCES = CueSheets.addin.xml
+RESOURCES = CueSheets.addin.xml Resources/GlobalUI.xml
include $(top_srcdir)/build/build.mk
diff --git a/src/CueSheets/Resources/GlobalUI.xml b/src/CueSheets/Resources/GlobalUI.xml
new file mode 100644
index 0000000..cc156a7
--- /dev/null
+++ b/src/CueSheets/Resources/GlobalUI.xml
@@ -0,0 +1,6 @@
+<ui>
+ <popup action="CueSheetsPopup">
+ <menuitem action="Synchronize" />
+ <menuitem name="SourcePreferences" action="SourcePreferencesAction"/>
+ </popup>
+</ui>
diff --git a/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj b/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj
index 47b2fad..3e3e409 100644
--- a/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj
+++ b/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj
@@ -11,7 +11,6 @@
<ProjectGuid>{C6F7D7EA-0245-4A29-AC8E-714E1677F0FC}</ProjectGuid>
<RootNamespace>Banshee.Telepathy</RootNamespace>
<AssemblyOriginatorKeyFile>.</AssemblyOriginatorKeyFile>
- <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -67,7 +66,9 @@
<Package>banshee-thickclient</Package>
<SpecificVersion>False</SpecificVersion>
</Reference>
- <Reference Include="dbus-sharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5675b0c3093115b5" />
+ <Reference Include="dbus-sharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5675b0c3093115b5">
+ <Package>dbus-sharp-1.0</Package>
+ </Reference>
<Reference Include="Hyena.Data.Sqlite, Version=2.0.0.0, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<Package>banshee-hyena-data-sqlite</Package>