タイトル ミキサーデバイスのボリュームとミュートの調整をする
対象言語 VB4.0, Access95以降
動作確認OS Windows95,98,NT4.0
使用関数 mixerOpen,mixerClose,mixerGetLineInfo,
mixerGetLineControls,mixerGetControlDetails,mixerSetControlDetails
mixerGetNumDevsmixer,GetDevCaps
GlobalAlloc,GlobalLock,CopyMemory,GlobalUnlock,GlobalFree
改築日 1999/08/17
Source Download

ミキサーのボリュームコントロールとミュートコントロールを操作して、
ラインのボリュームを変更します。


ミキサーコントロールについては MSDNLibraryの「定期刊行物」のコンテンツに詳しい説明があるので省略します。
(非常にややこしいので)

ラインのボリュームコントロールとミュートコントロールを変更するにはまず、ソースライン(入力系統)の場合、
つながっているデスティネーションライン(出力系統)から辿っていきます。
(自分のシステムのミキサーの構成については、090401 を参照してください。
また、Windowsアクセサリの「ボユームコントロール」も合わせて見ると分かりやすいかも。)

出力系統は、殆どの音源ボードは最低「VolumeControl(再生)」と「RecordingControl(録音)」の
2ラインはあると思います。
ちょっと高級なボードなら「VoiceCommands(音声)」とかの出力ラインがあります。
(ちなみに自分のは \980の激安ボードだから2ラインしかない(T-T) )

ボリュームコントロールを操作する処理は
 1.ミキサーデバイスを開く
 2.出力系統から接続されている入力系統を列挙し、目的のラインを取得する
 3.そのラインが持っているボリューム、ミュートコントロールを取得する
 4.mixerGetControlDetails,mixerSetControlDetails API関数を使って
  ボリューム値、ミュート状態を取得設定する
 5. ミキサーデバイスを閉じる

という流れになります。


1. フォームを作成しラベル(Label1,Label2,Label3,Label4)、縦スクロールバー(VScroll1),
チェックボックス(Check1)を貼り付けてください。
全てのコントロールをコントロール配列として Indexプロパティに 0を設定して下さい。


Option Explicit

Private hMix As Long
Private flg As Boolean


Private Sub Check1_Click(Index As Integer)
  Dim LongValue As Long

  If Not flg Then
    LongValue = Check1(Index)

    If Not Y_SetMixerMute(hMix, MixerLineInfo(Index).dwLineID, LongValue) Then
      Call MsgBox("ミュートの設定に失敗しました (ToT)")
    End If
  End If

End Sub


Private Sub Form_Load()

  Dim j As Integer
  Dim dst As Long
  Dim Volume As Long
  Dim MaxVolume As Long
  Dim MinVolume As Long
  Dim LongBuf As Long
  
  flg = True

  If Not Y_OpenMixer(hMix, dst) Then
    Call MsgBox("ミキサーが開けません。(ToT)")
  Else
  'スピーカ出力ラインに接続されているソース(入力系統)を列挙する
    Call Y_GetMixerLineInfo(hMix, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dst)

    For j = 0 To UBound(MixerLineInfo)
      If j <> 0 Then
        Load VScroll1(j)
        Load Label1(j) 'ライン名
        Load Label2(j) '最大値
        Load Label3(j) '最小値
        Load Label4(j) '現在の値
        Load Check1(j) 'ミュートスイッチ
      End If
      VScroll1(j).Left = 1200 * j + VScroll1(0).Left
      Label1(j).Left = 1200 * j + Label1(0).Left
      Label2(j).Left = 1200 * j + Label2(0).Left
      Label3(j).Left = 1200 * j + Label3(0).Left
      Label4(j).Left = 1200 * j + Label4(0).Left
      Check1(j).Left = 1200 * j + Check1(0).Left
      VScroll1(j).Visible = True
      Label1(j).Visible = True
      Label2(j).Visible = True
      Label3(j).Visible = True
      Label4(j).Visible = True
      Check1(j).Visible = True

      With MixerLineInfo(j)
      'ボリューム値取得
        Call Y_GetMixerVolume(hMix, .dwLineID, Volume, MaxVolume, MinVolume)
        Label1(j) = EditBuf(.szName)
        Label2(j) = MaxVolume
        Label3(j) = MinVolume
        Label4(j) = Volume
        VScroll1(j).Max = MaxVolume - 32768 'Max,Minは符号有り16Bitの制限があるので、 32768 を引く
        VScroll1(j).Min = MinVolume - 32768
        VScroll1(j) = (MaxVolume - Volume) - 32768

      'ミュート設定値取得
        Call Y_GetMixerMute(hMix, .dwLineID, LongBuf)
        Check1(j) = LongBuf

      End With
    Next
  End If
  flg = False

