home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / VB_IDE_Ful177675822004.psc / cMixer.cls < prev    next >
Text File  |  2004-08-02  |  11KB  |  308 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cMixer"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. 'Simple Sound Mixer Wrapper Class
  17. '''''''''''''''''''''''''''''''''
  18. '
  19. 'How To:
  20. ''''''''
  21. '  Choose the Channel and SoundControl; this will return True if the selection was successful.
  22. '  Get or Let the Value; note that ALL values are in %
  23. '  For booleans (like Mute) the value 0 means False and 100 means True
  24. '                                                       (one hundred percent true, so to say).
  25. '
  26. '  Success returns True when the last selection was successful.
  27. '  ChannName returns the selected channel name (eg. Speakers).
  28. '  CrtlName returns the selected SoundControl name (eg. VolumeControl).
  29. '
  30. 'Authors note:
  31. ''''''''''''''
  32. '  Unfortunately the Mixer Interface is rather complicated - maybe written by a musician (?) *g* -
  33. '  so there are quite a few mystic API calls with plenty of params, mixer-constants with
  34. '  ugly names, cryptic structure types, and virtual memory address pointers from one structure
  35. '  to the next  >:-(  *grrrhh!*...
  36. '
  37. '  And Micro$oft's documentation is slim, to put it polite.
  38. '
  39. Private 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
  40. Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Long, pmxl As MIXERLINE, ByVal fdwInfo As Long) As Long
  41. Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Long, pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Long) As Long
  42. Private Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
  43. Private Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
  44. Private Declare Function mixerClose Lib "winmm.dll" (ByVal hmx As Long) As Long
  45.  
  46. Private Enum MixerConstants 'this makes them long by default
  47.  
  48.     MMSYSERR_NOERROR = 0
  49.     MIXER_CONTROLDETAILSF_VALUE = 0
  50.     MIXER_GETLINECONTROLSF_ONEBYTYPE = 2
  51.     MIXER_GETLINEINFOF_COMPONENTTYPE = 3
  52.     MIXER_SHORT_NAME_CHARS = 16
  53.     MIXER_LONG_NAME_CHARS = 64
  54.     MAXPNAMELEN = 32
  55.  
  56.     'mixer line constants
  57.     MLC_DST_FIRST = 0
  58.     MLC_SRC_FIRST = &H1000
  59.  
  60.     'Mixer control constants
  61.     MCT_CLASS_FADER = &H50000000
  62.     MCT_UNITS_UNSIGNED = &H30000
  63.     MCT_FADER = MCT_CLASS_FADER Or MCT_UNITS_UNSIGNED
  64.  
  65.     MCT_CLASS_SWITCH = &H20000000
  66.     MCT_UNITS_BOOLEAN = &H10000
  67.     MCT_BOOLEAN = MCT_CLASS_SWITCH Or MCT_UNITS_BOOLEAN
  68.  
  69. End Enum
  70.  
  71. Public Enum Channels
  72.     DigitalOut = MLC_DST_FIRST + 1
  73.     LineOut = MLC_DST_FIRST + 2
  74.     MonitorOut = MLC_DST_FIRST + 3
  75.     SpeakersOut = MLC_DST_FIRST + 4
  76.     HeadphonesOut = MLC_DST_FIRST + 5
  77.     TelephoneOut = MLC_DST_FIRST + 6
  78.     WaveInOut = MLC_DST_FIRST + 7
  79.     VoiceInOut = MLC_DST_FIRST + 8
  80.     DigitalIn = MLC_SRC_FIRST + 1
  81.     LineIn = MLC_SRC_FIRST + 2
  82.     MikrophoneIn = MLC_SRC_FIRST + 3
  83.     SynthesizerIn = MLC_SRC_FIRST + 4
  84.     CompactDiscIn = MLC_SRC_FIRST + 5
  85.     TelephoneIn = MLC_SRC_FIRST + 6
  86.     PCSpeakerIn = MLC_SRC_FIRST + 7
  87.     WaveOutIn = MLC_SRC_FIRST + 8
  88.     AuxiliaryIn = MLC_SRC_FIRST + 9
  89.     AnalogIn = MLC_SRC_FIRST + 10
  90. End Enum
  91. #If False Then
  92. Private DigitalOut, LineOut, MonitorOut, SpeakersOut, HeadphonesOut, TelephoneOut, WaveInOut, VoiceInOut
  93. Private DigitalIn, LineIn, MikrophoneIn, SynthesizerIn, CompactDiscIn, TelephoneIn, PCSpeakerIn, WaveOutIn, AuxiliaryIn, AnalogIn
  94. #End If
  95.  
  96. Public Enum SoundControls
  97.     Mute = MCT_BOOLEAN + 2
  98.     Mono = MCT_BOOLEAN + 3
  99.     Loudness = MCT_BOOLEAN + 4
  100.     StereoEnhance = MCT_BOOLEAN + 5
  101.     Volume = MCT_FADER + 1
  102.     Bass = MCT_FADER + 2
  103.     Treble = MCT_FADER + 3
  104.     Equalizer = MCT_FADER + 4
  105. End Enum
  106. #If False Then
  107. Private Loudness, Mute, StereoEnhance, Mono, Pan, Volume, Bass, Treble, Equalizer
  108. #End If
  109.  
  110. 'mixer handle
  111. Private hMixer As Long
  112.  
  113. 'mixer structures
  114. Private Type MIXERLINE
  115.     cbStruct            As Long 'size in bytes of MIXERLINE structure
  116.     dwDestination       As Long 'zero based destination index
  117.     dwSource            As Long 'zero based source index (if source)
  118.     dwLineID            As Long 'unique line id for mixer device
  119.     fdwLine             As Long 'state/information about line
  120.     dwUser              As Long 'driver specific information
  121.     dwComponentType     As Long 'component type line connects to
  122.     cChannels           As Long 'number of channels line supports
  123.     cConnections        As Long 'number of connections (possible)
  124.     cControls           As Long 'number of controls at this line
  125.     szShortName(1 To MIXER_SHORT_NAME_CHARS)    As Byte
  126.     szName(1 To MIXER_LONG_NAME_CHARS)          As Byte
  127.     dwType              As Long
  128.     dwDeviceID          As Long
  129.     wMid                As Integer
  130.     wPid                As Integer
  131.     vDriverVersion      As Long
  132.     szPname(1 To MAXPNAMELEN)  As Byte
  133. End Type
  134. Private ChannelLine As MIXERLINE
  135.  
  136. Private Type MIXERLINECONTROLS
  137.     cbStruct            As Long 'size in Byte of MIXERLINECONTROLS
  138.     dwLineID            As Long 'line id (from MIXERLINE.dwLineID)
  139.     dwControl           As Long 'MIXER_GETLINECONTROLSF_ONEBYID or MIXER_GETLINECONTROLSF_ONEBYTYPE
  140.     cControls           As Long 'count of controls pamxctrl points to
  141.     cbmxctrl            As Long 'size in Byte of _one_ MIXERCONTROL
  142.     pamxctrl            As Long 'pointer to first MIXERCONTROL array
  143. End Type
  144. Private ChannelControls As MIXERLINECONTROLS
  145.  
  146. Private Type MIXERCONTROL
  147.     cbStruct            As Long 'size in Byte of MIXERCONTROL
  148.     dwControlID         As Long 'unique control id for mixer device
  149.     dwControlType       As Long 'MIXERCONTROL_CONTROLTYPE_xxx
  150.     fdwControl          As Long 'MIXERCONTROL_CONTROLF_xxx
  151.     cMultipleItems      As Long 'if MIXERCONTROL_CONTROLF_MULTIPLE set
  152.     szShortName(1 To MIXER_SHORT_NAME_CHARS)   As Byte 'short name of control
  153.     szName(1 To MIXER_LONG_NAME_CHARS)         As Byte 'long name of control
  154.     lMinimum            As Long 'Minimum value
  155.     lMaximum            As Long 'Maximum value
  156.     reserved(10)        As Long 'reserved structure space
  157. End Type
  158. Private ValueControl As MIXERCONTROL
  159.  
  160. Private Type MIXERCONTROLDETAILS
  161.     cbStruct            As Long 'size in Byte of MIXERCONTROLDETAILS
  162.     dwControlID         As Long 'control id to get/set details on
  163.     cChannels           As Long 'number of channels in paDetails array
  164.     item                As Long 'hwndOwner or cMultipleItems
  165.     cbDetails           As Long 'size of one details_XX struct
  166.     paDetails           As Long 'pointer to array of details_XX structs
  167. End Type
  168. Private ControlDetails As MIXERCONTROLDETAILS
  169.  
  170. 'Properties
  171. Private myValue         As Long
  172. Private myMinValue      As Long
  173. Private myMaxValue      As Long
  174. Private mySuccess       As Boolean
  175. Private myChannName     As String
  176. Private myCtrlName      As String
  177.  
  178. Public Property Get ChannelName() As String
  179.  
  180.   'returns the chosen channel name
  181.  
  182.     ChannelName = Left$(myChannName, InStr(myChannName, Chr$(0)) - 1)
  183.  
  184. End Property
  185.  
  186. Public Function Choose(Channel As Channels, SoundControl As SoundControls) As Boolean
  187.  
  188.     mySuccess = CBool(hMixer)
  189.     If mySuccess Then
  190.         myChannName = Chr$(0)
  191.         myCtrlName = myChannName
  192.         With ChannelLine
  193.             .cbStruct = Len(ChannelLine)
  194.             .dwComponentType = Channel
  195.         End With 'CHANNELLINE
  196.         If mixerGetLineInfo(hMixer, ChannelLine, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR Then
  197.             myCtrlName = StrConv(ChannelLine.szName, vbUnicode)
  198.             With ChannelControls
  199.                 .cbStruct = Len(ChannelControls)
  200.                 .dwLineID = ChannelLine.dwLineID
  201.                 .dwControl = SoundControl
  202.                 .cControls = 1
  203.                 .cbmxctrl = Len(ValueControl)
  204.                 .pamxctrl = VarPtr(ValueControl)
  205.             End With 'CHANNELCONTROLS
  206.             If mixerGetLineControls(hMixer, ChannelControls, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR Then
  207.                 With ValueControl
  208.                     .cbStruct = Len(ValueControl)
  209.                     myMinValue = .lMinimum
  210.                     myMaxValue = .lMaximum
  211.                     myChannName = StrConv(.szName, vbUnicode)
  212.                 End With 'VALUECONTROL
  213.               Else 'NOT MIXERGETLINECONTROLS(HMIXER,...
  214.                 mySuccess = False
  215.             End If
  216.           Else 'NOT MIXERGETLINEINFO(HMIXER,...
  217.             mySuccess = False
  218.         End If
  219.     End If
  220.     Choose = mySuccess
  221.  
  222. End Function
  223.  
  224. Private Sub Class_Initialize()
  225.  
  226.     TidyUp
  227.     mixerOpen hMixer, 0&, 0&, 0&, 0&
  228.     Choose SpeakersOut, Volume 'preset path to speaker volume
  229.  
  230. End Sub
  231.  
  232. Private Sub Class_Terminate()
  233.  
  234.     mixerClose hMixer
  235.     TidyUp
  236.  
  237. End Sub
  238.  
  239. Public Property Get ControlName() As String
  240.  
  241.   'returns the chosen sound control name
  242.  
  243.     ControlName = Left$(myCtrlName, InStr(myCtrlName, Chr$(0)) - 1)
  244.  
  245. End Property
  246.  
  247. Private Sub SetUpControlDetails(ByRef Value As Long)
  248.  
  249.     With ControlDetails
  250.         .cbStruct = Len(ControlDetails)
  251.         .item = 0
  252.         .dwControlID = ValueControl.dwControlID
  253.         .cChannels = 1
  254.         .cbDetails = Len(Value)
  255.         .paDetails = VarPtr(Value)
  256.     End With 'ControlDetails
  257.  
  258. End Sub
  259.  
  260. Public Property Get Success() As Boolean
  261.  
  262.   'returns success of last choice
  263.  
  264.     Success = mySuccess
  265.  
  266. End Property
  267.  
  268. Private Sub TidyUp()
  269.  
  270.     myValue = 0
  271.     myMinValue = 0
  272.     myMaxValue = 0
  273.     mySuccess = False
  274.     myChannName = vbNullString
  275.     myCtrlName = vbNullString
  276.     hMixer = 0
  277.  
  278. End Sub
  279.  
  280. Public Property Get Value() As Long
  281.  
  282.     If hMixer Then
  283.         SetUpControlDetails myValue
  284.         mixerGetControlDetails hMixer, ControlDetails, MIXER_CONTROLDETAILSF_VALUE
  285.         On Error Resume Next 'in case myMaxValue and myMinValue are equal, causing a divide by zero
  286.             Value = (myValue - myMinValue) * 100 / (myMaxValue - myMinValue) 'convert to %
  287.             If Err Then
  288.                 Value = 0
  289.             End If
  290.         On Error GoTo 0
  291.     End If
  292.  
  293. End Property
  294.  
  295. Public Property Let Value(ByVal Percent As Long)
  296.  
  297.     If hMixer Then
  298.         If Percent >= 0 And Percent <= 100 Then
  299.             myValue = (myMaxValue - myMinValue) * Percent / 100 + myMinValue 'convert to %
  300.             SetUpControlDetails myValue
  301.             mixerSetControlDetails hMixer, ControlDetails, MIXER_CONTROLDETAILSF_VALUE
  302.         End If
  303.     End If
  304.  
  305. End Property
  306.  
  307. ':) Ulli's VB Code Formatter V2.17.4 (2004-Aug-02 11:20) 163 + 131 = 294 Lines
  308.