Пример #1
0
        /// <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);
            }
        }
Пример #2
0
 public static extern int acmStreamConvert(IntPtr has, ref ACMSTREAMHEADER pash, int pdwConvert);
Пример #3
0
 public static extern int acmStreamUnprepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, int fdwUnprepare);
Пример #4
0
 private static extern MMSYSERR acmStreamConvert(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwConvert);
Пример #5
0
 private static extern MMSYSERR acmStreamUnprepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, uint fdwUnprepare);
Пример #6
0
 public static void AcmStreamUnprepareHeader(IntPtr has,
                                             ref ACMSTREAMHEADER pash,
                                             uint fdwUnprepare)
 => MMErrCheck(acmStreamUnprepareHeader(has, ref pash, fdwUnprepare));
Пример #7
0
 public static void AcmStreamConvert(IntPtr has,
                                     ref ACMSTREAMHEADER pash,
                                     uint fdwConvert)
 => MMErrCheck(acmStreamConvert(has, ref pash, fdwConvert));
Пример #8
0
 private static extern MMRESULT acmStreamPrepareHeader(IntPtr has,
                                                       ref ACMSTREAMHEADER pash,
                                                       uint fdwPrepare);
Пример #9
0
 public static extern int acmStreamUnprepareHeader(IntPtr has, ref ACMSTREAMHEADER pash, int fdwUnprepare);
Пример #10
0
 public static extern int acmStreamConvert(IntPtr has, ref ACMSTREAMHEADER pash, int pdwConvert);