タイトル ミキサーデバイスの情報を列挙する
対象言語 VB4.0, Access95以降
動作確認OS Windows95,98,NT4.0
使用関数 mixerOpen,mixerClose,mixerGetLineInfo,
mixerGetNumDevsmixer,GetDevCaps
改築日 1999/08/17
Source Download

システムのミキサーの情報を列挙し、
出力系統別に一覧表示します。


ミキサーコントロールについては MSDNLibraryの「定期刊行物」
のコンテンツに詳しい説明があるので省略します。
(非常にややこしいので)
先に出力系統を取得してからそれに接続されている入力系統
を取得するようにします。
Windowsアクセサリの「ボリュームコントロール」と合わせて
参照すると解りやすいと思います。


1. フォームを作成しリストボックス(List1)、テキストボックス(Text1)を貼り付けてください。


Option Explicit

Private Sub Form_Load()
  Dim i As Integer
  Dim j As Integer
  Dim chanel(2) As String


  chanel(1) = "LEFT(MONORAL)"
  chanel(2) = "LEFT & RIGHT (STEREO)"

  Text1 = Y_GetMixerDeviceInfo()

  List1.Clear

  For i = 0 To UBound(DstMixerInfo)
    With DstMixerInfo(i)
      List1.AddItem "======================================="
      List1.AddItem "出力系統No: " & vbTab & .dwDestination
      List1.AddItem "ラインID: " & vbTab & Hex$(.dwLineID)
      List1.AddItem "ライン名 : " & vbTab & EditBuf(.szName)
      List1.AddItem "コンポーネントタイプ: " & Hex$(.dwComponentType) & " " & Y_GetComponentTypeName(.dwComponentType)
      List1.AddItem "ステータス: " & vbTab & Hex$(.fdwLine) & " " & Y_GetMixerStatus(.fdwLine)
      List1.AddItem "チャンネル: " & vbTab & .cChannels & " " & chanel(.cChannels)
      List1.AddItem "入力系統数: " & vbTab & .cConnections
      List1.AddItem "コントロール数:" & vbTab & .cControls
    End With
    For j = 0 To UBound(SrcMixerInfo)

      With SrcMixerInfo(j)
        If .dwDestination = i Then
          List1.AddItem " ------------------------------------"
          List1.AddItem "    出力系統No: " & vbTab & .dwDestination
          List1.AddItem "    入力系統No: " & vbTab & .dwSource
          List1.AddItem "    ラインID: " & vbTab & Hex$(.dwLineID)
          List1.AddItem "    ライン名 : " & vbTab & EditBuf(.szName)
          List1.AddItem "    コンポーネントタイプ: " & Hex$(.dwComponentType) & " " & Y_GetComponentTypeName(.dwComponentType)
          List1.AddItem "    ステータス: " & vbTab & Hex$(.fdwLine) & " " & Y_GetMixerStatus(.fdwLine)
          List1.AddItem "    チャンネル: " & vbTab & chanel(.cChannels)
          List1.AddItem "    コントロール数: " & .cControls
        End If
      End With
    Next
  Next

End Sub



2.モジュールウインドウを作成し、下のソースを入力してください。

Option Explicit

'ミキサーデバイスの数を取得する
Declare Function mixerGetNumDevs Lib "winmm.dll" () As Long

'ミキサーデバイスの機能を取得する
Declare Function mixerGetDevCaps Lib "winmm.dll" Alias "mixerGetDevCapsA" _
(ByVal uMxId As Long, pmxcaps As MIXERCAPS, ByVal cbmxcaps As Long) As Long

Public Const MAXPNAMELEN = 32 ' max product name length (including NULL)

Type MIXERCAPS
  wMid As Integer ' manufacturer id
  wPid As Integer ' product id
  vDriverVersion As Long ' version of the driver
  szPname As String * MAXPNAMELEN ' product name
  fdwSupport As Long ' misc. support bits
  cDestinations As Long ' count of destinations
End Type

'ミキサーデバイスを開く
Declare Function mixerOpen Lib "winmm.dll" _
(phmx As Long, ByVal uMxId As Long, ByVal dwCallback As Long, _
ByVal dwInstance As Long, ByVal fdwOpen As Long) As Long
'fdwOpenの設定値
Public Const MIXER_OBJECTF_MIXER = &H0& 'ミキサーデバイスを開く

'ミキサーデバイスを閉じる
Declare Function mixerClose Lib "winmm.dll" (ByVal hMx As Long) As Long

'各ミキサーラインの情報を取得する
Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" _
(ByVal hmxobj As Long, pmxl As MIXERLINE, ByVal fdwInfo As Long) As Long
'fdwInfoの設定値
Public Const MIXER_GETLINEINFOF_SOURCE = &H1& '入力系統を取得
Public Const MIXER_GETLINEINFOF_DESTINATION = &H0& '出力系統を取得

Public Const MIXER_SHORT_NAME_CHARS = 16
Public Const MIXER_LONG_NAME_CHARS = 64

