CaptureSound Managed その2

1.DirectX9 SDK sample ,CaptureSound Maneged の、最初の画面

パソコン内の、CaptureDevicesを、LIstBoxに列挙するwindowです。

まず、myDirectSoundCapture という projectを、作ります。

続いて、devicesFormという windowを追加します。

もし、devicesForm.Show()を使うと、MainFormも同時に表示されてしまいますので、アウト。

ShowDialog()メソッドを使うべし。

2.DevicesFormに、CaptureDevicesを列挙するには

CaptureDevicesCollectionと、DeviceInformation オブジェクトを、変数にする。

namespace myDirectSoundCapture

{

    public partial class DevicesForm : Form

    {

       public CaptureDevicesCollection devices = new CaptureDevicesCollection();

        public DeviceInformation deviceInfo = new DeviceInformation();

続いて、DevicesForm コンストラクタを記述する。

foreach という、便利なものを使います。

    public DevicesForm()

    {

        InitializeComponent();

        foreach (DeviceInformation info in devices)

        //これのdescriptionを、ListBoxに追加します。

        CaptureDevicelistBox.Items.Add(info.Description);

        CaptureDevicelistBox.SelectedIndex = 0;

     }

このDeviceInformationは、struct 構造体です。

クラスと構造体の違いが、いまいち....

以下のように、定義されています。

namespace Microsoft.DirectX.DirectSound

{

    public struct DeviceInformation

   {

       public string Description { get; }

        public Guid DriverGuid { get; }

        public string ModuleName { get; }

       public override string ToString();

    }

}

DeviceInformation は、なくても、ListBoxに列挙できますが、あるほうが、スマートに記述できますね。

無いとすると

for (int i = 0; i < devices.Count; i++)

    {

CaptureDevicelistBox.Items.Add(devices[i].Description);

    }

てな、具合でしょうか?

3.これだけでは、選択されたdeviceを、MainFormに、渡せない

フォーム内の、OKボタンを押して、deviceを選択するのですが

private void buttonOK_Click(object sender, EventArgs e)

{

    if (0 < CaptureDevicelistBox.Items.Count)

    MainForm.CaptureDeviceGuid = devices[0].DriverGuid;

    Close();

}

(んんっ、実は、ListBox内のdevicesは、列挙だけで、実際には、device[0]しか、選んでない if ( 0<....  )

これは、エラーですね、当然。

んじゃ、MainFormに、CaptureDeviceGuidを、追加しましょう。

    public partial class MainForm : Form

    {

        Guid CaptureDeviceGuid = Guid.Empty;

        public MainForm()

        {

        InitializeComponent();

        DevicesForm devicesForm = new DevicesForm();

 devicesForm.ShowDialog();

        }

当然ですが、それでもエラーが出ます。

devicesFormクラスは、MainFormクラス内の変数には、アクセスできないのですから。

( 初歩的な事ばっかしで、済みません。私は、この教材で、windowsプログラミングの仕組みも、勉強させてもらっております。 )

大体やね、

    devicesformの呼び出し元(親)を、指定してないのですから....

MainFormで、親を指定しましょう。

public partial class MainForm : Form

    {

    public Guid CaptureDeviceGuid = Guid.Empty;    //publicを、付けとかんと、アクセスでけん

    public MainForm()

    {

    InitializeComponent();

    DevicesForm devicesForm = new DevicesForm(this);

    devicesForm.ShowDialog();

    }

}

子windowのDevicesFormに、MainFormのメンバを追加しましょう。

public partial class DevicesForm : Form

    {

        CaptureDevicesCollection devices = new CaptureDevicesCollection();

        public DeviceInformation deviceInfo = new DeviceInformation();

        private MainForm mf = null;

    public DevicesForm()

    {

        InitializeComponent();

そして、DevicesForm コンスタラクタを書き換えましょう。

public DevicesForm(MainForm mf2)

{

    InitializeComponent();

   this.mf = mf2;    //この子の親は、私(MainForm)なんだ....  うーむ、身につまされるなあ....

    /* foreach (DeviceInformation info in devices)

    CaptureDevicelistBox.Items.Add(info.Description);

    CaptureDevicelistBox.SelectedIndex = 0;*/

    for (int i = 0; i < devices.Count; i++)

    {

    CaptureDevicelistBox.Items.Add(devices[i].Description);

    }

そんで、OKボタンを押すと

private void buttonOK_Click(object sender, EventArgs e)

{

    if (0 < CaptureDevicelistBox.Items.Count)

    mf.CaptureDeviceGuid = devices[0].DriverGuid;

    Close();

}

これで、無事、正常にビルドできました、やれやれ (^_^;;

この教材で、1番しんどいのは、Mainプログラムです。

スレッド、Notify、AutoResetEvent とか、私には難しいの、ばっかりです。

これも、分解してやれば、何とか理解できそうな気が....

H.18.6.20