Advertisement
cocus

cIAudioMeterInformation

Jun 26th, 2012
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2.  
  3. '---------------------------------------------------------------------------------------
  4. ' Modulo      : clsIAudioMeterInformation
  5. ' Autor       : Cocus (coco_electro@hotmail, santiagohssl@gmail.com)
  6. ' Fecha       : 24/03/2011 22:54
  7. ' Uso         : Ojito con lo que haces con esto! Yo te dejo que lo uses donde quieras,
  8. '               pero tenes que mencionar a el/los autores de este modulo en alguna parte
  9. '               del software. NO PODES USAR EL EJEMPLO TAL CUAL ESTA PARA VENDER!!! :@
  10. '               Para eso, date un tiempito y editalo un poco.
  11. ' Referencias :
  12. '               http://planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=72856&lngWId=1
  13. '               http://www.vbstreets.ru/VB/Articles/65974.aspx
  14. '               http://www.portaudio.com/docs/v19-doxydocs/endpointvolume_8h-source.html
  15. ' Thanks      : raul338
  16. ' Proposito   : Obtener el valor del vumetro de Windows Vista / 7
  17. ' Revisiones  : #0 24/03/2011 - Cocus: Primera revision
  18. '---------------------------------------------------------------------------------------
  19.  
  20. Private Declare Sub OleInitialize Lib "ole32.dll" (pvReserved As Any)
  21. Private Declare Sub OleUninitialize Lib "ole32.dll" ()
  22. Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpsz As String, pclsid As UUID) As Long
  23. Private Declare Function IIDFromString Lib "ole32.dll" (ByVal lpsz As String, lpiid As UUID) As Long
  24. Private Declare Function CoCreateInstance Lib "ole32.dll" (rclsid As UUID, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As UUID, ppv As Any) As Long
  25.  
  26. Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  27. Private Declare Function PutMem2 Lib "msvbvm60" (ByVal pWORDDst As Long, ByVal NewValue As Long) As Long
  28. Private Declare Function PutMem4 Lib "msvbvm60" (ByVal pDWORDDst As Long, ByVal NewValue As Long) As Long
  29. Private Declare Function GetMem4 Lib "msvbvm60" (ByVal pDWORDSrc As Long, ByVal pDWORDDst As Long) As Long
  30. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  31. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  32.  
  33. Private Declare Function GetVersion Lib "kernel32" () As Long
  34.  
  35. Private Const GMEM_FIXED As Long = &H0
  36. Private Const asmPUSH_imm32 As Byte = &H68
  37. Private Const asmRET_imm16 As Byte = &HC2
  38. Private Const asmCALL_rel32 As Byte = &HE8
  39.  
  40. Private Const CLSCTX_INPROC_SERVER                      As Long = &H1
  41. Private Const CLSCTX_ALL                                As Long = &H0
  42.  
  43. Private Const UUIDOF_MMDeviceEnumerator As String = "{bcde0395-e52f-467c-8e3d-c4579291692e}"
  44. Private Const UUIDOF_IMMDeviceEnumerator As String = "{a95664d2-9614-4f35-a746-de8db63617e6}"
  45. Private Const UUIDOF_IAudioMeterInformation As String = "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
  46.  
  47. Private Type UUID
  48.   Data1 As Long
  49.   Data2 As Integer
  50.   Data3 As Integer
  51.   Data4(0 To 7) As Byte
  52. End Type
  53.  
  54. Private Enum IUnknown_Exports
  55.     [QueryInterface] = 0
  56.     [AddRef] = 1
  57.     [Release] = 2
  58. End Enum
  59.  
  60. Private Enum ERole
  61.     [eConsole]
  62.     [eMultimedia]
  63.     [eCommunications]
  64. End Enum
  65.  
  66. Private Enum EDataFlow
  67.     [eRender]
  68.     [eCapture]
  69.     [eAll]
  70. End Enum
  71.  
  72. Private Enum IMMDeviceEnumerator_Exports
  73.     [EnumAudioEndpoints] = 3
  74.     [GetDefaultAudioEndpoint] = 4               'params=3
  75.    [GetDevice] = 5
  76.     [RegisterEndpointNotificationCallback] = 6
  77.     [UnregisterEndpointNotificationCallback]
  78. End Enum
  79.  
  80. Private Enum IAudioMeterInformation_Exports
  81.     [GetPeakValue] = 3                          'params=1
  82.    [GetMeteringChannelCount] = 4               'params=1
  83.    [GetChannelsPeakValues] = 5                 'params=2
  84.    [QueryHardwareSupport] = 6
  85. End Enum
  86.  
  87. Private Enum IMMDevice_Exports
  88.     [Activate] = 3                              'params=4
  89.    [OpenPropertyStore] = 4
  90.     [GetId] = 5
  91.     [GetState] = 6
  92. End Enum
  93.  
  94. Private c_lngObjDevEnumerator                           As Long
  95. Private c_lngObjIMMDevice                               As Long
  96. Private c_lngObjAudioMeterInformation                   As Long
  97. Private c_blnInitialized                                As Boolean
  98.  
  99. '    // Get enumerator for audio endpoint devices.
  100. '    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
  101. '                          NULL, CLSCTX_INPROC_SERVER,
  102. '                          __uuidof(IMMDeviceEnumerator),
  103. '                          (void**)&pEnumerator);
  104.  
  105.  
  106. '    // Get peak meter for default audio-rendering device.
  107. '    hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
  108.  
  109.  
  110. '    hr = pDevice->Activate(__uuidof(IAudioMeterInformation),
  111. '                           CLSCTX_ALL, NULL, (void**)&pMeterInfo);
  112.  
  113.  
  114. Private Sub Class_Initialize()
  115.     Dim uuidMMDeviceEnumerator As UUID
  116.     Dim uuidIMMDeviceEnumerator As UUID
  117.     Dim uuidIAudioMeterInformation As UUID
  118.    
  119.     If IsVista Then
  120.         Call IIDFromString(StrConv(UUIDOF_MMDeviceEnumerator, vbUnicode), uuidMMDeviceEnumerator)
  121.         Call IIDFromString(StrConv(UUIDOF_IMMDeviceEnumerator, vbUnicode), uuidIMMDeviceEnumerator)
  122.         Call IIDFromString(StrConv(UUIDOF_IAudioMeterInformation, vbUnicode), uuidIAudioMeterInformation)
  123.        
  124.         Call CoCreateInstance(uuidMMDeviceEnumerator, 0, CLSCTX_INPROC_SERVER, uuidIMMDeviceEnumerator, c_lngObjDevEnumerator)
  125.         If Not (c_lngObjDevEnumerator = 0) Then
  126.             Call CallInterface(c_lngObjDevEnumerator, [GetDefaultAudioEndpoint], 3, [eRender], [eConsole], VarPtr(c_lngObjIMMDevice))
  127.             If Not (c_lngObjIMMDevice = 0) Then
  128.                 Call CallInterface(c_lngObjIMMDevice, [Activate], 4, VarPtr(uuidIAudioMeterInformation), CLSCTX_ALL, 0, VarPtr(c_lngObjAudioMeterInformation))
  129.                 c_blnInitialized = Not (c_lngObjAudioMeterInformation = 0)
  130.             End If
  131.         End If
  132.     End If
  133. End Sub
  134.  
  135. Private Sub Class_Terminate()
  136.     If IsVista Then
  137.         If Not (c_lngObjDevEnumerator = 0) Then Call CallInterface(c_lngObjDevEnumerator, [Release], 0)
  138.         If Not (c_lngObjIMMDevice = 0) Then Call CallInterface(c_lngObjIMMDevice, [Release], 0)
  139.         If Not (c_lngObjAudioMeterInformation = 0) Then Call CallInterface(c_lngObjAudioMeterInformation, [Release], 0)
  140.     End If
  141. End Sub
  142.  
  143. Private Function IsVista() As Boolean
  144.     IsVista = (((GetVersion() And &HFFFF&) Mod 256) >= 6)
  145. End Function
  146.  
  147. Public Function GetPeak() As Single
  148.     If IsVista Then
  149.         If c_blnInitialized Then
  150.             Call CallInterface(c_lngObjAudioMeterInformation, [GetPeakValue], 1, VarPtr(GetPeak))
  151.         End If
  152.     End If
  153. End Function
  154.  
  155. Public Function GetChannelPeak(ByVal lngChannel As Long) As Single
  156.     Dim lngChannels As Long
  157.     Dim sngChannels() As Single
  158.    
  159.     If IsVista Then
  160.         If c_blnInitialized Then
  161.             Call CallInterface(c_lngObjAudioMeterInformation, [GetMeteringChannelCount], 1, VarPtr(lngChannels))
  162.             ReDim sngChannels(lngChannels)
  163.             Call CallInterface(c_lngObjAudioMeterInformation, [GetChannelsPeakValues], 2, lngChannels, VarPtr(sngChannels(0)))
  164.             GetChannelPeak = sngChannels(lngChannel)
  165.         End If
  166.     End If
  167. End Function
  168.  
  169. Private Function CallInterface(ByVal pInterface As Long, ByVal Member As Long, ByVal ParamsCount As Long, Optional ByVal p1 As Long = 0, Optional ByVal p2 As Long = 0, Optional ByVal p3 As Long = 0, Optional ByVal p4 As Long = 0, Optional ByVal p5 As Long = 0, Optional ByVal p6 As Long = 0, Optional ByVal p7 As Long = 0, Optional ByVal p8 As Long = 0, Optional ByVal p9 As Long = 0, Optional ByVal p10 As Long = 0) As Long
  170.   Dim i As Long, t As Long
  171.   Dim hGlobal As Long, hGlobalOffset As Long
  172.  
  173.   If ParamsCount < 0 Then Err.Raise 5 'invalid call
  174.  If pInterface = 0 Then Err.Raise 5
  175.  
  176.   '5 áàéò äëÿ çàïèõèâàíèÿ êàæäîãî ïàðàìåòðà â ñòåê
  177.  ' 5 Bytes por parametro (4 bytes + PUSH)
  178.  '5 áàéò - PUSH this
  179.  ' 5 Bytes = 1 push + Puntero a interfaz
  180.  '5 áàéò - âûçîâ ìåìáåðà
  181.  '3 áàéòà - ret 0x0010, âûïèõèâàÿ ïðè ýòîì è ïàðàìåòðû CallWindowProc
  182.  '1 áàéò - âûðàâíèâàíèå, ïîñêîëüêó ïîñëåäíèé PutMem4 òðåáóåò 4 áàéòà.
  183.  
  184.   hGlobal = GlobalAlloc(GMEM_FIXED, 5 * ParamsCount + 5 + 5 + 3 + 1)
  185.   If hGlobal = 0 Then Err.Raise 7 'insuff. memory
  186.  hGlobalOffset = hGlobal
  187.  
  188.   If ParamsCount > 0 Then
  189.     t = VarPtr(p1)
  190.     For i = ParamsCount - 1 To 0 Step -1
  191.       Call PutMem2(hGlobalOffset, asmPUSH_imm32)
  192.       hGlobalOffset = hGlobalOffset + 1
  193.       Call GetMem4(t + i * 4, hGlobalOffset)
  194.       hGlobalOffset = hGlobalOffset + 4
  195.     Next
  196.   End If
  197.  
  198.   'Ïåðâûé ïàðàìåòð ëþáîãî èíòåðôåéñíîãî ìåòîäà - this. Äåëàåì...
  199.  Call PutMem2(hGlobalOffset, asmPUSH_imm32)
  200.   hGlobalOffset = hGlobalOffset + 1
  201.   Call PutMem4(hGlobalOffset, pInterface)
  202.   hGlobalOffset = hGlobalOffset + 4
  203.  
  204.   'Âûçîâ ìåìáåðà èíòåðôåéñà
  205.  Call PutMem2(hGlobalOffset, asmCALL_rel32)
  206.   hGlobalOffset = hGlobalOffset + 1
  207.   Call GetMem4(pInterface, VarPtr(t))     'äåðåôåðåíñ: íàõîäèì ïîëîæåíèå vTable
  208.  Call GetMem4(t + Member * 4, VarPtr(t)) 'ñìåùåíèå ïî vTable, ïîñëå ÷åãî äåðåôåðåíñ îíîãî
  209.  Call PutMem4(hGlobalOffset, t - hGlobalOffset - 4)
  210.   hGlobalOffset = hGlobalOffset + 4
  211.  
  212.   'Èíòåðôåéñû stdcall. Ïîýòîìó íå áóäåì cdecl ó÷èòûâàòü.
  213.    
  214.   Call PutMem4(hGlobalOffset, &H10C2&)        'ret 0x0010
  215.  
  216.   CallInterface = CallWindowProc(hGlobal, 0, 0, 0, 0)
  217.  
  218.   Call GlobalFree(hGlobal)
  219. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement