Beispiel #1
0
        public override void Write(byte[] buffer, int offset, int count)
        {
            do
            {
                int cb         = 0;
                int bufferSize = hdr1.cbSrcLength;
                if (ptrBuffer1 == hdr1.cbSrcLength || count == 0)
                {
                    if (count == 0)
                    {
                        hdr1.cbSrcLength = ptrBuffer1;
                    }

                    AcmStreamConvertFlags flags;
                    flags = AcmStreamConvertFlags.BLOCKALIGN;

                    if (firstBlock)
                    {
                        flags      = AcmStreamConvertFlags.START;
                        firstBlock = false;
                    }
                    else if (count != 0 || ptrBuffer1 > 0)
                    {
                        flags = AcmStreamConvertFlags.BLOCKALIGN;
                    }
                    else
                    {
                        flags = AcmStreamConvertFlags.END;
                    }

                    MMResult mmr = AcmNativeMethods.acmStreamConvert(hStreamComp, ref hdr1, flags);

                    ptrBuffer1       = 0;
                    hdr1.cbSrcLength = bufferSize;
                    base.Write(outBuffer1, 0, hdr1.cbDstLengthUsed);
                }

                cb = Math.Min(hdr1.cbSrcLength - ptrBuffer1, count);
                Array.Copy(buffer, offset, inBuffer1, ptrBuffer1, cb);
                count      -= cb;
                ptrBuffer1 += cb;
                offset     += cb;
            } while (count > 0);
        }
Beispiel #2
0
        protected override void LoadHeader()
        {
            base.LoadHeader();

            byte[] fmtIn = _fmt.GetBytes();
            if (_fmt2 == null)
            {
                _fmt2 = WaveFormat2.GetPCMWaveFormat(_fmt.SamplesPerSec, _fmt.Channels, _fmt.BitsPerSample != 0 ? _fmt.BitsPerSample : (short)16);
            }
            byte[]   fmtOut = _fmt2.GetBytes();
            MMResult mmr;

            _fmt2         = new WaveFormat2(fmtOut);
            mmr           = AcmNativeMethods.acmStreamOpen(out hStreamComp, IntPtr.Zero, fmtIn, fmtOut, IntPtr.Zero, 0, 0, AcmStreamOpenFlags.CALLBACK_NULL);
            hdr1          = new ACMSTREAMHEADER();
            hdr1.cbStruct = Marshal.SizeOf(hdr1);
            hdr2          = new ACMSTREAMHEADER();
            hdr2.cbStruct = Marshal.SizeOf(hdr2);

            int cbIn = (_fmt.AvgBytesPerSec * DefaultBufferSizeInSeconds / _fmt.BlockAlign + 1) * _fmt.BlockAlign;

            inBuffer1 = new byte[cbIn];
            inBuffer2 = new byte[cbIn];
            int cbOut = _fmt2.BlockAlign * _fmt2.AvgBytesPerSec * DefaultBufferSizeInSeconds;

            mmr         = AcmNativeMethods.acmStreamSize(hStreamComp, cbIn, out cbOut, AcmStreamSizeFlags.SOURCE);
            outBuffer1  = new byte[cbOut];
            outBuffer2  = new byte[cbOut];
            hinBuffer1  = GCHandle.Alloc(inBuffer1, GCHandleType.Pinned);
            houtBuffer1 = GCHandle.Alloc(outBuffer1, GCHandleType.Pinned);
            hinBuffer2  = GCHandle.Alloc(inBuffer2, GCHandleType.Pinned);
            houtBuffer2 = GCHandle.Alloc(outBuffer2, GCHandleType.Pinned);

            hdr1.pbSrc       = hinBuffer1.AddrOfPinnedObject();
            hdr1.pbDst       = houtBuffer1.AddrOfPinnedObject();
            hdr1.cbSrcLength = cbIn;
            hdr1.cbDstLength = cbOut;

            hdr2.pbSrc       = hinBuffer2.AddrOfPinnedObject();
            hdr2.pbDst       = houtBuffer2.AddrOfPinnedObject();
            hdr2.cbSrcLength = cbIn;
            hdr2.cbDstLength = cbOut;

            ptrBuffer1 = ptrBuffer1 = 0;

            bufferRead = new SlidingBuffer(cbOut);
            firstBlock = true;

            bufferRead.BufferStarving = (BufferStarvingHandler) delegate(SlidingBuffer obj, int spaceAvailable)
            {
                if (hdr1.cbDstLengthUsed == ptrBuffer1)
                {
                    int cb = ReadInternal(inBuffer1, 0, inBuffer1.Length);
                    if (cb == 0)
                    {
                        return(0);
                    }
                    ptrBuffer1 = 0;
                    AcmStreamConvertFlags flags;
                    if (firstBlock)
                    {
                        flags      = AcmStreamConvertFlags.START;
                        firstBlock = false;
                    }
                    else if (cb == inBuffer1.Length)
                    {
                        flags = AcmStreamConvertFlags.BLOCKALIGN;
                    }
                    else
                    {
                        flags = AcmStreamConvertFlags.END;
                    }

                    hdr1.cbSrcLength = cb;
                    MMResult res = AcmNativeMethods.acmStreamConvert(hStreamComp, ref hdr1, flags);
                    return(cb);
                }

                int written = obj.Append(outBuffer1, ptrBuffer1, hdr1.cbDstLengthUsed - ptrBuffer1);
                ptrBuffer1 += written;
                return(written);
            };

            mmr = AcmNativeMethods.acmStreamPrepareHeader(hStreamComp, ref hdr1, 0);
            mmr = AcmNativeMethods.acmStreamPrepareHeader(hStreamComp, ref hdr2, 0);
        }