|
||||
|
vbAccelerator - Contents of code file: WinMMInterop.csThis file is part of the download WaveStream CSharp, which is described in the article WaveStreamReader and WaveStreamWriter. using System; using System.Runtime.InteropServices; namespace vbAccelerator.Audio.WaveStream { /// <summary> /// Contains interop structures and method calls for Windows /// Multimedia (WinMM). /// </summary> internal class WinMMInterop { /// <summary> /// Structure describing the format of the data in a Wave file. /// </summary> [StructLayoutAttribute(LayoutKind.Sequential, Pack=2)] public struct WAVEFORMATEX { /// <summary> /// Waveform-audio format type. Format tags are registered with Microsoft /// Corporation for many compression algorithms. /// </summary> public short wFormatTag; /// <summary> /// Number of audio channels /// </summary> public short nChannels; /// <summary> /// Number of samples per second for the audio data. /// </summary> public int nSamplesPerSec; /// <summary> /// Average number of bytes per second in the audio data. /// For non-compressed audio, the average number of bytes /// is nSamplesPerSec * nBlockAlign. /// </summary> public int nAvgBytesPerSec; /// <summary> /// Alignment of samples in bits. /// </summary> public short nBlockAlign; /// <summary> /// Number of bits used for each audio sample. /// </summary> public short wBitsPerSample; /// <summary> /// Size of the structure (typically not used). /// </summary> public short cbSize; } /// <summary> /// Contains information about a file opened using multimedia IO. /// </summary> [StructLayoutAttribute(LayoutKind.Sequential)] public struct MMIOINFO { /// <summary> /// Flags specifying how a file was opened. The following values are defined: /// </summary> public int dwFlags; /// <summary> /// Four-character code identifying the file's I/O procedure. If the I/O procedure /// is not an installed I/O procedure, this member is NULL. /// </summary> public int fccIOProc; /// <summary> /// Pointer to file's IO procedure. /// </summary> public IntPtr pIOProc; /// <summary> /// Extended error value from the mmioOpen function if it returns NULL. /// </summary> public int wErrorRet; /// <summary> /// Handle to a local I/O procedure. Media Control Interface (MCI) devices that /// perform file I/O in the background and need an I/O procedure can locate /// a local I/O procedure with this handle. /// </summary> public IntPtr hTask; /// <summary> /// Size, in bytes, of the file's I/O buffer. If the file does not have an I/O buffer, /// this member is zero. /// </summary> public int cchBuffer; /// <summary> /// Pointer to the file's I/O buffer. If the file is unbuffered, this member is NULL. /// </summary> public IntPtr pchBuffer; /// <summary> /// Pointer to the next location in the I/O buffer to be read or written. If no more /// bytes can be read without calling the mmioAdvance or mmioRead function, this /// member points to the pchEndRead member. If no more bytes can be written without /// calling the mmioAdvance or mmioWrite function, this member points to the /// pchEndWrite member. /// </summary> public IntPtr pchNext; /// <summary> /// Pointer to the location that is 1 byte past the last location in the buffer /// that can be read. /// </summary> public IntPtr pchEndRead; /// <summary> /// Pointer to the location that is 1 byte past the last location in the buffer /// that can be written. /// </summary> public IntPtr pchEndWrite; /// <summary> /// Reserved. /// </summary> public int lBufOffset; /// <summary> /// Current file position, which is an offset, in bytes, from the beginning of /// the file. I/O procedures are responsible for maintaining this member. /// </summary> public int lDiskOffset; /// <summary> /// State information maintained by the I/O procedure. I/O procedures can also /// use these members to transfer information from the application to the I/O /// procedure when the application opens a file. /// </summary> public int adwInfo0; /// <summary> /// State information maintained by the I/O procedure. I/O procedures can also /// use these members to transfer information from the application to the I/O /// procedure when the application opens a file. /// </summary> public int adwInfo1; /// <summary> /// State information maintained by the I/O procedure. I/O procedures can also /// use these members to transfer information from the application to the I/O /// procedure when the application opens a file. /// </summary> public int adwInfo2; /// <summary> /// State information maintained by the I/O procedure. I/O procedures can also /// use these members to transfer information from the application to the I/O /// procedure when the application opens a file. /// </summary> public int adwInfo3; /// <summary> /// Reserved. /// </summary> public int dwReserved1; /// <summary> /// Reserved. /// </summary> public int dwReserved2; /// <summary> /// Handle to the open file, as returned by the mmioOpen function. I/O /// procedures can use this handle when calling other multimedia file I/O /// functions. /// </summary> public IntPtr hMMIO; } /// <summary> /// Information about a chunk in a RIFF file. /// </summary> [StructLayoutAttribute(LayoutKind.Sequential)] public struct MMCKINFO { /// <summary> /// Chunk identifier. /// </summary> public int ckid; /// <summary> /// Size, in bytes, of the data member of the chunk. The size of the data /// member does not include the 4-byte chunk identifier, the 4-byte /// chunk size, or the optional pad byte at the end of the data member. /// </summary> public int ckSize; /// <summary> /// Form type for "RIFF" chunks or the list type for "LIST" chunks. /// </summary> public int fccType; /// <summary> /// File offset of the beginning of the chunk's data member, relative /// to the beginning of the file. /// </summary> public int dwDataOffset; /// <summary> /// Flags specifying additional information about the chunk. Typically /// zero but can be MMIO_DIRTY indicating the size of the chunk has /// changed. /// </summary> public int dwFlags; } /// <summary> /// Closes a file opened using mmioOpen /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="uFlags">flags</param> /// <returns>Error code</returns> [DllImport("winmm")] public extern static int mmioClose ( IntPtr hmmio, int uFlags); /// <summary> /// Descends into a chunk within the file /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="lpck">Chunk to descend into</param> /// <param name="lpckParent">Parent chunk to descend from</param> /// <param name="uFlags">Flags controlling how to descend</param> /// <returns>Error code</returns> [DllImport("winmm")] public extern static int mmioDescend ( IntPtr hmmio, ref MMCKINFO lpck, ref MMCKINFO lpckParent, int uFlags); /// <summary> /// Same as <see cref="mmioDescend"/> but allows descent into /// the top level chunk. /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="lpck">Chunk to descend into</param> /// <param name="x">Reserved, must be set to 0.</param> /// <param name="uFlags">Flags controlling how to descend</param> /// <returns>Error code</returns> [DllImport("winmm", EntryPoint="mmioDescend")] public extern static int mmioDescendParent ( IntPtr hmmio, ref MMCKINFO lpck, int x, int uFlags); /// <summary> /// Opens a multimedia RIFF file /// </summary> /// <param name="szFileName">File name</param> /// <param name="lpMmioInfo">Pointer to a <see cref="MMIOINFO"/> structure</param> /// <param name="dwOpenFlags">Flags controlling open type</param> /// <returns>Handle to open file, or zero if open fails.</returns> [DllImport("winmm", CharSet=CharSet.Auto)] public extern static IntPtr mmioOpen( string szFileName, IntPtr lpMmioInfo, int dwOpenFlags); /// <summary> /// Reads from the file into a buffer. /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="pch">Pointer to the buffer</param> /// <param name="cch">Number of bytes to read</param> /// <returns>Number of bytes read</returns> [DllImport("winmm")] public extern static int mmioRead ( IntPtr hmmio, IntPtr pch, int cch); /// <summary> /// Writes data to the file from a buffer /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="pch">Pointer to the buffer</param> /// <param name="cch">Number of bytes to write</param> /// <returns>Number of bytes written</returns> [DllImport("winmm")] public extern static int mmioWrite ( IntPtr hmmio, IntPtr pch, int cch); /// <summary> /// Reads a <see cref="WAVEFORMATEX"/> from the file. /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="format">format structure to read</param> /// <param name="cch">Number of bytes to read</param> /// <returns>Number of bytes read</returns> [DllImport("winmm", EntryPoint="mmioRead")] public extern static int mmioReadWaveFormat ( IntPtr hmmio, ref WAVEFORMATEX format, int cch); /// <summary> /// Writes a <see cref="WAVEFORMATEX"/> to the file. /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="format">format structure to write</param> /// <param name="cch">Number of bytes to write</param> /// <returns>Number of bytes written</returns> [DllImport("winmm", EntryPoint="mmioWrite")] public extern static int mmioWriteWaveFormat ( IntPtr hmmio, ref WAVEFORMATEX format, int cch); /// <summary> /// Seeks to the specified point in the file /// </summary> /// <param name="hmmio">Handle to the open file</param> /// <param name="iOrigin">SEEK_* flag specifying the origin of the seek</param> /// <param name="lOffset">Number of bytes to seek</param> /// <returns>Error code</returns> [DllImport("winmm")] public extern static int mmioSeek ( IntPtr hmmio, int lOffset, int iOrigin); /// <summary> /// Converts a string representing a FOURCC code to an actual /// FOURCC code. /// </summary> /// <param name="sz">String containing the FOURCC code bytes</param> /// <param name="uFlags">Flags controlling the conversion</param> /// <returns>FOURCC code.</returns> [DllImport("winmm", CharSet=CharSet.Auto)] public extern static int mmioStringToFOURCC( [MarshalAs(UnmanagedType.LPTStr)] string sz, int uFlags); /// <summary> /// Ascends from a chunk in a multimedia file. /// </summary> /// <param name="hmmio">Handle to open file</param> /// <param name="lpck">Chunk to ascend from</param> /// <param name="uFlags">Flags controlling ascend</param> /// <returns>Error code</returns> [DllImport("winmm")] public extern static int mmioAscend( IntPtr hmmio, ref MMCKINFO lpck, int uFlags); /// <summary> /// Creates a new chunk in a multimedia file. /// </summary> /// <param name="fuCreate">Flags describing how to create the chunk</param> /// <param name="hmmio">Handle to open file</param> /// <param name="pmmcki">Chunk to create</param> [DllImport("winmm")] public extern static int mmioCreateChunk( IntPtr hmmio, ref MMCKINFO pmmcki, int fuCreate); /// <summary> /// File read access /// </summary> public const int MMIO_READ = 0x0; /// <summary> /// File write access /// </summary> public const int MMIO_WRITE = 0x1; /// <summary> /// File read/write access /// </summary> public const int MMIO_READWRITE = 0x2; /// <summary> /// Find a chunk in a file /// </summary> public const int MMIO_FINDCHUNK = 0x10; /// <summary> /// Find RIFF header /// </summary> public const int MMIO_FINDRIFF = 0x20; /// <summary> /// Create RIFF header /// </summary> public const int MMIO_CREATERIFF = 0x20; /// <summary> /// Allocate buffer /// </summary> public const int MMIO_ALLOCBUF = 0x10000; /// <summary> /// Create file /// </summary> public const int MMIO_CREATE = 0x1000; /// <summary> /// Error code representing success /// </summary> public const int MMSYSERR_NOERROR = 0; /// <summary> /// Seek from current position /// </summary> public const int SEEK_CUR = 1; /// <summary> /// Seek from end of file /// </summary> public const int SEEK_END = 2; /// <summary> /// Seek from beginning of file /// </summary> public const int SEEK_SET = 0; /// <summary> /// Prevent instantiation /// </summary> private WinMMInterop() { } } }
|
|||
|