タイトル | ミキサーデバイスの情報を列挙する |
対象言語 | 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. |