/// <summary>Get the named position in a RIFF</summary> /// <param name="file">file name</param> /// <param name="name">named position</param> /// <returns>CHUNKINFO</returns> private CHUNKINFO GetChunkPos(string file, string name) { int ret; IntPtr hMmioIn; CHUNKINFO ck = new CHUNKINFO(); MMCKINFO mmckinfoParentIn = new MMCKINFO(); MMCKINFO mmckinfoSubchunkIn = new MMCKINFO(); // open for read hMmioIn = mmioOpen(file, IntPtr.Zero, MMIO_READ); if (hMmioIn == IntPtr.Zero) { return(ck); } // convert string to code mmckinfoParentIn.fccType = mmioStringToFOURCC("WAVE", 0); ret = mmioDescendParent(hMmioIn, &mmckinfoParentIn, IntPtr.Zero, MMIO_FINDRIFF); if (ret != 0) { mmioClose(hMmioIn, 0); return(ck); } // get named location mmckinfoSubchunkIn.ckid = mmioStringToFOURCC(name, 0); ret = mmioDescend(hMmioIn, &mmckinfoSubchunkIn, &mmckinfoParentIn, MMIO_FINDCHUNK); if (ret != 0) { mmioClose(hMmioIn, 0); return(ck); } // return position and size ck.Start = (uint)mmioSeek(hMmioIn, 0, SEEK_CUR); ck.Length = mmckinfoSubchunkIn.ckSize; mmioClose(hMmioIn, 0); return(ck); }
/// <summary>Create the stream and initialize settings</summary> /// <param name="file">file name</param> /// <returns>SND_RESULT</returns> public SND_RESULT Create(string file) { if (!IsValidFile(file)) { return(SND_RESULT.SND_ERR_INVALID_SOURCE); } // find wav chunks data and fmt _ckData = GetChunkPos(file, "data"); _ckInfo = GetChunkPos(file, "fmt "); DataLength = _ckData.Length; // valid chunks? if (_ckData.Start == 0) { return(SND_RESULT.SND_ERR_INVALID_SOURCE); } if (_ckInfo.Start == 0) { return(SND_RESULT.SND_ERR_INVALID_SOURCE); } if (_ckInfo.Length < 16) { return(SND_RESULT.SND_ERR_INVALID_SOURCE); } // open file _waveHandle = FileOpen(file, FILE_ACCESS.GENERIC_READ, FILE_SHARE.FILE_SHARE_READ, FILE_METHOD.OPEN_EXISTING); if (_waveHandle == INVALID_HANDLE) { return(SND_RESULT.SND_ERR_INVALID_SOURCE); } // shrink data chunks with ilegal length to file length if (FileLength(_waveHandle) < (_ckData.Start + _ckData.Length)) { _ckData.Length = FileLength(_waveHandle) - _ckData.Start; } // read info chunk _btWfx = new byte[_ckInfo.Length]; FileSeek(_waveHandle, (int)_ckInfo.Start, (uint)SEEK_METHOD.FILE_BEGIN); fixed(byte *pBt = _btWfx) { FileRead(_waveHandle, pBt, _ckInfo.Length); } // copy the header uint size = (uint)sizeof(WAVEFORMATEX); fixed(byte *pBt = _btWfx) fixed(WAVEFORMATEX * pWv = &_tWFXIn) { { RtlMoveMemory(pWv, pBt, size); } } // seek to the beginning of the audio data FileSeek(_waveHandle, (int)_ckData.Start, (uint)SEEK_METHOD.FILE_BEGIN); // init the Audio Compression Manager if (InitConversion() != MMSYSERR.NOERROR) { Close(); return(SND_RESULT.SND_ERR_INTERNAL); } return(SND_RESULT.SND_ERR_SUCCESS); }