Re: ACM Convert - acmStreamOpen return 512



Hi all,

Can you explain me for what "ACMFORMATCHOOSE" is used? I tried to
convert PCM to GSM610 but I don't understand how I must do.
For the moment I get a INVALHANDLE error (5) on acmStreamOpen.
I think that the GSM struct is ok.

I tried to do this :

Dim ret = acmStreamOpen(m_hwi, IntPtr.Zero, m_wfmt, gsm610.wfx,
IntPtr.Zero, hwnd, IntPtr.Zero, ACM_STREAMOPENF_NONREALTIME)
ret = acmStreamPrepareHeader(m_hwi, PrepBuffer, 0)
ret = acmStreamConvert(m_hwi, PrepBuffer, 0)
ret = acmStreamUnPrepareHeader(m_hwi, PrepBuffer, 0)
ret = acmStreamClose(m_hwi, 0)

with these structures :

Public Class ACMFORMATCHOOSE
Public cbStruct As Long
Public fdwStyle As Long
Public hwndOwner As Long
Public pwfx As Wave.WAVEFORMATEX2
Public cbwfx As Long
Public pszTitle As String
Public szFormatTag As Byte '(0 To
ACMFORMATTAGDETAILS_FORMATTAG_CHARS - 1) As Byte
Public szFormat As Byte '(0 To ACMFORMATDETAILS_FORMAT_CHARS -
1) As Byte
Public pszName As String
Public cchName As Long
Public fdwEnum As Long
Public pwfxEnum As Long
Public hInstance As Long
Public pszTemplateName As String
Public lCustData As Long
Public pfnHook As Long
End Class

'structure that identifies the source and destination buffers to
be prepared.
Public Class ACMSTREAMHEADER
Public cbStruct As Integer
Public fdwStatus As Integer
Public dwUser As Long
Public pbSrc As Long
Public cbSrcLength As Integer
Public cbSrcLengthUsed As Integer
Public dwSrcUser As Integer
Public pbDst As Long
Public cbDstLength As Integer
Public cbDstLengthUsed As Integer
Public dwDstUser As Long
Public dwReservedDriver(10) As Integer
End Class

'structure wavefilter
Public Structure WAVEFILTER
Public cbStruct As Long
Public dwFilterTag As Integer
Public fdwFilter As Integer
Public dwReserved() As Integer
End Structure

'structure waveformatex de destination de convertion
Public Class WAVEFORMATEX
Public wFormatTag As Short
Public nChannels As Short
Public nSamplesPerSec As Integer
Public nAvgBytesPerSec As Integer
Public nBlockAlign As Short
Public wBitsPerSample As Short
Public cbSize As Short
'Public reserved As Short
End Class

Public Structure gsm610waveformat_tag
Public wfx As WAVEFORMATEX2
Public wSamplesPerBlock As Short
End Structure


I initialised it like that:

'src
m_wfmt = New WAVEFORMATEX
m_wfmt.wFormatTag = WAVEHDR.WAVE_FORMAT_PCM
m_wfmt.wBitsPerSample = 8
m_wfmt.nChannels = 1
m_wfmt.nSamplesPerSec = 11100
m_wfmt.nAvgBytesPerSec = Fix((m_wfmt.nSamplesPerSec *
m_wfmt.nChannels * m_wfmt.wBitsPerSample) / 8)
m_wfmt.nBlockAlign = Fix((m_wfmt.wBitsPerSample *
m_wfmt.nChannels) / 8)

'dest
gsm610 = New gsm610waveformat_tag
gsm610.wfx = New WAVEFORMATEX2
gsm610.wfx.wFormatTag = WAVE_FORMAT_GSM610
gsm610.wfx.nChannels = 1
gsm610.wfx.nSamplesPerSec = 8000
gsm610.wfx.nAvgBytesPerSec = 1625
gsm610.wfx.nBlockAlign = 65
gsm610.wfx.wBitsPerSample = 0
gsm610.wfx.cbSize = 2
gsm610.wSamplesPerBlock = 320


'prepBuffer
PrepBuffer = New ACMSTREAMHEADER
PrepBuffer.cbStruct = Marshal.SizeOf(PrepBuffer) '512
PrepBuffer.fdwStatus = 0
PrepBuffer.pbSrc = BufAvt(0)
PrepBuffer.cbSrcLength = BufAvt.Length
PrepBuffer.cbSrcLengthUsed = BufAvt.Length
PrepBuffer.pbDst = BufApr(0)
PrepBuffer.cbDstLength = BufApr.Length
PrepBuffer.cbDstLengthUsed = BufApr.Length

And with the constant :
Public Const ACM_STREAMOPENF_NONREALTIME = &H4
Public Const ACM_STREAMOPENF_QUERY = &H1
Public Const ACMFORMATCHOOSE_STYLEF_CONTEXTHELP = &H80&
Public Const ACMFORMATCHOOSE_STYLEF_ENABLEHOOK = &H8&
Public Const ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE = &H10&
Public Const ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE =
&H20&
Public Const ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT = &H40&
Public Const ACMFORMATCHOOSE_STYLEF_SHOWHELP = &H4&



Tomas Franek you said ( I create application for PocketPC and I find
that i cant
directly save to GSM610 ) I do exactly the same. Did you find a
solution?

Thanks.

.


Loading