VBMP3 on C#
Visual BasicでMP3を扱うDLLがあり、C++でも使えるようになっていた。そこでそれをC#に翻訳してみた。タグを扱う部分だけ。C#からDLLを扱う勉強になった。
参考HP
追記 こちらも参考にしてみてくださいmp3infp on C# - notes plastiques
続きにソースを書いてあります。
using System.Runtime.InteropServices; namespace VBMP3 { [StructLayout(LayoutKind.Sequential)] public struct TAG_INFO { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string TrackName, //曲名 ArtistName, //アーティスト名 AlbumName, //アルバム名 Year, //リリース年号 Comment; //コメント文字列 public int genre; //ジャンル [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string GanreName; //ジャンル名称 } [StructLayout(LayoutKind.Sequential)] public struct MPEG_INFO { public int version, //MPEGのバージョン layer, //MPEGのレイヤ crcDisable, //エラー保護 extension, //個人情報 mode, //チャンネルモード copyright, //著作権 original, //オリジナル emphasis, //エンフォシス channels, //出力チャンネル数 bitRate, //ビットレート samplingRate, //サンプリングレート fileSize, //ファイルサイズ flames, //フレーム数 totalSec; //総合演奏時間 } public class VBMP3 { /// <summary> /// 初期化します。 /// </summary> /// <returns>成功/失敗</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_init")] public static extern bool init(); /// <summary> /// 開放します。 /// </summary> /// <returns>成功/失敗</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_free")] public static extern bool free(); /// <summary> /// バージョンを返します。 /// </summary> /// <returns>バージョン</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_getVersion")] public static extern int getVersion(); /// <summary> /// タグ情報書き込み /// </summary> /// <param name="pszName">MP3ファイル名</param> /// <param name="pTagInfo">タグ情報</param> /// <returns>成功/失敗</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_setTagInfo")] public static extern bool setTagInfo(string pszName, ref TAG_INFO pTagInfo); /// <summary> /// タグ情報書き込み /// </summary> /// <param name="pszName">MP3ファイル名</param> /// <param name="pTagInfo">タグ情報</param> /// <param name="tagSet">DLL 内部の TAG 情報書き換えるか</param> /// <returns>成功/失敗</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_setTagInfo")] public static extern bool setTagInfo(string pszName, ref TAG_INFO pTagInfo, bool tagSet); /// <summary> /// タグ情報書き込み /// </summary> /// <param name="pszName">ファイル名</param> /// <param name="pTagInfo">タグ情報</param> /// <param name="tagSet">DLL 内部の TAG 情報書き換えか</param> /// <param name="tagAdd">ID3Tag v1 が存在しないとき追加するか</param> /// <returns>成功/失敗</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_setTagInfo")] public static extern bool setTagInfo(string pszName, ref TAG_INFO pTagInfo, bool tagSet, bool tagAdd); /// <summary> /// ファイル情報取得 /// </summary> /// <param name="pszName">ファイル名</param> /// <param name="pTagInfo">タグ情報</param> /// <param name="pMpegInfo">MPEG情報</param> /// <returns></returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_getFileInfo")] public static extern bool getFileInfo(string pszName, out TAG_INFO pTagInfo, out MPEG_INFO pMpegInfo); /// <summary> /// タグ情報取得 /// </summary> /// <param name="pszName">MP3ファイル名</param> /// <param name="pTagInfo">タグ情報</param> /// <returns>成功/失敗</returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_getFileTagInfo")] public static extern bool getTagInfo(string pszName, out TAG_INFO pTagInfo); /// <summary> /// ファイルの種類取得 /// </summary> /// <param name="pszName">ファイル名</param> /// <returns>以下の内容の合計値 /// 0 標準MP3ファイル /// 1 Riff WAVE形式 /// 2 Riff MP3形式 /// 4 ID3 v2 Tag 有り /// 8 Macヘッダ有り /// 16 ID3 v1 Tag 有り /// </returns> [DllImport("VBMP3.dll", EntryPoint = "vbmp3_getFileType")] public static extern int getFileType(string pszName); } }
使用例。
//using mp3 = VBMP3.VBMP3; //VBMP3.VBMP3とかかずに、mp3と書ける。 //usingはソースのはじめに書くこと! mp3.init(); VBMP3.TAG_INFO pTagInfo; mp3.getTagInfo("愛の夢.mp3",out pTagInfo); pTagInfo.ArtistName = "リスト"; mp3.setTagInfo("愛の夢.mp3", ref pTagInfo); mp3.free();
ID3V1しか扱えないみたいですね・・・