サウンドデバイスの指定


フカノ  2008-03-28 15:48:26  No: 100513  IP: 192.*.*.*

初めて投稿します。
PCにインストール済みの2枚のサウンドボードに対してVBで作成したアプリの中から
任意でサウンドボードの選択をしたいのですが、WindowsのMedia Playerではツールバーの
”ツール”、”オプション”、”デバイス”、”スピーカ”のところで使用するオーディオデバイスの選択が可能となっています。このような仕様をVB構築する方法をお教え頂ければ幸いです。

編集 削除
K.J.K.  2008-03-29 16:22:25  No: 100514  IP: 192.*.*.*

DirectShowで再生するのであれば、Audio Rendererの中から希望するものを選択することで可能です。

編集 削除
K.J.K.  2008-04-02 14:03:09  No: 100515  IP: 192.*.*.*

mailで送られても情報の共有にはならないので、こちらで。

教科書的(SDK的)には、エラー処理などをはしよると、

手順A (列挙部分)

Dim oDevEnum As ICreateDevEnum
Dim oEnum As IEnumMoniker
Dim oMiniker As IMoniker
Dim sName As String
Dim iReturn As Long
Dim pString As Long
Dim oBindCtx As IBindCtx

Set oDevEnum = New SystemDeviceEnum
Call oDevEnum.CreateClassEnumerator _
(UUIDFromString(CLSID_AudioRendererCategory), oEnum, 0&)
Set oBindCtx = CreateBindCtx(0&)
iReturn = oEnum.Next(1&, oMoniker)
Do While 1& = iReturn
    '名前を列挙する場合
    pString = oMoniker.GetDisplayName(oBindCtx, Nothing)    
    sName = SysAllocString(pString) 'ここに名前が格納される
    ' この辺りで配列などに名前を格納しておくなどをするコードを追加。
    Call CoTaskMemFree(pString)
    pString = 0&
    Set oMoniker = Nothing
    iReturn = oEnum.Next(1&, oMoniker)
Loop
Set oBindCtx = Nothing
Set oEnum = Nothing
Set oDevEnum = Nothing

で、フィルターの名前が列挙できますので、その後は、
手順B
  Monikerを保管しているのならば、
  IMoniker.BindToObjectメソッドでフィルタを取得し、
  それをIFilterGraph2.AddFilterで追加し、
  IFilterGraph2.RenderFileでグラフを完成させる。
もしくは、手順C
  名前をもとにしてVBらしく行くのならば、
  FilgraphManager.RegFilterCollection.Itemメソッドでフィルタを列挙し、
  IRegFilterInfo.Nameプロパティで該当する名前のフィルタを見つけ、
  それに対してIRegFilterInfo.Filterメソッドでグラフに追加し、
  FilgraphManager.RenderFileメソッドでグラフを完成させる。
という手順になります。

但し、A及びBでは、VB6で行う場合はタイプライブラリを作る/探すなどして
それぞれの定義を使えるようにしなければなりません。そこが面倒ならば、
レジストリから情報を取得するAPI関数を幾つか用いて、
HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum\{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}
以下のキーから直接情報を取得することで代用は可能です。

編集 削除
フカノ  2008-04-02 23:52:54  No: 100516  IP: 192.*.*.*

丁寧に列記して頂きありがとう御座いました。
早速にコーディングしてみます。

編集 削除
K.J.K.  URL  2008-04-07 18:35:51  No: 100517  IP: 192.*.*.*

# ダメな質問者の典型例になってきているような。
# ある場所でわからないからといって、そこで粘らずに他で同じ質問をしなおす
# ようでは、解決に辿り着ける可能性は少ないでしょう。
# そこで「何がわからないのか」を整理して質問しなおすべきかと。

で、リンク先のところに、手順A->手順Cのサンプルをおいといてはあります。
急場でこしらえたので、UIの整合性は取れていませんし説明もありません。
他のサンプル用のタイプライブラリを流用して同梱しています。

編集 削除
フカノ  2008-04-09 19:04:02  No: 100518  IP: 192.*.*.*

ダメな質問者の典型例になった様です。早急に解決対策の焦りから他に質問をしてしまいました。すみません。
”リンク先のところに手順A->手順Cのサンプルをおいといてはあります”
とありますがリンク先とは何処を指しているのでしょうか。
お教え頂きたく宜しくお願い致します。

編集 削除
魔界の仮面弁士  2008-04-09 19:39:42  No: 100519  IP: 192.*.*.*

> とありますがリンク先とは何処を指しているのでしょうか。

》K.J.K. [E-Mail] [HomePage] 2008/04/07(月) 18:35:51 <220.208.108.22>
のところにある、[HomePage] の事でしょう。

編集 削除
やじゅ  2008-04-09 19:40:29  No: 100520  IP: 192.*.*.*

K.J.Kさんコメントの[HomePage]がリンク先になります。

編集 削除
K.J.K.  2008-04-10 18:15:35  No: 100521  IP: 192.*.*.*

C案だとグラフの生成に時間がかかるので、B案に切り替えたものに
サンプルを置き換えておきました。
もとのC案のコードの部分はコメントブロックにしてあります。

編集 削除
フカノ  2008-04-10 19:14:00  No: 100522  IP: 192.*.*.*

K.J.K 様
サンプルをダウンロードしました。
正にそのものです。ありがとうございます。
少し時間をかけて理解を深めるつもりです。
質問等をさせていただきますので宜しくお願い致します。

編集 削除