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); }
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); }
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); }
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(); } }
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); }
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); }
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); }