End Sub


Private Sub Form_Unload(Cancel As Integer)

'ミキサーデバイスを閉じる
  Call mixerClose(hMix)

End Sub


Private Sub VScroll1_Change(Index As Integer)

  Dim LongValue As Long
  If Not flg Then
    LongValue = CLng(Label2(Index)) - (VScroll1(Index) + 32768)
    If Not Y_SetMixerVolume(hMix, MixerLineInfo(Index).dwLineID, LongValue) Then
      Call MsgBox("ボリュームの設定に失敗しました (ToT)")
    Else
      Call Y_GetMixerVolume(hMix, MixerLineInfo(Index).dwLineID, LongValue, 0, 0)
      Label4(Index) = LongValue
    End If
  End If

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) 'MIDI入力
Public Const MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5) 'CD入力
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) 'WAVE入力
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 '入力系統

'ラインのコントロール情報を取得する
Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" _
(ByVal hmxobj As Long, pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Long) As Long
'fdwControlsの設定値
Public Const MIXER_GETLINECONTROLSF_ALL = &H0&
Public Const MIXER_GETLINECONTROLSF_ONEBYID = &H1& 'コントロールIDから取得
Public Const MIXER_GETLINECONTROLSF_ONEBYTYPE = &H2& 'コントロールタイプから取得

Type MIXERCONTROL
  cbStruct As Long 'この構造体のサイズ
  dwControlID As Long 'ミキサーデバイスのコントロールの識別子
  dwControlType As Long 'dwControlIDクラスコントロールタイプがセットされる MIXERLINE_COMPONENTTYPE〜
  fdwControl As Long 'オーディオラインコントロールのステータスフラグがセットされる MIXERCONTROL_CONTROLF_xxx
  cMultipleItems As Long 'MIXERCONTROL_CONTROLF_MULTIPLEコントロールを構成するチャネル毎のアイテム数がセットされる
  szShortName As String * MIXER_SHORT_NAME_CHARS 'オーディオラインコントロールの短縮名
  szName As String * MIXER_LONG_NAME_CHARS 'オーディオラインコントロール名
'Bounds共用体
  Minimum As Long 'このハードウェアでのコントロールの最大設定可能値
  Maximum As Long 'このハードウェアでのコントロールの最小設定可能値
  Reserved1(3) As Long
'Metrics共用体
  MetricsData As Long 'Metrics共用体
  Reserved2(4) As Long
End Type

Type MIXERLINECONTROLS
  cbStruct As Long ' size in Byte of MIXERLINECONTROLS
  dwLineID As Long ' line id (from MIXERLINE.dwLineID)
             ' MIXER_GETLINECONTROLSF_ONEBYID or
  dwControl As Long ' MIXER_GETLINECONTROLSF_ONEBYTYPE
  cControls As Long ' count of controls pmxctrl points to
  cbmxctrl As Long ' size in Byte of _one_ MIXERCONTROL
  pamxctrl As Long ' pointer to first MIXERCONTROL array
End Type

'dwControlの設定値(mixerGetLineControls API関数でMIXER_GETLINECONTROLSF_ONEBYTYPEを指定した時)

Public Const MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = &H0&

Public Const MIXERCONTROL_CT_UNITS_BOOLEAN = &H10000
Public Const MIXERCONTROL_CT_UNITS_UNSIGNED = &H30000

Public Const MIXERCONTROL_CT_CLASS_SWITCH = &H20000000
Public Const MIXERCONTROL_CT_CLASS_FADER = &H50000000

Public Const MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED)
Public Const MIXERCONTROL_CONTROLTYPE_BOOLEAN = (MIXERCONTROL_CT_CLASS_SWITCH _
Or MIXERCONTROL_CT_SC_SWITCH_BOOLEAN Or MIXERCONTROL_CT_UNITS_BOOLEAN)

