summaryrefslogtreecommitdiff
path: root/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs')
-rw-r--r--src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs276
1 files changed, 276 insertions, 0 deletions
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);
+
+ }
+
+}
+