カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

ウェーブデバイスを列挙する(.NET C#バージョン)

このセクションでは、C#.NET環境下でウェーブデバイスを列挙する手順について解説します。

利用する関数は、以下の二つです。

waveOutGetNumDevs

コンピュータに実装されている再生デバイスの数を取得します。以下にプラットフォーム呼び出しの宣言を示します。

    [DllImport ("winmm.dll", SetLastError=true)]
    static extern int waveOutGetNumDevs();

waveOutGetDevCaps

デバイスについて詳細な情報を得ます。

    [DllImport ("winmm.dll", SetLastError=true, CharSet=CharSet.Auto)]
    static extern int waveOutGetDevCaps(int uDeviceID, ref WaveOutCaps pwoc, int cbwoc);

uDeviceID

デバイスを識別するID番号です。ゼロからwaveOutGetNumDevs関数で取得した数値-1までの整数が有効です。またデフォルトデバイスを示す「WaveMapper」(値は-1)を指定することができます。

pwoc

デバイスについて情報を格納するための構造体「WaveOutCaps」への参照です。

WaveOutCaps構造体の定義を以下に示します。

    [StructLayout(LayoutKind.Sequential, Pack=2, CharSet=CharSet.Auto)]
    struct WaveOutCaps
    {
        public short    wMid;
        public short    wPid;
        public uint     vDriverVersion;
        // 32 : max product name length (including NULL)
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
        public string   szPname;
        public int      dwFormats;
        public short    wChannels;
        public short    wReserved1;
        public int      dwSupport;
    }

ここで注意が必要な変数は「szPname」です。NULLで終端する文字列は、マーシャリングするとstringに変換されます。

cbwoc

WaveOutCaps構造体のサイズを指定します。構造体のサイズは、以下の式で取得します。

Marshal.SizeOf(typeof(WaveOutCaps))

デバイスリストを取得する

ここで再生デバイスのリストを取得するコード例を示します。このプログラムは、デバイス名とデバイスIDをメンバーとするDeviceItemクラスのリストを戻します。先頭にはウェーブマッパーを入れてあります。

    public const int    WaveMapper = -1;

    public int NumDevs
    {
        get { return waveOutGetNumDevs(); }
    }

    public List<DeviceItem> GetDeviceList()
    {
        List<DeviceItem> deviceList = new List<DeviceItem>();
        WaveOutCaps waveOutCaps = new WaveOutCaps();

        DeviceItem item = new DeviceItem();
        item.Name = "Wave Mapper";
        item.ID = WaveMapper;
        deviceList.Add(item);

        for (int id=0; id<NumDevs; id++)
        {
            int ret = waveOutGetDevCaps(
                id, ref waveOutCaps, Marshal.SizeOf(typeof(WaveOutCaps)));

            item = new DeviceItem();
            item.Name = (ret == MmSysErr.NoError) ? waveOutCaps.szPname : "No Name";
            item.ID = id;
            deviceList.Add(item);
        }
        return deviceList;
    }

DeviceItemクラスは、デバイス名とデバイスIDを保持します。

    public class DeviceItem
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