/// <summary>
        /// デバイス名称リストの指標が変化したとき
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboName_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                PinInfos    = null;
                FormatInfos = null;
                comboPin.Items.Clear();
                comboFormat.Items.Clear();

                Filter_Dispose();

                // フィルタ生成.
                var index      = comboName.SelectedIndex;
                var filterInfo = this.FilterInfos[index];
                this.Filter = Axi.CreateFilter(this.Category, filterInfo.CLSID, filterInfo.Index);

                // ピンの列挙.
                var pinInfos = Axi.GetPinList(this.Filter);

                // 出力ピンの情報のみ抽出します.
                this.PinInfos = pinInfos.FindAll(
                    delegate(CxPinInfo item)
                {
                    return(item.Direction == PIN_DIRECTION.PINDIR_OUTPUT);
                });
                foreach (var item in this.PinInfos)
                {
                    comboPin.Items.Add(item.Name);
                }
                if (comboPin.Items.Count > 0)
                {
                    comboPin.SelectedIndex = 0;
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
示例#2
0
        /// <summary>
        /// フィルタ情報の初期化
        /// </summary>
        void InitializeFilterPairs()
        {
            // [1] フィルタとピンのペア.
            List <FilterPair> filter_pairs = FilterPairs;

            // カテゴリ: GUID.CLSID_VideoInputDeviceCategory
            string category = GUID.CLSID_VideoInputDeviceCategory;

            // フィルタの一覧を取得する.
            List <CxDSFilterInfo> filters = Axi.GetFilterList(category);

            foreach (var filter in filters)
            {
                IBaseFilter capture = null;

                try
                {
                    #region フィルタを生成する.
                    capture = Axi.CreateFilter(category, filter.Name, filter.Index);
                    #endregion

                    #region ピンの一覧を取得する.
                    List <CxDSPinInfo> pins = new List <CxDSPinInfo>();
                    {
                        List <CxDSPinInfo> items = Axi.GetPinList(capture);
                        // 出力ピンのみ抽出する.
                        foreach (var item in items)
                        {
                            if (item.Direction == PIN_DIRECTION.PINDIR_OUTPUT)
                            {
                                pins.Add(item);
                            }
                        }
                    }
                    #endregion

                    #region フォーマットの一覧を取得する.
                    try
                    {
                        // [2] ピンとフォーマットのペア.
                        List <PinPair> pin_pairs = new List <PinPair>();

                        for (int i = 0; i < pins.Count; i++)
                        {
                            CxDSPinInfo pin = pins[i];

                            // 出力ピンを探す.
                            IPin outpin = Axi.FindPin(capture, i, PIN_DIRECTION.PINDIR_OUTPUT);

                            // フォーマットの色空間グループ分け.
                            Dictionary <string, List <CxDSFormatInfo> > groups = new Dictionary <string, List <CxDSFormatInfo> >();

                            // フォーマットの一覧を取得する.
                            List <CxDSFormatInfo> formats = Axi.GetFormatList(outpin);
                            foreach (var format in formats)
                            {
                                if (GUID.Compare(format.FormatType, GUID.FORMAT_VideoInfo) == false)
                                {
                                    continue;
                                }

                                List <CxDSFormatInfo> groups_value = null;
                                if (groups.TryGetValue(format.MediaSubType, out groups_value) == false)
                                {
                                    groups_value = new List <CxDSFormatInfo>();
                                    groups[format.MediaSubType] = (groups_value);
                                }
                                groups_value.Add(format);
                            }

                            // [3] 色空間とフォーマットのペア.
                            List <FormatPair> format_pairs = new List <FormatPair>();

                            // フォーマットを色空間グループ毎に列挙する.
                            foreach (var group in groups)
                            {
                                // 色空間のニックネーム.
                                string nickname = GUID.GetNickname(group.Key);                                  // Key=MediaSubType
                                if (string.IsNullOrEmpty(nickname))
                                {
                                    nickname = "(unknown)";
                                }

                                // [3] 色空間とフォーマットのペア.
                                format_pairs.Add(new FormatPair(nickname, group.Value));
                            }

                            // [2] ピンとフォーマットのペア.
                            pin_pairs.Add(new PinPair(pin, format_pairs));
                        }

                        // [1] フィルタとピンのペア.
                        filter_pairs.Add(new FilterPair(filter, pin_pairs));
                    }
                    catch (System.Exception ex)
                    {
                        Debug.WriteLine(ex.StackTrace);
                    }
                    finally
                    {
                        Axi.ReleaseInstance(capture);
                    }
                    #endregion
                }
                catch (System.Exception ex)
                {
                    Debug.WriteLine(ex.StackTrace);
                }
                finally
                {
                    #region フィルタを解放する.
                    Axi.ReleaseInstance(capture);
                    #endregion
                }
            }

            int index = -1;

            // コンボボックスへの追加.
            comboFilter.Items.Clear();
            for (int i = 0; i < filter_pairs.Count; i++)
            {
                var filter_pair = filter_pairs[i];
                comboFilter.Items.Add(filter_pair.Key.Name);

                if (filter_pair.Key.ContentEquals(this.Backup.FilterInfo))
                {
                    index = i;
                }
            }

            if (0 <= index && index < comboFilter.Items.Count)
            {
                comboFilter.SelectedIndex = index;
            }
        }