Ejemplo n.º 1
0
        internal static AcmFormatInfo FromFormatTagDetails(ACMFORMATTAGDETAILS details, IntPtr hDriver, int driverId)
        {
            if (driverId == 0)
            {
                AcmNativeMethods.acmDriverID(hDriver, out driverId, 0);
            }
            AcmFormatInfo info = new AcmFormatInfo();

            info.DriverId = driverId;
            //info.Format = new WaveFormat2(
            info.FormatName = details.szFormatTag;
            info.FormatTag  = (FormatTag)details.dwFormatTag;

            for (int i = 0; i < details.cStandardFormats; i++)
            {
                ACMFORMATDETAILS fd = new ACMFORMATDETAILS();
                fd.cbStruct = Marshal.SizeOf(fd);
                fd.cbwfx    = details.cbFormatSize;
                WaveFormat2 fmt = new WaveFormat2(new byte[fd.cbwfx]);
                fmt.FormatTag = (FormatTag)details.dwFormatTag;
                fmt.Size      = (short)(fd.cbwfx == 16 ? 0 : fd.cbwfx - 18);
                fmt.Extra     = new byte[fmt.Size];
                fd.pwfx       = Marshal.AllocHGlobal(fd.cbwfx);
                Marshal.Copy(fmt.GetBytes(), 0, fd.pwfx, fd.cbwfx);
                fd.dwFormatIndex = i;
                fd.dwFormatTag   = (int)info.FormatTag;
                /*MMResult mmr = */
                int    mmr     = AcmNativeMethods.acmFormatDetails(hDriver, ref fd, AcmFormatDetailsFlags.INDEX);
                byte[] fmtData = new byte[fd.cbwfx];
                Marshal.Copy(fd.pwfx, fmtData, 0, fd.cbwfx);
                info.Format = new WaveFormat2(fmtData);
                Marshal.FreeHGlobal(fd.pwfx);
            }
            return(info);
        }
Ejemplo n.º 2
0
        private static int AcmDriverEnumFunc(IntPtr hadid, int dwInstance, int fdwSupport)
        {
            ACMDRIVERDETAILS details = new ACMDRIVERDETAILS();

            details.cbStruct = Marshal.SizeOf(details);
            AcmNativeMethods.acmDriverDetails(hadid, ref details, 0);
            _listDetails.Add(AcmDriverInfo.FromDriverDetails(details, hadid.ToInt32()));
            return(1);
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        public override void Close()
        {
            Flush();

            if ((hdr1.fdwStatus & AcmStreamHeaderStatus.PREPARED) != 0)
            {
                AcmNativeMethods.acmStreamUnprepareHeader(hStreamComp, ref hdr1, 0);
            }
            if ((hdr2.fdwStatus & AcmStreamHeaderStatus.PREPARED) != 0)
            {
                AcmNativeMethods.acmStreamUnprepareHeader(hStreamComp, ref hdr2, 0);
            }

            if (hStreamComp != IntPtr.Zero)
            {
                AcmNativeMethods.acmStreamClose(hStreamComp, 0);
            }
            hStreamComp = IntPtr.Zero;

            if (hinBuffer1.IsAllocated)
            {
                hinBuffer1.Free();
            }
            if (hinBuffer2.IsAllocated)
            {
                hinBuffer2.Free();
            }
            if (houtBuffer1.IsAllocated)
            {
                houtBuffer1.Free();
            }
            if (houtBuffer2.IsAllocated)
            {
                houtBuffer2.Free();
            }

            if (_baseStream != null)
            {
                _baseStream.Close();
            }
        }
Ejemplo n.º 5
0
        internal static AcmDriverInfo FromDriverDetails(ACMDRIVERDETAILS details, int driverId)
        {
            AcmDriverInfo info = new AcmDriverInfo();

            info.DriverId    = driverId;
            info.Flags       = details.fdwSupport;
            info.ShortName   = details.szShortName;
            info.LongName    = details.szLongName;
            info.Description = details.szFeatures;
            info._formats    = new List <AcmFormatInfo>();
            IntPtr hDrv;

            AcmNativeMethods.acmDriverOpen(out hDrv, driverId, 0);
            ACMFORMATTAGDETAILS afdt = new ACMFORMATTAGDETAILS();

            afdt.cbStruct = Marshal.SizeOf(afdt);
            IntPtr pafd = Marshal.AllocHGlobal(afdt.cbStruct);

            Marshal.StructureToPtr(afdt, pafd, false);
            AcmNativeMethods.acmFormatTagEnum(hDrv, /*ref afdt*/ pafd, info.AcmFormatTagEnumCB, (int)hDrv, 0);
            Marshal.FreeHGlobal(pafd);
            AcmNativeMethods.acmDriverClose(hDrv, 0);
            return(info);
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
        protected override bool InitializeForWriting(Stream underlyingStream, WaveFormat2 wfIn, WaveFormat2 wfOut, bool fAppend)
        {
            base.InitializeForWriting(underlyingStream, wfIn, wfOut, fAppend);
            MMResult mmr;

            int driverId = 0;

            foreach (AcmDriverInfo drvInfo in ACMSupport.SupportedDrivers)
            {
                foreach (AcmFormatInfo fmtInfo in drvInfo.Formats)
                {
                    if (fmtInfo.Format == wfOut)
                    {
                        driverId = fmtInfo.DriverId;
                        break;
                    }
                }
            }

            foreach (AcmDriverInfo drvInfo in ACMSupport.SupportedDrivers)
            {
                foreach (AcmFormatInfo fmtInfo in drvInfo.Formats)
                {
                    if (fmtInfo.DriverId == driverId && fmtInfo.Format.FormatTag == wfIn.FormatTag)
                    {
                        wfIn.CopyFrom(fmtInfo.Format);
                        break;
                    }
                }
            }

            byte[] fmtIn  = wfIn.GetBytes();
            byte[] fmtOut = wfOut.GetBytes();

            IntPtr hDrv = IntPtr.Zero;

            if (driverId != 0)
            {
                AcmNativeMethods.acmDriverOpen(out hDrv, driverId, 0);
            }
            mmr           = AcmNativeMethods.acmStreamOpen(out hStreamComp, hDrv, fmtIn, fmtOut, IntPtr.Zero, 0, 0, AcmStreamOpenFlags.CALLBACK_NULL | AcmStreamOpenFlags.NONREALTIME);
            hdr1          = new ACMSTREAMHEADER();
            hdr1.cbStruct = Marshal.SizeOf(hdr1);
            hdr2          = new ACMSTREAMHEADER();
            hdr2.cbStruct = Marshal.SizeOf(hdr2);

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

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

            mmr         = AcmNativeMethods.acmStreamSize(hStreamComp, cbIn, out cbOut, AcmStreamSizeFlags.DESTINATION);
            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;

            firstBlock = true;

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

            return(true);
        }