Type Target ' for use in MIXERLINE and others (embedded structure)
  dwType As Long ' MIXERLINE_TARGETTYPE_xxxx
  dwDeviceID As Long ' target device ID of device type
  wMid As Integer ' of target device
  wPid As Integer ' "
  vDriverVersion As Long ' "
  szPname As String * MAXPNAMELEN
End Type

Type MIXERLINE
  cbStruct As Long ' この構造体のサイズ
  dwDestination As Long ' 取得する系統
  dwSource As Long ' 取得するソース番号
  dwLineID As Long ' ミキサーデバイスラインID
  fdwLine As Long ' ラインのステータス情報
  dwUser As Long ' driver specific information
  dwComponentType As Long ' ライン名コード
  cChannels As Long ' チャネル数 1:LEFT (Mono) 2:LEFT+RIGHT (Stereo)
  cConnections As Long ' 出力系統に接続されている入力系統数
  cControls As Long ' コントロール数
  szShortName As String * MIXER_SHORT_NAME_CHARS 'ライン名(ショート)
  szName As String * MIXER_LONG_NAME_CHARS 'ライン名
  lpTarget As Target
End Type

'dwComponentTypeの戻り値
Public Const MIXERLINE_COMPONENTTYPE_DST_FIRST = &H0&
Public Const MIXERLINE_COMPONENTTYPE_DST_UNDEFINED = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 0)
Public Const MIXERLINE_COMPONENTTYPE_DST_DIGITAL = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 1)
Public Const MIXERLINE_COMPONENTTYPE_DST_LINE = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 2)
Public Const MIXERLINE_COMPONENTTYPE_DST_MONITOR = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 3)
Public Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4) 'ボリュームコントロール
Public Const MIXERLINE_COMPONENTTYPE_DST_HEADPHONES = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 5)
Public Const MIXERLINE_COMPONENTTYPE_DST_TELEPHONE = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 6)
Public Const MIXERLINE_COMPONENTTYPE_DST_WAVEIN = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 7) '録音の調節
Public Const MIXERLINE_COMPONENTTYPE_DST_VOICEIN = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8) '音声コマンド
Public Const MIXERLINE_COMPONENTTYPE_DST_LAST = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)
Public Const MIXERLINE_COMPONENTTYPE_SRC_FIRST = &H1000&
Public Const MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0)
Public Const MIXERLINE_COMPONENTTYPE_SRC_DIGITAL = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1)
Public Const MIXERLINE_COMPONENTTYPE_SRC_LINE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2)
Public Const MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3)
Public Const MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4)
Public Const MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5)
Public Const MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6)
Public Const MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7)
Public Const MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8)
Public Const MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9)
Public Const MIXERLINE_COMPONENTTYPE_SRC_ANALOG = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)
Public Const MIXERLINE_COMPONENTTYPE_SRC_LAST = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)

'fdwLineの戻り値
Public Const MIXERLINE_LINEF_ACTIVE = &H1& 'アクティブ
Public Const MIXERLINE_LINEF_DISCONNECTED = &H8000& '接続されていない
Public Const MIXERLINE_LINEF_SOURCE = &H80000000 '入力系統

Public Const MMSYSERR_NOERROR = 0 ' no error

Public DstMixerInfo() As MIXERLINE
Public SrcMixerInfo() As MIXERLINE


Public Function Y_GetMixerDeviceInfo() As String
'***********************************************************
'機能 : ミキサーデバイス情報を取得する
'戻り値: ミキサーデバイス名
'   : DstMixerInfo配列に出力系統、
'    SrcMixerInfo配列に入力系統の情報がセットされます。
'***********************************************************

  Dim longret As Long
  Dim MxId As Long
  Dim mxcaps As MIXERCAPS
  Dim hMx As Long
  Dim DSTMixerLine As MIXERLINE
  Dim SRCMixerLine As MIXERLINE
  Dim dst As Long
  Dim src As Long
  Dim DSTMax As Long
  Dim SRCMax As Long

  Dim strbuf As String

  SRCMax = 0
  If mixerGetNumDevs() <> 0 Then 'ミキサーデバイスがあるかチェック
    MxId = 0 '通常、ミキサーデバイスは1つなので 0を指定しておく

  'ミキサーデバイス情報を取得する
    longret = mixerGetDevCaps(MxId, mxcaps, LenB(mxcaps))
    Y_GetMixerDeviceInfo = EditBuf(mxcaps.szPname)
  'ミキサーデバイスを開く
    longret = mixerOpen(hMx, MxId, 0&, 0&, MIXER_OBJECTF_MIXER)

    If longret = MMSYSERR_NOERROR Then
      DSTMax = mxcaps.cDestinations - 1

      ReDim Preserve DstMixerInfo(DSTMax)

    'ミキサーデバイスの出力系統を列挙する
      For dst = dst To DSTMax
        With DSTMixerLine
          .cbStruct = LenB(DSTMixerLine)
          .dwDestination = dst
          .dwSource = 0
        End With

      '出力系統のライン情報を取得する
        If mixerGetLineInfo(hMx, DSTMixerLine, MIXER_GETLINEINFOF_DESTINATION) = MMSYSERR_NOERROR Then

          DstMixerInfo(dst) = DSTMixerLine

        '出力系統に接続されている入力系統を列挙する
          For src = 0 To DSTMixerLine.cConnections - 1

            With SRCMixerLine
              .cbStruct = LenB(SRCMixerLine)
              .dwDestination = dst
              .dwSource = src
            End With

          '入力系統のライン情報を取得する
            If mixerGetLineInfo(hMx, SRCMixerLine, MIXER_GETLINEINFOF_SOURCE) = MMSYSERR_NOERROR Then
              ReDim Preserve SrcMixerInfo(SRCMax)
              SrcMixerInfo(SRCMax) = SRCMixerLine
              SRCMax = SRCMax + 1
            End If
          Next
        End If
      Next
    End If
  'ミキサーデバイスを閉じる
    longret = mixerClose(hMx)

  End If

