コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }