mikeo_410


 デバイス(SetupApi)

  WaveIO7ライブラリを作って、Kernel Streamingでは SetupDi... を使うことを知りました。
  これは、録音再生の機能とは直接関係なく、一般的なデバイスやドライバの登録や操作の方法のようです。
  また、Machine引数があり、リモートに対しても機能するようです。

DevCon

  WDKのサンプルプログラムに devcon があります。これは「デバイスマネージャ」と同じ機能を持つ コンソールアプリケーションです。

  1. 「デバイスマネージャ」の情報表示機能
    デバイスの列挙、ドライバの詳細で表示される構成ファイル一覧、リソースなど
  2. 有効無効の切り替え
  3. ドライバのインストール、アンインストール
  4. 再起動

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 の差異を書き出してみます。 

  1. static void Print(Guid guid)
  2. {
  3.     RegistryKey localMachine = Registry.LocalMachine;
  4.     RegistryKey subKey = localMachine.OpenSubKey(
  5.         @"SOFTWARE\Classes\CLSID\{DA4E3DA0-D07D-11d0-BD50-00A0C911CE86}\Instance\{" 
  6.         + guid.ToString() + "}");
  7.     if(subKey==null)
  8.         Debug.WriteLine(guid);
  9.     else
  10.         Debug.WriteLine(guid + " " + subKey.GetValue("FriendlyName"));
  11. }
  12. static Guid[] GetRegGuids(string key)
  13. {
  14.     RegistryKey localMachine = Registry.LocalMachine;
  15.     RegistryKey target = localMachine.OpenSubKey(key);
  16.     string[] guids_str = target.GetSubKeyNames();// 文字列
  17.     Guid[] guids = new Guid[guids_str.Length];// Guidに
  18.     for (int i = 0; i < guids.Length; i++)
  19.         guids[i] = new Guid(guids_str[i]);
  20.     return guids;
  21. }
  22. static void Main(string[] args)
  23. {
  24.     Guid[] instance_guids = GetRegGuids(
  25.         @"SOFTWARE\Classes\CLSID\{DA4E3DA0-D07D-11d0-BD50-00A0C911CE86}\Instance");
  26.     Debug.WriteLine("KSCATEGORYとInstanceに共通にあるもの");
  27.     IEnumerable<Guid> ks
  28.         = KsAudio.FilterEnum.AllCategories.Intersect(instance_guids);
  29.     foreach (Guid guid in ks)
  30.         Debug.WriteLine(guid + " " + KsAudio.KsMedia.CategoryName(guid));
  31.     Debug.WriteLine("KSCATEGORYだけ");
  32.     ks
  33.         = KsAudio.FilterEnum.AllCategories.Except(instance_guids);
  34.     foreach (Guid guid in ks)
  35.         Debug.WriteLine(guid + " " + KsAudio.KsMedia.CategoryName(guid));
  36.     Debug.WriteLine("Instanceだけ");
  37.     ks
  38.         = instance_guids.Except(KsAudio.FilterEnum.AllCategories);
  39.     foreach (Guid guid in ks)
  40.         Print(guid);
  41. }

  結果は、以下のです。

  1. KSCATEGORYとInstanceに共通にあるもの
  2. 65e8773d-8f56-11d0-a3b9-00a0c9223196 CAPTURE
  3. 65e8773e-8f56-11d0-a3b9-00a0c9223196 RENDER
  4. ad809c00-7b88-11d0-a5d6-28db04c10000 MIXER
  5. 0a4252a0-7e70-11d0-a5d6-28db04c10000 SPLITTER
  6. 2721ae20-7e70-11d0-a5d6-28db04c10000 DATADECOMPRESSOR
  7. 2eb07ea0-7e70-11d0-a5d6-28db04c10000 DATATRANSFORM
  8. fbf6f530-07b9-11d2-a71e-0000f8004788 AUDIO_DEVICE
  9. a799a800-a46d-11d0-a18c-00a02401dcd4 TVTUNER
  10. a799a801-a46d-11d0-a18c-00a02401dcd4 CROSSBAR
  11. a799a802-a46d-11d0-a18c-00a02401dcd4 TVAUDIO
  12. 07dad660-22f1-11d1-a9f4-00c04fbbde8f VBICODEC
  13. 19689bf6-c384-48fd-ad51-90e58c79f70b ENCODER
  14. 7a5de1d3-01a1-452c-b481-4fa2b96271e8 MULTIPLEXER
  15. KSCATEGORYだけ
  16. 085aff00-62ce-11cf-a5d6-28db04c10000 BRIDGE
  17. 1e84c900-7e70-11d0-a5d6-28db04c10000 DATACOMPRESSOR
  18. 6994ad04-93ef-11d0-a3cc-00a0c9223196 AUDIO
  19. 6994ad05-93ef-11d0-a3cc-00a0c9223196 VIDEO
  20. eb115ffc-10c8-4964-831d-6dcb02e6f23f REALTIME
  21. 6994ad06-93ef-11d0-a3cc-00a0c9223196 TEXT
  22. 67c9cc3c-69c4-11d2-8759-00a0c9223196 NETWORK
  23. dda54a40-1e4c-11d1-a050-405705c10000 TOPOLOGY
  24. 3503eac4-1f26-11d1-8ab0-00a0c9223196 VIRTUAL
  25. bf963d80-c559-11d0-8a2b-00a0c9255ac1 ACOUSTIC_ECHO_CANCEL
  26. a7c7a5b1-5af3-11d1-9ced-00a024bf0407 SYSAUDIO
  27. 3e227e76-690d-11d2-8161-0000f8775bf1 WDMAUD
  28. 9baf9572-340c-11d3-abdc-00a0c90ab16f AUDIO_GFX
  29. 9ea331fa-b91b-45f8-9285-bd2bc77afcde AUDIO_SPLITTER
  30. d6c5066e-72c1-11d2-9755-0000f8004788 PREFERRED_WAVEOUT_DEVICE
  31. d6c50671-72c1-11d2-9755-0000f8004788 PREFERRED_WAVEIN_DEVICE
  32. d6c50674-72c1-11d2-9755-0000f8004788 PREFERRED_MIDIOUT_DEVICE
  33. 47a4fa20-a251-11d1-a050-0000f8004788 WDMAUD_USE_PIN_NAME
  34. 74f3aea8-9768-11d1-8e07-00a0c95ec22e ESCALANTE_PLATFORM_DRIVER
  35. a799a803-a46d-11d0-a18c-00a02401dcd4 VPMUX
  36. 830a44f2-a32d-476b-be97-42845673b35a MICROPHONE_ARRAY_PROCESSOR
  37. Instanceだけ
  38. 083863f1-70de-11d0-bd40-00a0c911ce86 DirectShow Filters
  39. 33d9a760-90c8-11d0-bd43-00a0c911ce86 Video Compressors
  40. 33d9a761-90c8-11d0-bd43-00a0c911ce86 Audio Compressors
  41. 33d9a762-90c8-11d0-bd43-00a0c911ce86 Audio Capture Sources
  42. 4a56af32-c21f-11db-96fa-005056c00008 PBDA CP Filters
  43. 4efe2452-168a-11d1-bc76-00c04fb9453b Midi Renderers
  44. 71985f48-1ca1-11d3-9cc8-00c04f7971e0 BDA Source Filters
  45. 71985f4a-1ca1-11d3-9cc8-00c04f7971e0 BDA Rendering Filters
  46. 71985f4b-1ca1-11d3-9cc8-00c04f7971e0 BDA Network Providers
  47. 860bb310-5d01-11d0-bd3b-00a0c911ce86 Video Capture Sources
  48. 9c24a977-0951-451a-8006-0e49bd28cd5f Multi-Instance Capable VBI Codecs
  49. a2e3074f-6c3d-11d3-b653-00c04f79498e BDA Transport Information Renderers
  50. c4c4c4fc-0049-4e2b-98fb-9537f6ce516d BDA CP/CA Filters
  51. cc7bfb41-f175-11d1-a392-00e0291f3959 External Renderers
  52. cc7bfb46-f175-11d1-a392-00e0291f3959 Device Control Filters
  53. cf1dda2c-9743-11d0-a3ee-00a0c9223196 WDM Streaming Communication Transforms
  54. cf1dda2d-9743-11d0-a3ee-00a0c9223196 WDM Streaming Interface Transforms
  55. e0f158e1-cb04-11d0-bd4e-00a0c911ce86 Audio Renderers
  56. ed34623a-4e73-401b-b16a-21771f14be2b UPnP Streaming Devices
  57. fd0a5af4-b41d-11d2-9c95-00c04f7971e0 BDA Receiver Components

   以下のことが結論です。

  1. SetupDiBuildClassInfoList() で列挙される Guid ですべてのデバイスを参照できる。
  2. そのうち、”MEDIA”か、その Guid を既知のものすれば、サウンドにアクセスできる。(デバイスパスを取得できる)
  3. あるいは、レンダー、キャプチャのGuidを既知とすれば、サウンドにアクセスできる。(デバイスパスを取得できる)
  4. また、Instance のFriendlyNameを見ると、DirectShowのフィルタの列挙のようだ。
  5. キャプチャには、AudioとVideoがあるが、区別の仕方がわからない。
    取得できるデータのメンバを見ると、ClassGuid と InterfaceClassGuid がある。
    AUDIOカテゴリとCAPTUREカテゴリで検索した結果のClassGuidの集合の共通にあるもの(積)を取れば良さそうだ。
  6. DevConでは、同じ値をレジストリから参照して比較したりしている。デバイスパスの参照以外のことをするつもりなら不整合があることに注意が必要と言うことだと思う。


mikeo_410@hotmail.com