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しか扱えないみたいですね・・・