www.pudn.com > shrinkVideo.rar > ACM.bas


Attribute VB_Name = "mACM" 
'**************************************************************** 
'*  VB file:   ACM.bas... VB32 wrapper for Win32 ACM functions 
'* 
'*  created:        1998 by Ray Mercer 
'*  last modified:  12/2/98 by Ray Mercer (added comments) 
'* 
'* 
'*  Some useful defines and functions for using the Windows 
'*  Audio Compression Manager from Visual Basic 
'* 
'*  Copyright (c) 1998 Ray Mercer.  All rights reserved. 
'**************************************************************** 
 
Option Explicit 
 
'WAVEFORMATEX is from MS Voice sample on VB5 CD 
Public Const MAXEXTRABYTES = 3          ' Maximum (Extra Bytes + 1) In Non PCM Wave Formats... 
Type WAVEFORMATEX 
    wFormatTag As Integer       ' format type 
    nChannels As Integer        ' number of channels (i.e. mono, stereo, etc.) 
    nSamplesPerSec As Long      ' sample rate 
    nAvgBytesPerSec As Long     ' for buffer estimation 
    nBlockAlign As Integer      ' block size of data 
    wBitsPerSample As Integer   ' Bits Per Sample 
    cbSize As Integer           ' Size Of (FACT CHUNK) 
    xBytes(MAXEXTRABYTES) As Byte ' (FACT CHUNK) 
End Type 
 
Type WAVEHDR 
    lpData As Long              ' pointer to locked data buffer 
    dwBufferLength As Long      ' length of data buffer 
    dwBytesRecorded As Long     ' used for input only 
    dwUser As Long              ' for client's use 
    dwFlags As Long             ' assorted flags (see defines) 
    dwLoops As Long             ' loop control counter 
    wavehdr_tag As Long         ' reserved for driver 
    Reserved As Long            ' reserved for driver 
    hData As Long               ' handle to locked data buffer 
End Type 
 
 
'//AUDIO DEFINES (from msacm.h) 
Public Const ACMFORMATTAGDETAILS_FORMATTAG_CHARS As Long = 48 
Public Const ACMFORMATDETAILS_FORMAT_CHARS As Long = 128 
Public Type ACMFORMATTAGDETAILSTRUCT 
    cbStruct As Long 
    dwFormatTagIndex As Long 
    dwFormatTag As Long 
    cbFormatSize As Long 
    fdwSupport As Long 
    cStandardFormats As Long 
    szFormatTag As String * ACMFORMATTAGDETAILS_FORMATTAG_CHARS 
End Type 
Public Declare Function acmFormatTagDetails Lib "msacm32.dll" Alias "acmFormatTagDetailsA" _ 
                                (ByVal had As Long, _ 
                                    ByRef paftd As ACMFORMATTAGDETAILSTRUCT, _ 
                                    ByVal fdwDetails As Long) As Long  'returns MMResult 
Public Const ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT  As Long = &H40& 
Public Type ACMFORMATCHOOSESTRUCT 
    cbStruct As Long 
    fdwStyle As Long 
    hwndOwner As Long 
    pwfx As Long ' can be WAVEFORMATEX 
    cbwfx As Long 
    pszTitle As String 
    szFormatTag As String * ACMFORMATTAGDETAILS_FORMATTAG_CHARS 
    szFormat As String * ACMFORMATDETAILS_FORMAT_CHARS 
    pszName As String 
    cchName As Long 
    fdwEnum As Long 
    pwfxEnum As Long ' can be a WAVEFORMATEX 
    hInstance As Long 
    pszTemplateName As Long 'can be a string 
    lCustData As Long 
    pfnHook As Long 
End Type 
Public Declare Function acmFormatChoose Lib "msacm32.dll" Alias "acmFormatChooseA" _ 
                                        (ByRef acmFormat As ACMFORMATCHOOSESTRUCT) As Long  ' returns MMResult 
 
