#pragma once class File { public: File(void); public: ~File(void); BOOL Open(LPCTSTR lpFileName,DWORD dwDesiredAccess = FILE_WRITE_DATA|FILE_READ_DATA/*参考CreateFile*/); DWORD Seek(LONG lDistanceToMove,DWORD dwMoveMethod=FILE_BEGIN/*参考SetFilePointer*/); DWORD SeekToBegin( ); DWORD SeekToEnd( ); DWORD GetLength( ) const; DWORD Read( LPVOID lpBuffer,DWORD nNumberOfBytesToRead); DWORD Write(LPVOID lpBuffer,DWORD nNumberOfBytesToWrite); protected: HANDLE m_hFile; }; #include "StdAfx.h" #include #include "File.h" extern DWORD g_dwLastError; File::File(void) { m_hFile=INVALID_HANDLE_VALUE; } File::~File(void) { if (m_hFile!=INVALID_HANDLE_VALUE) { CloseHandle(m_hFile); } } BOOL File::Open(LPCTSTR lpFileName,DWORD dwDesiredAccess) { m_hFile = CreateFile(lpFileName,dwDesiredAccess,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); return m_hFile!=INVALID_HANDLE_VALUE ? TRUE:FALSE; } DWORD File::Seek(LONG lDistanceToMove,DWORD dwMoveMethod/*参考SetFilePointer*/) { assert(m_hFile!=INVALID_HANDLE_VALUE); return SetFilePointer(m_hFile,lDistanceToMove,NULL,dwMoveMethod); } DWORD File::SeekToBegin( ) { assert(m_hFile!=INVALID_HANDLE_VALUE); return SetFilePointer(m_hFile,0,NULL,FILE_BEGIN); } DWORD File::SeekToEnd( ) { assert(m_hFile!=INVALID_HANDLE_VALUE); return SetFilePointer(m_hFile,0,NULL,FILE_END); } DWORD File::GetLength( ) const { assert(m_hFile!=INVALID_HANDLE_VALUE); return GetFileSize(m_hFile,NULL); } DWORD File::Read( LPVOID lpBuffer,DWORD nNumberOfBytesToRead) { assert(m_hFile!=INVALID_HANDLE_VALUE); DWORD dwNumberOfBytesRead; ReadFile(m_hFile,lpBuffer,nNumberOfBytesToRead,&dwNumberOfBytesRead,NULL); return dwNumberOfBytesRead; } DWORD File::Write(LPVOID lpBuffer,DWORD nNumberOfBytesToWrite) { assert(m_hFile!=INVALID_HANDLE_VALUE); DWORD dwNumberOfBytesWrite; WriteFile(m_hFile,lpBuffer,nNumberOfBytesToWrite,&dwNumberOfBytesWrite,NULL); return dwNumberOfBytesWrite; } #pragma once #include "file.h" class CWaveFile : public File { public: CWaveFile(void); public: ~CWaveFile(void); public: void SetWaveFormat(WAVEFORMATEX *pwfx); DWORD WriteWavFileHeader(); DWORD WriteWavData(LPBYTE pData,DWORD nSize); private: DWORD m_dwTotalBytes; WAVEFORMATEX m_wfx; }; #include "StdAfx.h" #include "CWaveFile.h" #include static const DWORD WAVE_FILE_HEAD_SIZE = sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + sizeof(WAVEFORMATEX) + sizeof(RIFFCHUNK); CWaveFile::CWaveFile(void) { m_dwTotalBytes = 0; ZeroMemory(&m_wfx,sizeof(WAVEFORMATEX)); m_wfx.wFormatTag = WAVE_FORMAT_PCM; m_wfx.nChannels = 2; m_wfx.wBitsPerSample = 16; m_wfx.nSamplesPerSec = 44100; m_wfx.nBlockAlign = m_wfx.nChannels * m_wfx.wBitsPerSample / 8; m_wfx.nAvgBytesPerSec = m_wfx.nSamplesPerSec * m_wfx.nBlockAlign; m_wfx.cbSize = 0; } CWaveFile::~CWaveFile(void) { } void CWaveFile::SetWaveFormat(WAVEFORMATEX *pwfx) { CopyMemory(&m_wfx,pwfx,sizeof(WAVEFORMATEX)); } DWORD CWaveFile::WriteWavFileHeader() { BYTE Buffer[WAVE_FILE_HEAD_SIZE]; RIFFLIST *pRiffWave = (RIFFLIST *)Buffer; RIFFCHUNK *pRiffFmt = (RIFFCHUNK *)(pRiffWave + 1); RIFFCHUNK *pRiffData = (RIFFCHUNK *)(((BYTE *)(pRiffFmt + 1)) + sizeof(WAVEFORMATEX)); pRiffData->fcc = FCC('data'); pRiffData->cb = m_dwTotalBytes; pRiffFmt->fcc = FCC('fmt '); pRiffFmt->cb = sizeof(WAVEFORMATEX); CopyMemory(pRiffFmt + 1, &m_wfx, sizeof(WAVEFORMATEX)); pRiffWave->fcc = FCC('RIFF'); pRiffWave->cb = m_dwTotalBytes + WAVE_FILE_HEAD_SIZE - sizeof(RIFFCHUNK); pRiffWave->fccListType = FCC('WAVE'); SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN); DWORD dwWriten = 0; BOOL bRet = WriteFile(m_hFile, Buffer, WAVE_FILE_HEAD_SIZE, &dwWriten, NULL); if ((bRet == FALSE) || (dwWriten != WAVE_FILE_HEAD_SIZE)) { return -1; } return 0; } DWORD CWaveFile::WriteWavData(LPBYTE pData,DWORD nSize) { DWORD nByteWrite = Write(pData,nSize); m_dwTotalBytes+=nByteWrite; return nByteWrite; }
wave 文件
最新推荐文章于 2023-01-29 19:49:54 发布