/// <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); } }
/// <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; } }