Public Const MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1) 'ボリュームコントロール
Public Const MIXERCONTROL_CONTROLTYPE_MUTE = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2) 'ミュートコントロール

'各ボリュームコントロールの設定値を取得する
Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" _
(ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long

'各ボリュームコントロールを設定する
Declare Function mixerSetControlDetails Lib "winmm.dll" _
(ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long

Public Const MIXER_SETCONTROLDETAILSF_VALUE = &H0&

Type MIXERCONTROLDETAILS
  cbStruct As Long ' size in Byte of MIXERCONTROLDETAILS
  dwControlID As Long ' control id to get/set details on
  cChannels As Long ' number of channels in paDetails array
  item As Long ' hwndOwner or cMultipleItems
  cbDetails As Long ' size of _one_ details_XX struct
  paDetails As Long ' pointer to array of details_XX structs
End Type

Type MIXERCONTROLDETAILS_UNSIGNED
  dwValue As Long
End Type

Type MIXERCONTROLDETAILS_SIGNED
  lValue As Long
End Type

Type MIXERCONTROLDETAILS_BOOLEAN
  fValue As Long
End Type


' ヒープからメモリブロックを確保する
Private Declare Function GlobalAlloc Lib "kernel32" _
(ByVal wFlags As Long, ByVal dwBytes As Long) As Long

Public Const GMEM_MOVEABLE = &H2 ' 移動可能メモリの割当て
Public Const GMEM_ZEROINIT = &H40 ' メモリ内容を0で初期化する
Public Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)

'グローバルヒープに確保されたメモリブロックをロックする
Private Declare Function GlobalLock Lib "kernel32" (ByVal hmem As Long) As Long

'メモリブロックをコピーする。
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)

'グローバルヒープにロードされたメモリブロックを解放する
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hmem As Long) As Long

'グローバルヒープに確保されていたメモリブロックを解放する
Private Declare Function GlobalFree Lib "kernel32" (ByVal hmem As Long) As Long

'エラーコード
Public Const MIXERR_BASE = 1024
Public Const MIXERR_INVALLINE = (MIXERR_BASE + 0)
Public Const MIXERR_INVALCONTROL = (MIXERR_BASE + 1)

Public Const MMSYSERR_BASE = 0
Public Const MMSYSERR_NOERROR = 0 ' no error
Public Const MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2) ' device ID out of range
Public Const MMSYSERR_INVALHANDLE = (MMSYSERR_BASE + 5) ' device handle is invalid
Public Const MMSYSERR_NODRIVER = (MMSYSERR_BASE + 6) ' no device driver present
Public Const MMSYSERR_INVALFLAG = (MMSYSERR_BASE + 10) ' invalid flag passed
Public Const MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11) ' invalid parameter passed

Public MixerLineInfo() As MixerLine 'このシステムの全てのミキサーライン情報


Public Function Y_OpenMixer(ByRef hMx As Long, ByRef DSTMax As Long) As Boolean
'*******************************************************************
'機能 : ミキサーデバイスを開く
'引数 : hMx = ミキサーハンドルを取得するためのバッファ
'    DSTMax = デスティネーション(出力系統)数を取得する為のバッファ
'戻り値: True = 成功 False =失敗
'    hMx にミキサーハンドル
'    DSTMaxに デスティネーション(出力系統)数がセットされる
'*******************************************************************

  Dim mxcaps As MIXERCAPS
  Dim MxId As Long
  Dim longret As Long

  If mixerGetNumDevs() <> 0 Then 'ミキサーデバイスがあるかチェック
    MxId = 0 '通常、ミキサーデバイスは1つなので 0を指定しておく
  'ミキサーデバイス情報を取得する
    longret = mixerGetDevCaps(MxId, mxcaps, LenB(mxcaps))
  'ミキサーデバイスを開く
    longret = mixerOpen(hMx, MxId, 0&, 0&, MIXER_OBJECTF_MIXER)

    Y_OpenMixer = (longret = MMSYSERR_NOERROR)
    DSTMax = mxcaps.cDestinations - 1

  End If

End Function


Public Sub Y_GetMixerLineInfo(ByVal hMx As Long, ByVal DstLineType As Long, ByVal DSTMax As Long)
'**********************************************************************
'機能 : 出力系統に接続されている入力系統を列挙しMixerLineInfo配列にセット
'引数 : hMx = ミキサーハンドル
'    DstLineType = 取得したいデスティネーション(出力系統)種類
'    DSTMax = デスティネーション(出力系統)数
'備考 : Public変数 MixerLineInfo配列にセットされます
'**********************************************************************

  Dim longret As Long
  Dim dst As Long
  Dim src As Long
  Dim Cnt As Long
  Dim DstMxrLn As MixerLine
  Dim SrcMxrLn As MixerLine

  Cnt = 1

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

  '出力系統のライン情報を取得する
    If mixerGetLineInfo(hMx, DstMxrLn, MIXER_GETLINEINFOF_DESTINATION) = MMSYSERR_NOERROR Then
    '目的の出力系統の場合のみ、入力系統を取得
      If DstMxrLn.dwComponentType = DstLineType Then
        ReDim MixerLineInfo(0)
        MixerLineInfo(dst) = DstMxrLn

      '出力系統に接続されている入力系統を列挙する
        For src = 0 To DstMxrLn.cConnections - 1
          With SrcMxrLn
            .cbStruct = LenB(SrcMxrLn)
            .dwDestination = dst
            .dwSource = src
          End With

        '入力系統のライン情報を取得する
          If mixerGetLineInfo(hMx, SrcMxrLn, MIXER_GETLINEINFOF_SOURCE) = MMSYSERR_NOERROR Then
            ReDim Preserve MixerLineInfo(Cnt)
            MixerLineInfo(Cnt) = SrcMxrLn
            Cnt = Cnt + 1
          End If
        Next
      End If
    End If
  Next

End Sub


Public Function Y_GetMixerVolume(ByVal hMx As Long, ByVal LineID As Long, _
ByRef Value As Long, ByRef MaxValue As Long, ByRef MinValue As Long) As Boolean
'******************************************************************
'機能 : 指定したラインの現在のボリューム値と、最大値、最小値を取得する
'引数 : hMx = ミキサーハンドル
'    LineID = 取得したいラインの識別子
'    Value = 結果を取得するためのバッファ
'    MaxValue = 設定可能最大値を取得するためのバッファ
'    MinValue = 設定可能最小値を取得するためのバッファ
'戻り値: True = 成功 False = 失敗
'    Value = 結果を取得するためのバッファ
'    MaxValue = 設定可能最大値
'    MinValue = 設定可能最小値
' Value = 現在のボリューム値
'******************************************************************

  Dim longret As Long
  Dim hmem As Long
  Dim ptr As Long

  Dim MixCtrl As MIXERCONTROL
  Dim mxCtrlDtls As MIXERCONTROLDETAILS
  Dim mxCtrlDtls_U As MIXERCONTROLDETAILS_UNSIGNED

'指定したラインのボリュームコントロールを取得する
  If Y_GetMixerControlInfo(hMx, LineID, MIXERCONTROL_CONTROLTYPE_VOLUME, MixCtrl) Then

' ヒープからMIXERCONTROLDETAILS_UNSIGNED構造体のサイズ分のメモリブロックを確保する
    hmem = GlobalAlloc(GHND, Len(mxCtrlDtls_U))

  'メモリブロックをロックしてポインタを取得する
    ptr = GlobalLock(hmem)

    With mxCtrlDtls
      .cbStruct = Len(mxCtrlDtls)
      .dwControlID = MixCtrl.dwControlID
      .cChannels = 1
      .item = 0
      .cbDetails = Len(mxCtrlDtls_U)
      .paDetails = ptr
    End With

  'ボリュームコントロールからボリュームを取得する
    longret = mixerGetControlDetails(hMx, mxCtrlDtls, MIXER_SETCONTROLDETAILSF_VALUE)

    Y_GetMixerVolume = (longret = MMSYSERR_NOERROR)

  'ポインタからMIXERCONTROLDETAILS_UNSIGNED構造体の値を取り出し、ボリューム値を取得する
    Call CopyMemory(mxCtrlDtls_U, ByVal ptr, Len(mxCtrlDtls_U))

    Value = mxCtrlDtls_U.dwValue
    MaxValue = MixCtrl.Maximum
    MinValue = MixCtrl.Minimum

  'メモリブロックロック解除
    longret = GlobalUnlock(hmem)
  'メモリブロック解放
    longret = GlobalFree(hmem)
  End If

End Function


