using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.IO; using System.Reflection; namespace mp3infp { /* * C# から mp3infp を使うためのクラスライブラリ * 2010. 5. 3 / 月影とも * * Win32工作小屋 様の mp3infp をC#から使うためのライブラリです。 * License: NYSL (煮るなり焼くなり好きにしろライセンス) * * 簡単な使い方は Example クラス見てください。 * * いかなる損害にも責任追いません。 * 一応の連絡先: http://tu3.jp/ */ #if COMPILE_EXAMPLE /// /// 使用例 /// static class Example { /// /// タグ情報を読み込んで表示してみる。 /// public static void ShowTitleAndArtist() { // タグ情報を読み込んで表示してみる。 Environment.CurrentDirectory = @"E:/Music"; TagInfo tag1 = MP3infp.LoadTag(@"[丹下桜] SAKURA/14. New Frontier.mp3"); Console.WriteLine(tag1.Title + " / " + tag1.Artist); } /// /// ID3v2 タグを ID3v1タグにコピーしてみる /// public static void CopyID3TagFromV1ToV2() { // ID3v2 タグを ID3v1タグにコピーしてみる MP3infp mp3infp = new MP3infp(@"E:/Music/[水樹奈々] PHANTOM MINDS/02. Don't be long.mp3"); TagInfo tag_v2 = mp3infp.LoadTag(); // なかったら作る if (!mp3infp.ContainsMP3Tag(MP3infp.MP3TagType.ID3v1)) mp3infp.AddMP3Tag(MP3infp.MP3TagType.ID3v1); TagInfo tag_v1 = mp3infp.LoadTag(); // コピー元とコピー先で共通して有効な項目のみコピーされます。 TagInfo.Copy(tag_v2, tag_v1); tag_v1.Save(); } } #endif /// /// mp3infp.dll を使用してメディアファイルのタグ操作を提供します。 /// public class MP3infp { #region static /// /// Mp3Infpが利用可能かどうかを取得します。 /// public static bool Available { get { return System.IO.File.Exists("mp3infp.dll"); } } /// /// バージョン番号を取得します。 /// public static int Version { get { return NaitiveAPI.GetVer(); } } /// /// タグ情報をロードします。 /// /// ファイル名 static void LoadFile(string path) { if (!File.Exists(path)) throw new FileNotFoundException("指定されたファイルが見つかりません", path); NaitiveAPI.Load(IntPtr.Zero, Path.GetFullPath(path)); } /// /// ファイルの種類を判定します。 /// /// ファイル名 /// ファイルの種類 public static MediaFileType GetFileType(string path) { LoadFile(path); return NaitiveAPI.GetFileType(); } /// /// ファイルが指定の種類のファイルであるかどうかを判断します。 /// /// ファイル名 /// 種類 /// 等しい場合 true public static bool IsFileType(string path, MediaFileType t) { return (GetFileType(path) == t); } /// /// MP3ファイルに格納されているタグの種類を取得します。 /// /// /// public static MP3TagType GetAvailableMP3TagType(string path) { LoadFile(path); MP3TagType t = MP3TagType.None; NaitiveAPI.MP3TagType n = NaitiveAPI.GetTagType(); if ((n & NaitiveAPI.MP3TagType.ID3V1) > 0) t |= MP3TagType.ID3v1; if ((n & NaitiveAPI.MP3TagType.ID3V2) > 0) t |= MP3TagType.ID3v2; if ((n & NaitiveAPI.MP3TagType.RIFFSIF) > 0) t |= MP3TagType.RIFFSIF; if ((n & (NaitiveAPI.MP3TagType.APEV1 | NaitiveAPI.MP3TagType.APEV2)) > 0) t |= MP3TagType.APE; return t; } /// /// 指定した形式のMP3タグを作成します。 /// /// ファイル名 /// タグの種類 /// 成功した場合 true public static bool AddMP3Tag(string path, MP3TagType type) { path = Path.GetFullPath(path); LoadFile(path); int error = -1; switch (type) { case MP3TagType.ID3v1: error = NaitiveAPI.MakeId3v1(path); break; case MP3TagType.ID3v2: error = NaitiveAPI.MakeId3v2(path); break; case MP3TagType.RIFFSIF: error = NaitiveAPI.MakeRMP(path); break; case MP3TagType.APE: error = NaitiveAPI.MakeApeTag(path); break; } if (error > 0) throw new System.ComponentModel.Win32Exception(error); return error == 0; } /// /// ファイルが指定した種類のタグを含むかどうかを判断します /// /// ファイル名 /// タグの種類 /// 含む場合 true public static bool ContainsMP3Tag(string path, MP3TagType t) { return ((GetAvailableMP3TagType(path) & t) != 0); } /// /// 指定した形式のMP3タグを削除します。 /// /// ファイル名 /// タグの種類 /// 成功した場合 true public static bool RemoveMP3Tag(string path, MP3TagType type) { path = Path.GetFullPath(path); LoadFile(path); int error = -1; switch (type) { case MP3TagType.ID3v1: error = NaitiveAPI.DelId3v1(path); break; case MP3TagType.ID3v2: error = NaitiveAPI.DelId3v2(path); break; case MP3TagType.RIFFSIF: error = NaitiveAPI.DelRMP(path); break; case MP3TagType.APE: error = NaitiveAPI.DelApeTag(path); break; } if (error > 0) throw new System.ComponentModel.Win32Exception(error); return error == 0; } /// /// プロパティウィンドウを開きます。 /// /// ホストとなるフォーム /// 対象のファイル名 /// trueならばモードレス、falseならばモーダルダイアログとして開きます。 /// public static int OpenPropertyDialog(System.Windows.Forms.Form host, string path, bool modeless) { return NaitiveAPI.ViewPropEx(host != null ? host.Handle : IntPtr.Zero, path, 0, modeless, 0, 0); } /// /// 指定したファイルのタグを読み込みます。 /// /// ファイル名 /// タグ情報 public static TagInfo LoadTag(string path) { switch (GetFileType(path)) { case MediaFileType.MP3: // ID3v2 > APE > RMP > ID3v1 の順で優先。 return (TagInfo)LoadTag(path) ?? (TagInfo)LoadTag(path) ?? (TagInfo)LoadTag(path) ?? (TagInfo)LoadTag(path) ?? new TagImpl.Unknown(path); case MediaFileType.WAV: return LoadTag(path); case MediaFileType.AVI: return LoadTag(path); case MediaFileType.VQF: return LoadTag(path); case MediaFileType.ASF: return LoadTag(path); case MediaFileType.OGG: return LoadTag(path); case MediaFileType.APE: return LoadTag(path); case MediaFileType.MP4: return LoadTag(path); default: return new TagImpl.Unknown(path); } } /// /// 指定したファイルのタグを読み込みます。 /// /// タグの形式。TagInfo.XXXX を指定します。指定した形式のタグが利用可能でない場合はnullが返ります。 /// ファイル名 /// タグ情報 public static T LoadTag(string path) where T : TagInfo { if (typeof(T) == typeof(TagInfo.MP3_ID3v1)) return IsFileType(path, MediaFileType.MP3) && ContainsMP3Tag(path, MP3TagType.ID3v1) ? new TagImpl.MP3_ID3v1(path) as T : null; if (typeof(T) == typeof(TagInfo.MP3_ID3v2)) return IsFileType(path, MediaFileType.MP3) && ContainsMP3Tag(path, MP3TagType.ID3v2) ? new TagImpl.MP3_ID3v2(path) as T : null; if (typeof(T) == typeof(TagInfo.MP3_RiffSIF)) return IsFileType(path, MediaFileType.MP3) && ContainsMP3Tag(path, MP3TagType.RIFFSIF) ? new TagImpl.MP3_RiffSIF(path) as T : null; if (typeof(T) == typeof(TagInfo.MP3_APE)) return IsFileType(path, MediaFileType.MP3) && ContainsMP3Tag(path, MP3TagType.APE) ? new TagImpl.MP3_APE(path) as T : null; if (typeof(T) == typeof(TagInfo.WAV)) return IsFileType(path, MediaFileType.WAV) ? new TagImpl.WAV(path) as T : null; if (typeof(T) == typeof(TagInfo.AVI)) return IsFileType(path, MediaFileType.AVI) ? new TagImpl.AVI(path) as T : null; if (typeof(T) == typeof(TagInfo.VQF)) return IsFileType(path, MediaFileType.VQF) ? new TagImpl.VQF(path) as T : null; if (typeof(T) == typeof(TagInfo.ASF)) return IsFileType(path, MediaFileType.ASF) ? new TagImpl.ASF(path) as T : null; if (typeof(T) == typeof(TagInfo.OGG)) return IsFileType(path, MediaFileType.OGG) ? new TagImpl.OGG(path) as T : null; if (typeof(T) == typeof(TagInfo.APE)) return IsFileType(path, MediaFileType.APE) ? new TagImpl.APE(path) as T : null; if (typeof(T) == typeof(TagInfo.MP4)) return IsFileType(path, MediaFileType.MP4) ? new TagImpl.MP4(path) as T : null; return new TagImpl.Unknown(path) as T; } /// /// タグ情報を読み込みます。 /// /// ファイル名 /// タグ public static void ReloadTagInfo(TagInfo tag) { LoadFile(tag.Path); PropertyInfo[] properties = tag.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var p in properties) { ValueNameAttribute vna = Attribute.GetCustomAttribute(p, typeof(ValueNameAttribute)) as ValueNameAttribute; if (vna != null) { IntPtr ptr; bool success = NaitiveAPI.GetValue(vna.ValueName, out ptr); if (success) p.GetSetMethod(true).Invoke(tag, new object[] { Marshal.PtrToStringAnsi(ptr) }); } } } /// /// タグ情報を保存します。 /// /// ファイル名 /// タグ public static void SaveTagInfo(TagInfo tag) { if (tag is TagInfo.Unknown) throw new MP3infp.Mp3infpException("タグの種類が不明なため保存できません。\nMP3ファイルの場合は、ファイルがタグを含むかどうかを確認し、もしタグを持たない場合はあらかじめAddMP3Tagで作成します。"); LoadFile(tag.Path); PropertyInfo[] properties = tag.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var p in properties) { ValueNameAttribute vna = Attribute.GetCustomAttribute(p, typeof(ValueNameAttribute)) as ValueNameAttribute; if (vna != null && p.GetSetMethod() != null) NaitiveAPI.SetValue(vna.ValueName, p.GetValue(tag, null).ToString()); } int error = NaitiveAPI.Save(tag.Path); if (error > 0) throw new System.ComponentModel.Win32Exception(error); if (error < 0) throw new MP3infp.Mp3infpException("タグの保存中にエラーが発生しました。"); } #endregion #region enum /// /// メディアファイルの種類を表します。 /// public enum MediaFileType { Unknown = 0x00, MP3 = 0x01, WAV = 0x02, AVI = 0x03, VQF = 0x04, ASF = 0x05, // WMA, WMV, etc. OGG = 0x07, APE = 0x08, MP4 = 0x09, } /// /// MP3ファイルのタグの組み合わせを表します。 /// [Flags] public enum MP3TagType { None = 0x0, ID3v1 = 0x1, ID3v2 = 0x2, RIFFSIF = 0x4, APE = 0x8, } #endregion #region inner classes static class TagImpl { public class MP3_ID3v1 : TagInfo.MP3_ID3v1 { public MP3_ID3v1(string path) : base(path) { } } public class MP3_ID3v2 : TagInfo.MP3_ID3v2 { public MP3_ID3v2(string path) : base(path) { } } public class MP3_RiffSIF : TagInfo.MP3_RiffSIF { public MP3_RiffSIF(string path) : base(path) { } } public class MP3_APE : TagInfo.MP3_APE { public MP3_APE(string path) : base(path) { } } public class WAV : TagInfo.WAV { public WAV(string path) : base(path) { } } public class AVI : TagInfo.AVI { public AVI(string path) : base(path) { } } public class VQF : TagInfo.VQF { public VQF(string path) : base(path) { } } public class ASF : TagInfo.ASF { public ASF(string path) : base(path) { } } public class OGG : TagInfo.OGG { public OGG(string path) : base(path) { } } public class APE : TagInfo.APE { public APE(string path) : base(path) { } } public class MP4 : TagInfo.MP4 { public MP4(string path) : base(path) { } } public class Unknown : TagInfo.Unknown { public Unknown(string path) : base(path) { } } } /// /// mp3infp に関するエラーを表します。 /// public class Mp3infpException : Exception { /// /// mp3infp に関するエラーを表します。 /// public Mp3infpException(string message) : base(message) { } } #endregion #region instance /// /// 対象ファイルの名前 /// string path; /// /// mp3infp.dll を使用してメディアファイルのタグ操作を提供します。 /// /// ファイル名 public MP3infp(string path) { this.path = Path.GetFullPath(path); LoadFile(path); } /// /// ファイルの種類を取得します。 /// public MediaFileType FileType { get { return GetFileType(path); } } /// /// MP3ファイルに格納されているタグの種類を取得します。 /// public MP3TagType AvailableMP3TagType { get { return GetAvailableMP3TagType(path); } } /// /// プロパティウィンドウを開きます。 /// /// ホストとなるフォーム /// trueならばモードレス、falseならばモーダルダイアログとして開きます。 /// public int OpenPropertyDialog(System.Windows.Forms.Form host, bool modeless) { return OpenPropertyDialog(host, path, modeless); } /// /// タグを読み込みます。 /// /// タグ情報 public TagInfo LoadTag() { return LoadTag(path); } /// /// 指定した形式のタグを読み込みます。 /// /// タグの形式。TagInfo.XXXX を指定します。利用可能でない場合はnullが返ります。 /// ファイル名 /// タグ情報 public T LoadTag() where T : TagInfo { return LoadTag(path); } /// /// 指定した形式のMP3タグを作成します。 /// /// タグの種類 /// 成功した場合 true public bool AddMP3Tag(MP3TagType type) { return AddMP3Tag(path, type); } /// /// 指定した種類のタグを含むかどうかを判断します /// /// タグの種類 /// 含む場合 true public bool ContainsMP3Tag(MP3TagType t) { return ContainsMP3Tag(path, t); } /// /// 指定した形式のMP3タグを削除します。 /// /// タグの種類 /// 成功した場合 true public bool RemoveMP3Tag(MP3TagType type) { return RemoveMP3Tag(path, type); } #endregion } public abstract class TagInfo { protected TagInfo(string path) { this.Path = path; MP3infp.ReloadTagInfo(this); } public string Path { get; protected set; } [ValueName("FILE")] public virtual string FileName { get; protected set; } [ValueName("FEXT")] public virtual string FileExt { get; protected set; } [ValueName("SIZ1")] public virtual string FileSize { get; protected set; } [ValueName("VFMT")] public virtual string VideoFormat { get; protected set; } [ValueName("AFMT")] public virtual string AudioFormat { get; protected set; } [ValueName("TIME")] public virtual string Duration { get; protected set; } [ValueName("INAM")] public virtual string Title { get; set; } [ValueName("IART")] public virtual string Artist { get; set; } [ValueName("IPRD")] public virtual string Album { get; set; } [ValueName("ICMT")] public virtual string Comment { get; set; } [ValueName("ICRD")] public virtual string CreationDate { get; set; } [ValueName("IGNR")] public virtual string Genre { get; set; } [ValueName("TRACK")] public virtual string TrackNumber { get; set; } [ValueName("ICOP")] public virtual string Copyright { get; set; } public abstract class MP3_ID3v1 : TagInfo { protected MP3_ID3v1(string path) : base(path) { } [ValueName("INAM_v1")] public override string Title { get { return base.Title; } set { base.Title = value; } } [ValueName("IART_v1")] public override string Artist { get { return base.Artist; } set { base.Artist = value; } } [ValueName("IPRD_v1")] public override string Album { get { return base.Album; } set { base.Album = value; } } [ValueName("ICMT_v1")] public override string Comment { get { return base.Comment; } set { base.Comment = value; } } [ValueName("ICRD_v1")] public override string CreationDate { get { return base.CreationDate; } set { base.CreationDate = value; } } [ValueName("IGNR_v1")] public override string Genre { get { return base.Genre; } set { base.Genre = value; } } [ValueName("TRACK_v1")] public override string TrackNumber { get { return base.TrackNumber; } set { base.TrackNumber = value; } } [ValueName("(unsupported)")] public override string Copyright { get { return ""; } set { } } } public abstract class MP3_ID3v2 : TagInfo { protected MP3_ID3v2(string path) : base(path) { } [ValueName("INAM_v2")] public override string Title { get { return base.Title; } set { base.Title = value; } } [ValueName("IART_v2")] public override string Artist { get { return base.Artist; } set { base.Artist = value; } } [ValueName("IPRD_v2")] public override string Album { get { return base.Album; } set { base.Album = value; } } [ValueName("ICMT_v2")] public override string Comment { get { return base.Comment; } set { base.Comment = value; } } [ValueName("ICRD_v2")] public override string CreationDate { get { return base.CreationDate; } set { base.CreationDate = value; } } [ValueName("IGNR_v2")] public override string Genre { get { return base.Genre; } set { base.Genre = value; } } [ValueName("ICOP_v2")] public override string Copyright { get { return base.Copyright; } set { base.Copyright = value; } } [ValueName("TRACK_v2")] public override string TrackNumber { get { return base.TrackNumber; } set { base.TrackNumber = value; } } [ValueName("ISFT_v2")] public virtual string Software { get; set; } [ValueName("OART_v2")] public virtual string OriginalArtist { get; set; } [ValueName("COMP_v2")] public virtual string Composer { get; set; } [ValueName("URL_v2")] public virtual string URL { get; set; } [ValueName("ENC2_v2")] public virtual string Encoder { get; set; } } public abstract class MP3_RiffSIF : TagInfo { protected MP3_RiffSIF(string path) : base(path) { } [ValueName("INAM_rmp")] public override string Title { get { return base.Title; } set { base.Title = value; } } [ValueName("IART_rmp")] public override string Artist { get { return base.Artist; } set { base.Artist = value; } } [ValueName("IPRD_rmp")] public override string Album { get { return base.Album; } set { base.Album = value; } } [ValueName("ICMT_rmp")] public override string Comment { get { return base.Comment; } set { base.Comment = value; } } [ValueName("ICRD_rmp")] public override string CreationDate { get { return base.CreationDate; } set { base.CreationDate = value; } } [ValueName("IGNR_rmp")] public override string Genre { get { return base.Genre; } set { base.Genre = value; } } [ValueName("ICOP_rmp")] public override string Copyright { get { return base.Copyright; } set { base.Copyright = value; } } [ValueName("(unsupported)")] public override string TrackNumber { get { return ""; } set { } } [ValueName("ISFT_rmp")] public virtual string Software { get; set; } [ValueName("ISRC_rmp")] public virtual string Source { get; set; } [ValueName("IENG_rmp")] public virtual string Engineer { get; set; } } public abstract class MP3_APE : TagInfo { protected MP3_APE(string path) : base(path) { } [ValueName("INAM_APE")] public override string Title { get { return base.Title; } set { base.Title = value; } } [ValueName("IART_APE")] public override string Artist { get { return base.Artist; } set { base.Artist = value; } } [ValueName("IPRD_APE")] public override string Album { get { return base.Album; } set { base.Album = value; } } [ValueName("ICMT_APE")] public override string Comment { get { return base.Comment; } set { base.Comment = value; } } [ValueName("ICRD_APE")] public override string CreationDate { get { return base.CreationDate; } set { base.CreationDate = value; } } [ValueName("IGNR_APE")] public override string Genre { get { return base.Genre; } set { base.Genre = value; } } [ValueName("TRACK_APE")] public virtual string Engineer { get; set; } [ValueName("(unsupported)")] public override string TrackNumber { get { return ""; } set { } } [ValueName("(unsupported)")] public override string Copyright { get { return ""; } set { } } } public abstract class WAV : TagInfo { protected WAV(string path) : base(path) { } [ValueName("(unsupported)")] public override string TrackNumber { get { return ""; } set { } } [ValueName("ISFT")] public virtual string Software { get; set; } [ValueName("ISRC")] public virtual string Source { get; set; } [ValueName("IENG")] public virtual string Engineer { get; set; } [ValueName("ISBJ")] public virtual string Title_ISBJ { get; set; } } public abstract class AVI : TagInfo { protected AVI(string path) : base(path) { } [ValueName("(unsupported)")] public override string Album { get { return ""; } set { } } [ValueName("(unsupported)")] public override string TrackNumber { get { return ""; } set { } } [ValueName("ISFT")] public virtual string Software { get; set; } [ValueName("ISRC")] public virtual string Source { get; set; } [ValueName("IENG")] public virtual string Engineer { get; set; } [ValueName("ISBJ")] public virtual string Title_ISBJ { get; set; } [ValueName("AVIV")] public virtual string AVIVersion { get; protected set; } } public abstract class VQF : TagInfo { protected VQF(string path) : base(path) { } [ValueName("(unsupported)")] public override string Album { get { return ""; } set { } } [ValueName("(unsupported)")] public override string CreationDate { get { return ""; } set { } } [ValueName("(unsupported)")] public override string Genre { get { return ""; } set { } } } public abstract class ASF : TagInfo { protected ASF(string path) : base(path) { } [ValueName("URL1")] public virtual string AlbumURL { get; set; } [ValueName("URL2")] public virtual string URL { get; set; } } public abstract class OGG : TagInfo { protected OGG(string path) : base(path) { } [ValueName("(unsupported)")] public override string Copyright { get { return ""; } set { } } } public abstract class APE : TagInfo { protected APE(string path) : base(path) { } [ValueName("(unsupported)")] public override string Copyright { get { return ""; } set { } } } public abstract class MP4 : TagInfo { protected MP4(string path) : base(path) { } [ValueName("TRACK1")] public override string TrackNumber { get { return base.TrackNumber; } set { base.TrackNumber = value; } } [ValueName("(unsupported)")] public override string Copyright { get { return ""; } set { } } [ValueName("TRACK2")] public virtual string TrackNumberDenom { get; set; } [ValueName("DISC1")] public virtual string DiscNumber { get; set; } [ValueName("DISC2")] public virtual string DiscNumberDenom { get; set; } [ValueName("BPM")] public virtual string BPM { get; set; } [ValueName("COMPILATION")] public virtual string Compilation { get; set; } [ValueName("TOOL")] public virtual string Software { get; set; } [ValueName("IGRP")] public virtual string Groupe { get; set; } [ValueName("COMPOSER")] public virtual string Composer { get; set; } } public abstract class Unknown : TagInfo { protected Unknown(string path) : base(path) { } } /// /// タグ情報を保存します。 /// public virtual void Save() { MP3infp.SaveTagInfo(this); } /// /// タグ間の共通項目をコピーします /// /// コピー元タグ /// コピー先タグ public static void Copy(TagInfo source, TagInfo destination) { PropertyInfo[] properties = source.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var p in properties) { PropertyInfo d = destination.GetType().GetProperty(p.Name, BindingFlags.Public | BindingFlags.Instance); if (d != null && d.GetSetMethod(false) != null) d.GetSetMethod(true).Invoke(destination, new object[] { p.GetValue(source, null), }); } } public override string ToString() { PropertyInfo[] properties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); List propertyList = new List(); foreach (var p in properties) { ValueNameAttribute vna = Attribute.GetCustomAttribute(p, typeof(ValueNameAttribute)) as ValueNameAttribute; if (vna != null && p.GetValue(this, null).ToString() != "") propertyList.Add("" + p.Name + "=\"" + p.GetValue(this, null).ToString() + "\", "); } StringBuilder sb = new StringBuilder(); propertyList.Sort(); foreach (string s in propertyList) sb.Append(s); return "{ " + sb.ToString() + " }"; } } class NaitiveAPI { [DllImport("mp3infp.dll", EntryPoint = "mp3infp_GetVer", CharSet = CharSet.Ansi)] public static extern int GetVer(); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_ViewPropEx", CharSet = CharSet.Ansi)] public static extern int ViewPropEx(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string szFileName, int dwPage, [MarshalAs(UnmanagedType.Bool)] bool modeless, int param1, int param2); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_Load", CharSet = CharSet.Ansi)] public static extern int Load(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_GetType", CharSet = CharSet.Ansi)] public static extern MP3infp.MediaFileType GetFileType(); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_GetValue", CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetValue([MarshalAs(UnmanagedType.LPStr)] string szValueName, out IntPtr buf); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_GetTagType", CharSet = CharSet.Ansi)] public static extern MP3TagType GetTagType(); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_SetConf", CharSet = CharSet.Ansi)] public static extern int SetConf([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)] string value); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_SetValue", CharSet = CharSet.Ansi)] public static extern int SetValue([MarshalAs(UnmanagedType.LPStr)] string szValueName, [MarshalAs(UnmanagedType.LPStr)] string buf); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_Save", CharSet = CharSet.Ansi)] public static extern int Save([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_MakeId3v1", CharSet = CharSet.Ansi)] public static extern int MakeId3v1([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_DelId3v1", CharSet = CharSet.Ansi)] public static extern int DelId3v1([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_MakeId3v2", CharSet = CharSet.Ansi)] public static extern int MakeId3v2([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_DelId3v2", CharSet = CharSet.Ansi)] public static extern int DelId3v2([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_MakeRMP", CharSet = CharSet.Ansi)] public static extern int MakeRMP([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_DelRMP", CharSet = CharSet.Ansi)] public static extern int DelRMP([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_MakeApeTag", CharSet = CharSet.Ansi)] public static extern int MakeApeTag([MarshalAs(UnmanagedType.LPStr)] string szFileName); [DllImport("mp3infp.dll", EntryPoint = "mp3infp_mp3_DelApeTag", CharSet = CharSet.Ansi)] public static extern int DelApeTag([MarshalAs(UnmanagedType.LPStr)] string szFileName); [Flags] public enum MP3TagType { ID3V1 = 0x00000001, ID3V2 = 0x00000002, RIFFSIF = 0x00000004, ID3V1_0 = 0x00000008, // v2.43~ ID3V1_1 = 0x00000010, // v2.43~ ID3V2_2 = 0x00000020, // v2.43~ ID3V2_3 = 0x00000040, // v2.43~ ID3V2_4 = 0x00000080, // v2.43~ APEV1 = 0x00000100, // v2.47~ APEV2 = 0x00000200, // v2.47~ } } [global::System.AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)] sealed class ValueNameAttribute : Attribute { public ValueNameAttribute(string valueName) { this.ValueName = valueName; } public string ValueName { get; private set; } } }