デバイス(SetupApi)
WaveIO7ライブラリを作って、Kernel Streamingでは SetupDi... を使うことを知りました。
これは、録音再生の機能とは直接関係なく、一般的なデバイスやドライバの登録や操作の方法のようです。
また、Machine引数があり、リモートに対しても機能するようです。
DevCon
WDKのサンプルプログラムに devcon があります。これは「デバイスマネージャ」と同じ機能を持つ コンソールアプリケーションです。
-
「デバイスマネージャ」の情報表示機能
デバイスの列挙、ドライバの詳細で表示される構成ファイル一覧、リソースなど
-
有効無効の切り替え
-
ドライバのインストール、アンインストール
-
再起動
Kernel Streaming での使い方の差
「デバイスマネージャ」では、SetupDiBuildClassInfoList() が最初の列挙で、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class 以下を列挙します。
「デバイスマネージャ」の最初のリストビューと同じ内容が列挙でき、"MEDIA"のGuid を使って SetupDiGetClassDevs() を呼び出すとサウンドデバイスが開けます。
Kernel Streaming では、CreateFile()で使用するデバイスパスを得るのに、カテゴリを表す Guid を使って SetupDiGetClassDevs() を呼び出します。
この Guid は、KsMedia.h ファイルに定義されたものを使いました。
カテゴリは、デバイス一般の話しではなく、AVストリーミングの話しなので、同じ関数を使うことが、すこし不思議です。
たとえば、KsMedia.h ファイルに定義されたキャプチャ・カテゴリを表す Guid は、Classと並列の位置にある、MediaCategories にあります。ここには、226 あり、KsMedia.h ファイルの36よりたくさんあります。また、HKEY_CLASSES_ROOT\CLSID、HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID にある ActiveMovie Filter CategoriesのGUID の下の Instance にもあります。こちらは、33 あります。
SetupDiGetClassDevs() 説明では、「device setup class」か 「device interface class」のGuidを指定するとあるので以下のように解釈しました。
SetupDiBuildClassInfoList() が列挙するのが、「device setup class」。
Kernel Streaming で使われる、カテゴリ(MediaCategories)は「device interface class」の一種。
どちらを探すかは、指定が必要で、SetupDiGetClassDevs() の引数のDIGCF_DEVICEINTERFACEで区別される。
実際には、KsMedia.h ファイルに定義されたもの以外が必要だとは思いませんが、カテゴリを列挙する方法はあるのでしょうか。
これは、単純ではないようです。関係するのは、Instance、MediaCategories と言ったエントリーのようですが単純には一致しません。
以下のようなプログラムで、KSCATEGORY と Instance の差異を書き出してみます。
- static void Print(Guid guid)
- {
- RegistryKey localMachine = Registry.LocalMachine;
- RegistryKey subKey = localMachine.OpenSubKey(
- @"SOFTWARE\Classes\CLSID\{DA4E3DA0-D07D-11d0-BD50-00A0C911CE86}\Instance\{"
- + guid.ToString() + "}");
- if(subKey==null)
- Debug.WriteLine(guid);
- else
- Debug.WriteLine(guid + " " + subKey.GetValue("FriendlyName"));
- }
- static Guid[] GetRegGuids(string key)
- {
- RegistryKey localMachine = Registry.LocalMachine;
- RegistryKey target = localMachine.OpenSubKey(key);
- string[] guids_str = target.GetSubKeyNames();// 文字列
- Guid[] guids = new Guid[guids_str.Length];// Guidに
- for (int i = 0; i < guids.Length; i++)
- guids[i] = new Guid(guids_str[i]);
- return guids;
- }
- static void Main(string[] args)
- {
- Guid[] instance_guids = GetRegGuids(
- @"SOFTWARE\Classes\CLSID\{DA4E3DA0-D07D-11d0-BD50-00A0C911CE86}\Instance");
- Debug.WriteLine("KSCATEGORYとInstanceに共通にあるもの");
- IEnumerable<Guid> ks
- = KsAudio.FilterEnum.AllCategories.Intersect(instance_guids);
- foreach (Guid guid in ks)
- Debug.WriteLine(guid + " " + KsAudio.KsMedia.CategoryName(guid));
- Debug.WriteLine("KSCATEGORYだけ");
- ks
- = KsAudio.FilterEnum.AllCategories.Except(instance_guids);
- foreach (Guid guid in ks)
- Debug.WriteLine(guid + " " + KsAudio.KsMedia.CategoryName(guid));
- Debug.WriteLine("Instanceだけ");
- ks
- = instance_guids.Except(KsAudio.FilterEnum.AllCategories);
- foreach (Guid guid in ks)
- Print(guid);
- }
結果は、以下のです。
- KSCATEGORYとInstanceに共通にあるもの
- 65e8773d-8f56-11d0-a3b9-00a0c9223196 CAPTURE
- 65e8773e-8f56-11d0-a3b9-00a0c9223196 RENDER
- ad809c00-7b88-11d0-a5d6-28db04c10000 MIXER
- 0a4252a0-7e70-11d0-a5d6-28db04c10000 SPLITTER
- 2721ae20-7e70-11d0-a5d6-28db04c10000 DATADECOMPRESSOR
- 2eb07ea0-7e70-11d0-a5d6-28db04c10000 DATATRANSFORM
- fbf6f530-07b9-11d2-a71e-0000f8004788 AUDIO_DEVICE
- a799a800-a46d-11d0-a18c-00a02401dcd4 TVTUNER
- a799a801-a46d-11d0-a18c-00a02401dcd4 CROSSBAR
- a799a802-a46d-11d0-a18c-00a02401dcd4 TVAUDIO
- 07dad660-22f1-11d1-a9f4-00c04fbbde8f VBICODEC
- 19689bf6-c384-48fd-ad51-90e58c79f70b ENCODER
- 7a5de1d3-01a1-452c-b481-4fa2b96271e8 MULTIPLEXER
- KSCATEGORYだけ
- 085aff00-62ce-11cf-a5d6-28db04c10000 BRIDGE
- 1e84c900-7e70-11d0-a5d6-28db04c10000 DATACOMPRESSOR
- 6994ad04-93ef-11d0-a3cc-00a0c9223196 AUDIO
- 6994ad05-93ef-11d0-a3cc-00a0c9223196 VIDEO
- eb115ffc-10c8-4964-831d-6dcb02e6f23f REALTIME
- 6994ad06-93ef-11d0-a3cc-00a0c9223196 TEXT
- 67c9cc3c-69c4-11d2-8759-00a0c9223196 NETWORK
- dda54a40-1e4c-11d1-a050-405705c10000 TOPOLOGY
- 3503eac4-1f26-11d1-8ab0-00a0c9223196 VIRTUAL
- bf963d80-c559-11d0-8a2b-00a0c9255ac1 ACOUSTIC_ECHO_CANCEL
- a7c7a5b1-5af3-11d1-9ced-00a024bf0407 SYSAUDIO
- 3e227e76-690d-11d2-8161-0000f8775bf1 WDMAUD
- 9baf9572-340c-11d3-abdc-00a0c90ab16f AUDIO_GFX
- 9ea331fa-b91b-45f8-9285-bd2bc77afcde AUDIO_SPLITTER
- d6c5066e-72c1-11d2-9755-0000f8004788 PREFERRED_WAVEOUT_DEVICE
- d6c50671-72c1-11d2-9755-0000f8004788 PREFERRED_WAVEIN_DEVICE
- d6c50674-72c1-11d2-9755-0000f8004788 PREFERRED_MIDIOUT_DEVICE
- 47a4fa20-a251-11d1-a050-0000f8004788 WDMAUD_USE_PIN_NAME
- 74f3aea8-9768-11d1-8e07-00a0c95ec22e ESCALANTE_PLATFORM_DRIVER
- a799a803-a46d-11d0-a18c-00a02401dcd4 VPMUX
- 830a44f2-a32d-476b-be97-42845673b35a MICROPHONE_ARRAY_PROCESSOR
- Instanceだけ
- 083863f1-70de-11d0-bd40-00a0c911ce86 DirectShow Filters
- 33d9a760-90c8-11d0-bd43-00a0c911ce86 Video Compressors
- 33d9a761-90c8-11d0-bd43-00a0c911ce86 Audio Compressors
- 33d9a762-90c8-11d0-bd43-00a0c911ce86 Audio Capture Sources
- 4a56af32-c21f-11db-96fa-005056c00008 PBDA CP Filters
- 4efe2452-168a-11d1-bc76-00c04fb9453b Midi Renderers
- 71985f48-1ca1-11d3-9cc8-00c04f7971e0 BDA Source Filters
- 71985f4a-1ca1-11d3-9cc8-00c04f7971e0 BDA Rendering Filters
- 71985f4b-1ca1-11d3-9cc8-00c04f7971e0 BDA Network Providers
- 860bb310-5d01-11d0-bd3b-00a0c911ce86 Video Capture Sources
- 9c24a977-0951-451a-8006-0e49bd28cd5f Multi-Instance Capable VBI Codecs
- a2e3074f-6c3d-11d3-b653-00c04f79498e BDA Transport Information Renderers
- c4c4c4fc-0049-4e2b-98fb-9537f6ce516d BDA CP/CA Filters
- cc7bfb41-f175-11d1-a392-00e0291f3959 External Renderers
- cc7bfb46-f175-11d1-a392-00e0291f3959 Device Control Filters
- cf1dda2c-9743-11d0-a3ee-00a0c9223196 WDM Streaming Communication Transforms
- cf1dda2d-9743-11d0-a3ee-00a0c9223196 WDM Streaming Interface Transforms
- e0f158e1-cb04-11d0-bd4e-00a0c911ce86 Audio Renderers
- ed34623a-4e73-401b-b16a-21771f14be2b UPnP Streaming Devices
- fd0a5af4-b41d-11d2-9c95-00c04f7971e0 BDA Receiver Components
以下のことが結論です。
-
SetupDiBuildClassInfoList() で列挙される Guid ですべてのデバイスを参照できる。
-
そのうち、”MEDIA”か、その Guid を既知のものすれば、サウンドにアクセスできる。(デバイスパスを取得できる)
-
あるいは、レンダー、キャプチャのGuidを既知とすれば、サウンドにアクセスできる。(デバイスパスを取得できる)
-
また、Instance のFriendlyNameを見ると、DirectShowのフィルタの列挙のようだ。
-
キャプチャには、AudioとVideoがあるが、区別の仕方がわからない。
取得できるデータのメンバを見ると、ClassGuid と InterfaceClassGuid がある。
AUDIOカテゴリとCAPTUREカテゴリで検索した結果のClassGuidの集合の共通にあるもの(積)を取れば良さそうだ。
-
DevConでは、同じ値をレジストリから参照して比較したりしている。デバイスパスの参照以外のことをするつもりなら不整合があることに注意が必要と言うことだと思う。
|