Public Function Y_GetMixerMute(ByVal hMx As Long, ByVal LineID As Long, ByRef Value As Long) As Boolean
'***********************************************************
'機能 : 指定したラインの現在のミュート状態を取得する
'引数 : hMx = ミキサーハンドル
'    CtrlID = 取得したいラインのミュートコントロールの識別子
'    Value = 結果を取得するためのLong値
'戻り値: True = 成功 False = 失敗
'    Valueにミュート情報がセットされます。 1: ON 0: OFF
'***********************************************************

  Dim longret As Long
  Dim hmem As Long
  Dim ptr As Long
  Dim MixCtrl As MIXERCONTROL
  Dim mxCtrlDtls As MIXERCONTROLDETAILS
  Dim mxCtrlDtls_B As MIXERCONTROLDETAILS_BOOLEAN
 
'指定したラインのミュートコントロールを取得する
  If Y_GetMixerControlInfo(hMx, LineID, MIXERCONTROL_CONTROLTYPE_MUTE, MixCtrl) Then

  ' ヒープからMIXERCONTROLDETAILS_BOOLEAN構造体のサイズ分のメモリブロックを確保する
    hmem = GlobalAlloc(GHND, Len(mxCtrlDtls_B))

  'メモリブロックをロックしてポインタを取得する
    ptr = GlobalLock(hmem)

    With mxCtrlDtls
      .cbStruct = Len(mxCtrlDtls)
      .dwControlID = MixCtrl.dwControlID
      .cChannels = 1
      .item = 0
      .cbDetails = Len(mxCtrlDtls_B)
      .paDetails = ptr
    End With

  'ミュートコントロールからフラグを取得する
    longret = mixerGetControlDetails(hMx, mxCtrlDtls, MIXER_SETCONTROLDETAILSF_VALUE)

    Y_GetMixerMute = (longret = MMSYSERR_NOERROR)

  'ポインタからMIXERCONTROLDETAILS_BOOLEAN構造体の値を取り出し、ミュート設定値を取得する
    Call CopyMemory(mxCtrlDtls_B, ByVal ptr, Len(mxCtrlDtls_B))
    Value = mxCtrlDtls_B.fValue

  'メモリブロックロック解除
    longret = GlobalUnlock(hmem)
  'メモリブロック解放
    longret = GlobalFree(hmem)
  End If

End Function


Public Function Y_SetMixerVolume(ByVal hMx As Long, ByVal LineID As Long, ByVal Value As Long) As Boolean
'******************************************************************
'機能 : 指定したラインのボリュームを設定する
'引数 : hMx = ミキサーハンドル
'    LineID = 設定したいラインの識別子
'    Value = 設定するボリューム値
'戻り値: True = 成功 False = 失敗
'******************************************************************

  Dim longret As Long
  Dim hmem As Long
  Dim ptr As Long

  Dim MixCtrl As MIXERCONTROL
  Dim mxCtrlDtls As MIXERCONTROLDETAILS
  Dim mxCtrlDtls_U As MIXERCONTROLDETAILS_UNSIGNED

'指定したラインのボリュームコントロールを取得する
  If Y_GetMixerControlInfo(hMx, LineID, MIXERCONTROL_CONTROLTYPE_VOLUME, MixCtrl) Then
    If Value <= MixCtrl.Maximum And Value >= MixCtrl.Minimum Then

    ' ヒープからMIXERCONTROLDETAILS_UNSIGNED構造体のサイズ分のメモリブロックを確保する
      hmem = GlobalAlloc(GHND, Len(mxCtrlDtls_U))

    'メモリブロックをロックしてポインタを取得する
      ptr = GlobalLock(hmem)

      With mxCtrlDtls
        .cbStruct = Len(mxCtrlDtls)
        .dwControlID = MixCtrl.dwControlID
        .cChannels = 1
        .item = 0
        .cbDetails = Len(mxCtrlDtls_U)
        .paDetails = ptr
      End With

    'paDetailsのポインタにボリューム値をセットし、ボリューム設定をする
      mxCtrlDtls_U.dwValue = Value
      Call CopyMemory(ByVal ptr, mxCtrlDtls_U, Len(mxCtrlDtls_U))

    'ボリュームコントロールのボリュームを設定する
      longret = mixerSetControlDetails(hMx, mxCtrlDtls, MIXER_SETCONTROLDETAILSF_VALUE)
      Y_SetMixerVolume = (longret = MMSYSERR_NOERROR)

    'メモリブロックロック解除
      longret = GlobalUnlock(hmem)
    'メモリブロック解放
      longret = GlobalFree(hmem)
    End If
  End If