Public Const ACM_METRIC_MAX_SIZE_FORMAT  As Long = 50 
Public Const ACM_FORMATENUMF_HARDWARE    As Long = &H400000 
Public Const ACM_FORMATENUMF_INPUT      As Long = &H800000 
Public Declare Function acmMetrics Lib "msacm32.dll" _ 
                                        (ByVal hao As Long, _ 
                                        ByVal uMetric As Long, _ 
                                        ByVal pMetric As Long) As Long ' returns MMResult 
 
'**************************************************************** 
'* FUNCTION SetAudioFormatDlg() 
'* =============== 
'* By Ray Mercer, 1998 
'* 
'* Displays a system-defined dialog which allows the 
'* user to select an ACM audio format 
'* 
'* INPUTS: 
'* ownerHwnd - hWnd of parent window or 0& if no modality is desired 
'* 
'* RETURNS: 
'*  
'**************************************************************** 
Sub SetAudioFormatDlg(ByVal ownerHwnd As Long) 
 
Dim retVal As Long 
Dim dwSize As Long 
Dim acmFormat As ACMFORMATCHOOSESTRUCT 
Dim hFormatData As Long 'handle to memory location 
Dim pFormatData As Long 'pointer to locked memory buffer 
Dim maxLenWavFormat As Long 
Dim curLenWavFormat As Long 
Dim formatTag As String 
Dim formatAttributes As String 
 
'alloc string buffers for format tags (note- I haven't implemented saving and restoring these 
' because this doesn't seem to be implemented in VidCap32 either - excercise for reader :-) 
formatTag = String$(ACMFORMATTAGDETAILS_FORMATTAG_CHARS, 0) 
formatAttributes = String$(ACMFORMATDETAILS_FORMAT_CHARS, 0) 
' Ask the ACM what the largest wave format is..... 
retVal = acmMetrics(0&, ACM_METRIC_MAX_SIZE_FORMAT, VarPtr(maxLenWavFormat)) 
If MMSYSERR_NOERROR = retVal Then 
    'allocate mem "C-style" (this is easier than working with huge structs) 
    hFormatData = GlobalAlloc(GMEM_MOVEABLE Or GMEM_SHARE Or GMEM_ZEROINIT, maxLenWavFormat) ' Allocate Global Memory 
    Debug.Assert hFormatData <> 0 
    pFormatData = GlobalLock(hFormatData)    ' Lock Memory handle 
    Debug.Assert pFormatData <> 0 
    'Get the current audio format size 
    curLenWavFormat = capGetAudioFormatSize(frmMain.capwnd) 
    Debug.Assert curLenWavFormat <> 0 
    'Get the current audio format 
    retVal = capGetAudioFormatAsArray(frmMain.capwnd, pFormatData, curLenWavFormat) 
    With acmFormat 
        .cbStruct = Len(acmFormat) 
        .fdwStyle = ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT 
        .fdwEnum = ACM_FORMATENUMF_HARDWARE Or ACM_FORMATENUMF_INPUT 
        .hwndOwner = ownerHwnd 
        .pwfx = pFormatData 
        .cbwfx = curLenWavFormat 
        .pszTitle = "Select Sound Format" 
        .szFormatTag = formatTag  'returns valid data but not used (see note on format tag details above) 
        .szFormat = formatAttributes 'ditto 
        .hInstance = 0&  'careful! this should be null unless you are using templates 
    End With 
    retVal = acmFormatChoose(acmFormat) 
    If MMSYSERR_NOERROR = retVal Then 
        Call CopyPTRtoLONG(dwSize, pFormatData + 16, 4) 'pull the length field out of the byte array 
        retVal = capSetAudioFormatAsArray(frmMain.capwnd, pFormatData, dwSize) 
        'macros return FALSE on error 
        If 0 = retVal Then MsgBox "Could not set new audio format", vbInformation, App.Title 
    End If 
    'free the locked mem 
    Call GlobalUnlock(pFormatData) 
    Call GlobalFree(hFormatData) 
Else 
    MsgBox "Windows ACM returned an error", vbInformation, App.Title 
End If 
 
End Sub