/// <summary>Converts data buffer to desired format</summary> /// <param name="inlen">source length</param> /// <param name="outlen">destination length</param> /// <param name="inused">length of source buffer used</param> /// <param name="outused">length of destination buffer used</param> /// <param name="last">last conversion cycle</param> /// <returns>MMSYSERR</returns> private MMSYSERR Convert(uint inlen, uint outlen, ref uint inused, ref uint outused, bool last) { uint lngFlags; ACMSTREAMHEADER udtHdr = new ACMSTREAMHEADER(); lngFlags = ACM_STREAMCONVERTF_BLOCKALIGN; if (_bInFirst) { lngFlags = lngFlags | ACM_STREAMCONVERTF_START; } if (last) { lngFlags = lngFlags | ACM_STREAMCONVERTF_END; } MMSYSERR mmr; fixed(byte *pbtIn = _btInput, pbtOut = _btOutput) { { udtHdr.cbStruct = (uint)Marshal.SizeOf(udtHdr); udtHdr.cbSrcLength = inlen; udtHdr.cbDstLength = outlen; udtHdr.pbDst = pbtOut; udtHdr.pbSrc = pbtIn; mmr = acmStreamPrepareHeader(_hStream, ref udtHdr, 0); if (mmr == MMSYSERR.NOERROR) { _bInFirst = false; mmr = acmStreamConvert(_hStream, ref udtHdr, lngFlags); } if (mmr == MMSYSERR.NOERROR) { inused = (uint)udtHdr.cbSrcLengthUsed; outused = (uint)udtHdr.cbDstLengthUsed; _iKeepInBuffer = (uint)(udtHdr.cbSrcLength - udtHdr.cbSrcLengthUsed); if (_iKeepInBuffer > 0) // codec didn't use all the input bytes, // move them to the first index of the input buffer // to decode them with the next call to convert() fixed(byte *pbtFt = &_btInput[0], pbtIn2 = &_btInput[(inlen - _iKeepInBuffer)]) { RtlMoveMemory(pbtFt, pbtIn2, _iKeepInBuffer); } } acmStreamUnprepareHeader(_hStream, ref udtHdr, 0); } return(mmr); } }
public static extern int acmStreamConvert(IntPtr has, ref ACMSTREAMHEADER pash, int pdwConvert);
public static extern int acmStreamUnprepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, int fdwUnprepare);
private static extern MMSYSERR acmStreamConvert(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwConvert);
private static extern MMSYSERR acmStreamUnprepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwUnprepare);
public static void AcmStreamUnprepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwUnprepare) => MMErrCheck(acmStreamUnprepareHeader(has, ref pash, fdwUnprepare));
public static void AcmStreamConvert(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwConvert) => MMErrCheck(acmStreamConvert(has, ref pash, fdwConvert));
private static extern MMRESULT acmStreamPrepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwPrepare);