Hi all,
can anybody tell me what he invalid parameter is in this code. When I
try to execute the mmioDescendPare nt I get a returncode 11, meaning
that an invalid parameter has been passed. I just don't know which one
and therefor not how to improve my code.
Regards,
Rubycon
P.S.: you can find the original VB6 code at
http://custom.programming-in.net/art...?f=mmioDescend
converted to VB.Net this code also gives me a returncode 11, so no help
there.
-------------------------------------------------------------------------------
using System;
using System.Runtime. InteropServices ;
namespace WilfredClassLib rary1
{
/// <summary>
/// Summary description for WindowsMultiMed iaInterface.
/// </summary>
public class WindowsMultiMed iaInterface
{
[ StructLayout( LayoutKind.Sequ ential, CharSet=CharSet .Ansi )]
public struct MMIOINFO
{
public long dwFlags;
public long fccIOProc;
public long pIOProc;
public long wErrorRet;
public long htask;
public long cchBuffer;
public string pchBuffer;
public string pchNext;
public string pchEndRead;
public string pchEndWrite;
public long lBufOffset;
public long lDiskOffset;
public long adwInfo1;
public long adwInfo2;
public long adwInfo3;
public long adwInfo4;
public long dwReserved1;
public long dwReserved2;
public long hmmio;
public void Initialize()
{
}
}
[StructLayout(La youtKind.Sequen tial, CharSet=CharSet .Auto, Pack=4)]
public struct MMIOFLAGS
{
// private const int MMIO_ALLOCBUF = 65536;
public const long MMIO_ALLOCBUF = 65536;
public const long MMIO_COMPAT = 0;
public const long MMIO_CREATE = 4096;
public const long MMIO_CREATELIST = 64;
public const long MMIO_CREATERIFF = 32;
public const long MMIO_DEFAULTBUF FER = 8192;
public const long MMIO_DELETE = 512;
public const long MMIO_DENYNONE = 64;
public const long MMIO_DENYREAD = 48;
public const long MMIO_DENYWRITE = 32;
public const long MMIO_DIRTY = 268435456;
public const long MMIO_EMPTYBUF = 16;
public const long MMIO_EXCLUSIVE = 16;
public const long MMIO_EXIST = 16384;
public const long MMIO_FHOPEN = 16;
public const long MMIO_FINDCHUNK = 16;
public const long MMIO_FINDLIST = 64;
public const long MMIO_FINDPROC = 262144;
public const long MMIO_FINDRIFF = 0x0020;
// public const long MMIO_FINDRIFF = 32;
public const long MMIO_GETTEMP = 131072;
public const long MMIO_INSTALLPRO C = 65536;
public const long MMIO_OPEN_VALID = 262143;
public const long MMIO_PARSE = 256;
public const long MMIO_PUBLICPROC = 268435456;
public const long MMIO_READ = 0;
public const long MMIO_READWRITE = 2;
public const long MMIO_REMOVEPROC = 131072;
public const long MMIO_RWMODE = 3;
public const long MMIO_SHAREMODE = 112;
public const long MMIO_TOUPPER = 16;
public const long MMIO_UNICODEPRO C = 16777216;
public const long MMIO_VALIDPROC = 285671424;
public const long MMIO_WRITE = 1;
public const long SEEK_CUR = 1;
public const long SEEK_END = 2;
public const long SEEK_SET = 3;
public const long TIME_BYTES = 4;
public const long WHDR_DONE = 1;
IntPtr hmmio;
public void Initialize()
{
}
}
[ StructLayout( LayoutKind.Sequ ential, CharSet=CharSet .Ansi )]
public struct MMCKINFO
{
public long ckid;
public long ckSize;
public long fccType;
public long dwDataOffset;
public long dwFlags;
}
[ StructLayout( LayoutKind.Sequ ential, CharSet=CharSet .Auto )]
public struct WAVEHDR
{
public long lpData;
public long dwBufferLength;
public long dwBytesRecorded ;
public long dwUser;
public long dwFlags;
public long dwLoops;
public long lpNext;
public long Reserved;
}
[ StructLayout( LayoutKind.Sequ ential, CharSet=CharSet .Auto )]
public struct WAVEINCAPS
{
public int wMid;
public int wPid;
public long vDriverVersion;
public string szPname;
public long dwFormats;
public int wChannels;
}
[ StructLayout( LayoutKind.Sequ ential, CharSet=CharSet .Auto )]
public struct WAVEFORMAT
{
public int wFormatTag;
public int nChannels;
public long nSamplesPerSec;
public long nAvgBytesPerSec ;
public int nBlockAlign;
public int wBitsPerSample;
public int cbSize;
}
[ StructLayout( LayoutKind.Sequ ential, CharSet=CharSet .Auto )]
public struct MMTIME
{
public long wType;
public long u;
public long x;
}
// Definition of fields used here and there
const int NUM_BUFFERS = 5;
const double BUFFER_SECONDS = 0.1;
long rc; // Return Code
long hmmioIn; // File Handle
long dataOffset; // Start of audio data in wave file
long audioLength; // number of bytes in audio data
long pFormat; // pointer to wave format
string formatBuffer; // buffer to hold the wave format
long startPos; // sample where we started playback from
WAVEFORMAT format; // wave format structure
long i; // loop control variable
long j; // loop control variable
long[] hmem; // memory handles
long[] pmem; // memory pointers
WAVEHDR[] hdr; // wave headers
long bufferSize; // size of output buffers
bool fPlaying; // is file currently playing
bool fFileOpen; // is file currently open
long hWaveOut; // waveout handle
string msg; // message buffer
private const long WAVERR_BASE = 32;
private const long MMSYSERR_BASE = 0;
public enum MMSYSERR : long
{
NOERROR = 0,
ERROR = (MMSYSERR_BASE + 1),
BADDEVICEID = (MMSYSERR_BASE + 2),
NOTENABLED = (MMSYSERR_BASE + 3),
ALLOCATED = (MMSYSERR_BASE + 4),
INVALHANDLE = (MMSYSERR_BASE + 5),
NODRIVER = (MMSYSERR_BASE + 6),
NOMEM = (MMSYSERR_BASE + 7),
NOTSUPPORTED = (MMSYSERR_BASE + 8),
BADERRNUM = (MMSYSERR_BASE + 9),
INVALFLAG = (MMSYSERR_BASE + 10),
INVALPARAM = (MMSYSERR_BASE + 11),
HANDLEBUSY = (MMSYSERR_BASE + 12),
INVALIDALIAS = (MMSYSERR_BASE + 13),
BADDB = (MMSYSERR_BASE + 14),
KEYNOTFOUND = (MMSYSERR_BASE + 15),
READERROR = (MMSYSERR_BASE + 16),
WRITEERROR = (MMSYSERR_BASE + 17),
DELETEERROR = (MMSYSERR_BASE + 18),
VALNOTFOUND = (MMSYSERR_BASE + 19),
NODRIVERCB = (MMSYSERR_BASE + 20),
LASTERROR = (MMSYSERR_BASE + 20)
}
private enum WAVERR : long
{
NONE = 0,
BADFORMAT = WAVERR_BASE + 0,
STILLPLAYING = WAVERR_BASE + 1,
UNPREPARED = WAVERR_BASE + 2,
SYNC = WAVERR_BASE + 3,
LASTERROR = WAVERR_BASE + 3
}
/// <comment>
/// More info on http://custom.programming-in.net/
/// </comment>
/// <remarks>
/// winmm.dll: mmio functions
/// </remarks>
[DllImport("winm m.dll")] public static extern long mmioAdvance(lon g
hmmio, ref MMIOINFO lpmmioinfo, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioAscend(long
hmmio, ref MMCKINFO lpck, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioClose(long
hmmio, long uFlags);
[DllImport("winm m.dll")] public static extern long
mmioCreateChunk (long hmmio, ref MMCKINFO lpck, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioDescend(lon g
hmmio, ref MMCKINFO lpck, ref MMCKINFO lpckParent, long uFlags);
[DllImport("winm m.dll", EntryPoint="mmi oDescend")] static extern long
mmioDescendPare nt(long hmmio, MMCKINFO lpck, long x, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioFlush(long
hmmio, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioGetInfo(lon g
hmmio, ref MMIOINFO lpmmioinfo, long uFlags);
[DllImport("winm m.dll")] public static extern long
mmioInstallIOPr ocA(string fccIOProc_4, long pIOProc, long dwFlags);
// [DllImport("winm m.dll", EntryPoint="mmi oOpen")] public static
extern long mmioOpenA(strin g szFileName, ref MMIOINFO lpmmioinfo, long
dwOpenFlags);
[DllImport("winm m.dll", EntryPoint="mmi oOpenA")] private static
extern long mmioOpen(string szFileName, ref MMIOINFO lpmmioinfo, long
dwOpenFlags);
[DllImport("winm m.dll")] public static extern long mmioRead(long
hmmio, string pch, long cch);
[DllImport("winm m.dll", EntryPoint="mmi oRead")] static extern long
mmioReadString( long hmmio, string pch, long cch);
[DllImport("winm m.dll", EntryPoint="mmi oRename")] public static
extern long mmioRenameA(str ing szFileName, string SzNewFileName, ref
MMIOINFO lpmmioinfo, long dwRenameFlags);
[DllImport("winm m.dll")] public static extern long mmioSeek(long
hmmio, long lOffset, long iOrigin);
[DllImport("winm m.dll")] public static extern long
mmioSendMessage (long hmmio, long uMsg, long lParam1, long lParam2);
[DllImport("winm m.dll")] public static extern long mmioSetBuffer(l ong
hmmio, string pchBuffer, long cchBuffer, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioSetInfo(lon g
hmmio, ref MMIOINFO lpmmioinfo, long uFlags);
// [DllImport("winm m.dll", EntryPoint="mmi oStringToFOURCC ")] public
static extern long mmioStringToFOU RCCA(string sz, long uFlags);
[DllImport("winm m.dll", EntryPoint="mmi oStringToFOURCC A")] public
static extern long mmioStringToFOU RCC(string sz, long uFlags);
[DllImport("winm m.dll")] public static extern long mmioWrite(long
hmmio, string pch, long cch);
/// <remarks>
/// winmm.dll: wave functions
/// </remarks>
[DllImport("winm m.dll")] static extern long waveOutGetPosit ion(long
hWaveOut, MMTIME lpInfo, long uSize);
[DllImport("winm m.dll")] static extern long waveOutOpen(lon g
hWaveOut, long uDeviceID, string format, long dwCallback, ref bool
fPlaying, long dwFlags);
[DllImport("winm m.dll")] static extern long waveOutPrepareH eader(long
hWaveIn, WAVEHDR lpWaveInHdr, long uSize);
[DllImport("winm m.dll")] static extern long waveOutReset(lo ng
hWaveIn);
[DllImport("winm m.dll")] static extern long
waveOutUnprepar eHeader(long hWaveIn, WAVEHDR lpWaveInHdr, long uSize);
[DllImport("winm m.dll")] static extern long waveOutClose(lo ng
hWaveIn);
[DllImport("winm m.dll", EntryPoint="wav eInGetDevCapsA" )] static
extern long waveOutGetDevCa ps(long uDeviceID, WAVEINCAPS lpCaps, long
uSize);
[DllImport("winm m.dll")] static extern long waveOutGetNumDe vs();
[DllImport("winm m.dll", EntryPoint="wav eInGetErrorText A")] static
extern long waveOutGetError Text(long err, string lpText, long uSize);
[DllImport("winm m.dll")] static extern long waveOutWrite(lo ng
hWaveOut, WAVEHDR lpWaveOutHdr, long uSize);
/// <remarks>
/// kernel32.dll
/// </remarks>
[DllImport("kern el32")] static extern long GlobalAlloc(lon g wFlags,
long dwBytes);
[DllImport("kern el32")] static extern long GlobalLock(long hmem);
[DllImport("kern el32")] static extern long GlobalFree(long hmem);
// "Any" is onbekend, vervangen door object.
// [DllImport("kern el32", EntryPoint="Rtl MoveMemory")] static extern
void CopyStructFromP tr(Any struct, int ptr, int cb);
// [DllImport("kern el32", EntryPoint="Rtl MoveMemory")] static extern
void CopyPtrFromStru ct(int ptr, Any struct, int cb);
// [DllImport("kern el32", EntryPoint="Rtl MoveMemory")] static extern
void CopyStructFromS tring(Any dest, string source, int cb);
[DllImport("kern el32", EntryPoint="Rtl MoveMemory")] static extern
void CopyStructFromP tr(object cpy, long ptr, long cb);
[DllImport("kern el32", EntryPoint="Rtl MoveMemory")] static extern
void CopyPtrFromStru ct(long ptr, object cpy, long cb);
[DllImport("kern el32", EntryPoint="Rtl MoveMemory")] static extern
void CopyStructFromS tring(object cpy, string source, long cb);
/// <remarks>
/// user32.dll
/// </remarks>
[DllImport("user 32", EntryPoint="Pos tMessageA")] static extern long
PostWavMessage( long hwnd, long wMsg, long wParam, ref WAVEHDR hdr);
public WindowsMultiMed iaInterface()
{
//
// TODO: Add constructor logic here
//
}
public void CloseFile()
{
mmioClose(hmmio In, 0);
fFileOpen = false;
}
public long OpenFile(string soundfile)
{
MMCKINFO mmckinfo = new MMCKINFO();
MMCKINFO mmckinfoParentI n = new MMCKINFO();
MMCKINFO mmckinfoSubchun ckIn = new MMCKINFO();
MMIOINFO mmioinf = new MMIOINFO();
// Close previously opened file (if any)
CloseFile();
if(soundfile == "")
{
return -1;
}
// Open the inputfile
hmmioIn = mmioOpen(soundf ile, ref mmioinf, MMIOFLAGS.MMIO_ READ);
// hmmioIn = mmioOpenA(sound file, ref mmioinf, MMIOFLAGS.MMIO_ READ);
if(hmmioIn == 0)
{
return mmioinf.wErrorR et;
}
// check if this is a wave file
// mmckinfoParentI n.fccType = mmioStringToFOU RCCA("WAVE", 0);
mmckinfoParentI n.fccType = mmioStringToFOU RCC("WAVE", 0);
rc = mmioDescendPare nt(hmmioIn, mmckinfoParentI n, 0,
MMIOFLAGS.MMIO_ FINDRIFF);
// rc = mmioDescendPare nt(hmmioIn, mmckinfoParentI n,
Convert.ToInt64 (null), MMIOFLAGS.MMIO_ FINDRIFF);
if(Convert.ToIn t16(rc) != Convert.ToInt16 (MMSYSERR.NOERR OR))
{
CloseFile();
return rc;
}
// Get format info
// mmckinfoSubchun ckIn.ckid = mmioStringToFOU RCCA("fmt", 0);
mmckinfoSubchun ckIn.ckid = mmioStringToFOU RCC("fmt", 0);
rc = mmioDescend(hmm ioIn, ref mmckinfoSubchun ckIn, ref
mmckinfoParentI n, MMIOFLAGS.MMIO_ FINDCHUNK);
if(Convert.ToIn t16(rc) != Convert.ToInt16 (MMSYSERR.NOERR OR))
{
CloseFile();
return rc;
}
rc = mmioReadString( hmmioIn, formatBuffer,
mmckinfoSubchun ckIn.ckSize);
if(rc == -1)
{
CloseFile();
return rc;
}
rc = mmioAscend(hmmi oIn, ref mmckinfoSubchun ckIn, 0);
CopyStructFromS tring(format, formatBuffer, format.cbSize);
// find the data subchunck
// mmckinfoSubchun ckIn.ckid = mmioStringToFOU RCCA("data", 0);
mmckinfoSubchun ckIn.ckid = mmioStringToFOU RCC("data", 0);
rc = mmioDescend(hmm ioIn, ref mmckinfoSubchun ckIn, ref
mmckinfoParentI n, MMIOFLAGS.MMIO_ FINDCHUNK);
if(Convert.ToIn t16(rc) != Convert.ToInt16 (MMSYSERR.NOERR OR))
{
CloseFile();
return rc;
}
dataOffset = mmioSeek(hmmioI n, 0, MMIOFLAGS.SEEK_ CUR);
// get the lenght of the audio
audioLength = mmckinfoSubchun ckIn.ckSize;
// allocate audio bufffers
bufferSize = format.nSamples PerSec * format.nBlockAl ign *
format.nChannel s * Convert.ToInt64 (BUFFER_SECONDS );
bufferSize = bufferSize - (bufferSize % format.nBlockAl ign);
for(int i = 1; i <= NUM_BUFFERS; i++)
{
GlobalFree(hmem[i]);
hmem[i] = GlobalAlloc(0, bufferSize);
pmem[i] = GlobalLock(hmem[i]);
}
fFileOpen = true;
return 0; // uiteindelijk altijd iets teruggeven
}
public MMSYSERR OpenFile(string fileName, short Flags)
{
return OpenFile(fileNa me, Flags, MMIOFLAGS.MMIO_ DEFAULTBUFFER);
}
public MMSYSERR OpenFile(string fileName, short Flags, long
bufferSize)
{
if (!(System.IO.Fi le.Exists(fileN ame)))
{
throw new System.IO.FileN otFoundExceptio n();
}
MMIOINFO tmpMMIOInfo = new MMIOINFO();
tmpMMIOInfo.Ini tialize();
if (System.Convert .ToBoolean(Flag s & MMIOFLAGS.MMIO_ ALLOCBUF))
{
tmpMMIOInfo.cch Buffer = bufferSize;
}
object mvarhndMMIO = null;
mvarhndMMIO = mmioOpen(fileNa me, ref tmpMMIOInfo, Flags);
// mvarhndMMIO = mmioOpenA(fileN ame, ref tmpMMIOInfo, Flags);
return ((MMSYSERR)(tmp MMIOInfo.wError Ret));
}
}
}