End Function


Public Function Y_GetComponentTypeName(ComponentType As Long) As String
'***********************************************************
'機能 : コンポーネントタイプコードからコンポーネント名を返す。
'引数 : ComponentType=コンポーネントタイプコード
'戻り値: コンポーネント名
'***********************************************************

  Dim strbuf As String

  Select Case ComponentType
    Case MIXERLINE_COMPONENTTYPE_DST_UNDEFINED
      strbuf = "未知の出力"
    Case MIXERLINE_COMPONENTTYPE_DST_DIGITAL 'AudioCard Digital Out
      strbuf = "デジタル出力"
    Case MIXERLINE_COMPONENTTYPE_DST_LINE
      strbuf = "オーディオ出力"
    Case MIXERLINE_COMPONENTTYPE_DST_MONITOR
      strbuf = "モニター出力"
    Case MIXERLINE_COMPONENTTYPE_DST_SPEAKERS 'AudioCard Line Out
      strbuf = "スピーカー出力(再生)"
    Case MIXERLINE_COMPONENTTYPE_DST_HEADPHONES 'AudioCard Headphone Out
      strbuf = "ヘッドフォン出力"
    Case MIXERLINE_COMPONENTTYPE_DST_TELEPHONE
      strbuf = "電話回線出力"
    Case MIXERLINE_COMPONENTTYPE_DST_WAVEIN
      strbuf = "アナログ入力への出力(録音)"
    Case MIXERLINE_COMPONENTTYPE_DST_VOICEIN
      strbuf = "アナログ音声入力への出力(音声コマンド)"

    Case MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED
      strbuf = "未知の入力ライン"
    Case MIXERLINE_COMPONENTTYPE_SRC_DIGITAL
      strbuf = "デジタル"
    Case MIXERLINE_COMPONENTTYPE_SRC_LINE
      strbuf = "ライン入力"
    Case MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
      strbuf = "マイク"
    Case MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER
      strbuf = "MIDI"
    Case MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC
      strbuf = "CD"
    Case MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE
      strbuf = "電話回線"
    Case MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER
      strbuf = "PCスピーカー"
    Case MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT
      strbuf = "WAVE"
    Case MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY
      strbuf = "AUX入力"
    Case MIXERLINE_COMPONENTTYPE_SRC_ANALOG
      strbuf = "アナログ入力"

  End Select
  Y_GetComponentTypeName = strbuf

End Function


Public Function Y_GetMixerStatus(Status As Long) As String
'***********************************************************
'機能 : ミキサーラインのステータスコードからステータス名を返す。
'引数 : Status = ステータスコード
'戻り値: ステータス名
'***********************************************************

  Dim strbuf As String

  If (Status And MIXERLINE_LINEF_SOURCE) <> 0 Then
    strbuf = "入力系統 "
  Else
    strbuf = "出力系統 "
  End If

  If (Status And MIXERLINE_LINEF_ACTIVE) <> 0 Then
    strbuf = strbuf & "接続中 "
  End If
  If (Status And MIXERLINE_LINEF_DISCONNECTED) <> 0 Then
    strbuf = strbuf & "切断中 "
  End If

  Y_GetMixerStatus = strbuf

End Function


Public Function EditBuf(Buf As String) As String
'***********************************************************
'機能 : 引数 Bufの文字列中の Nullコードを検索し、Nullコードを
'    除いた文字列を返す
'引数 : Buf = Nullコードを含む文字列
'戻り値: Nullコードを除いた文字列
'***********************************************************

  Dim i As Long

  i = InStr(Buf, vbNullChar)
  If i <> 0 Then
    EditBuf = Left$(Buf, i - 1)
  Else
    EditBuf = Buf
  End If

End Function





Copyright (C)1997-2001 空耳工房 MY2Project All rights reserved.