End Function


Public Function Y_SetMixerMute(ByVal hMx As Long, ByVal LineID As Long, ByVal Value As Long) As Boolean
'***********************************************************
'機能 : 指定したラインをミュートする
'引数 : hMx = ミキサーハンドル
'    LineID = ミュートしたいラインの識別子
'    Value = 1:on 0:off
'戻り値: True = 成功 False = 失敗
'    Valueにミュート情報がセットされます。 1: ON 0: OFF
'***********************************************************

  Dim longret As Long
  Dim hmem As Long
  Dim ptr As Long
  Dim MixCtrl As MIXERCONTROL
  Dim mxCtrlDtls As MIXERCONTROLDETAILS
  Dim mxCtrlDtls_B As MIXERCONTROLDETAILS_BOOLEAN

'指定したラインのミュートコントロールを取得する
  If Y_GetMixerControlInfo(hMx, LineID, MIXERCONTROL_CONTROLTYPE_MUTE, MixCtrl) Then

  ' ヒープからMIXERCONTROLDETAILS_BOOLEAN構造体のサイズ分のメモリブロックを確保する
    hmem = GlobalAlloc(GHND, Len(mxCtrlDtls_B))

  'メモリブロックをロックしてポインタを取得する
    ptr = GlobalLock(hmem)

    With mxCtrlDtls
      .cbStruct = Len(mxCtrlDtls)
      .dwControlID = MixCtrl.dwControlID
      .cChannels = 1
      .item = 0
      .cbDetails = Len(mxCtrlDtls_B)
      .paDetails = ptr
    End With

  'paDetailsのポインタにミュートの値をセットする
    mxCtrlDtls_B.fValue = Value
    Call CopyMemory(ByVal ptr, mxCtrlDtls_B, Len(mxCtrlDtls_B))

  'ミュートコントロールにフラグを設定する
    longret = mixerSetControlDetails(hMx, mxCtrlDtls, MIXER_SETCONTROLDETAILSF_VALUE)

    Y_SetMixerMute = (longret = MMSYSERR_NOERROR)

  'メモリブロックロック解除
    longret = GlobalUnlock(hmem)
  'メモリブロック解放
    longret = GlobalFree(hmem)
  End If

End Function


Public Function Y_GetMixerControlInfo(ByVal hMx As Long, ByVal LnLineID As Long, _
ByVal ControlType As Long, MxCtrl As MIXERCONTROL) As Boolean
'***********************************************************
'機能 : 指定したラインのコントロール情報を取得する
'引数 : hMx = ミキサーハンドル
'    LineID = 取得したいラインの識別子
'    ControlType = 取得したいコントロールタイプ
'    MxCtrl = 結果を取得するためのMIXERCONTROL構造体
'戻り値: True = 成功 False = 失敗
'    MxCtrlにコントロール情報がセットされます。
'***********************************************************

  Dim MxLnCtrl As MIXERLINECONTROLS
  Dim longret As Long
  Dim hmem As Long
  Dim ptr As Long

' ヒープからMIXERCONTROL構造体のサイズ分のメモリブロックを確保する
  hmem = GlobalAlloc(GHND, Len(MxCtrl))

'メモリブロックをロックしてポインタを取得する
  ptr = GlobalLock(hmem)

  With MxLnCtrl
    .cbStruct = Len(MxLnCtrl)
    .dwLineID = LnLineID
    .dwControl = ControlType
    .cControls = 1
    .cbmxctrl = Len(MxCtrl)
    .pamxctrl = ptr
  End With

'ControlTypeを使用してラインのコントロール情報を取得する
  longret = mixerGetLineControls(hMx, MxLnCtrl, MIXER_GETLINECONTROLSF_ONEBYTYPE)

  Y_GetMixerControlInfo = (longret = MMSYSERR_NOERROR)

'ポインタからMIXERCONTROL構造体の値を取り出す
  Call CopyMemory(MxCtrl, ByVal ptr, Len(MxCtrl))

'メモリブロックロック解除
  longret = GlobalUnlock(hmem)
'メモリブロック解放
  longret = GlobalFree(hmem)

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.