www.pudn.com > AudioWave.rar > Wave.cpp
// Wave.cpp: implementation of the CWave class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Wave.h" // #include#include // #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CWave::CWave() { m_nType = 0; m_bRecording = FALSE; m_bOpened = FALSE; m_pSoundData = NULL; m_wDeviceID = 0; } CWave::~CWave() { Close (); } int CWave::GetDevices (void) { return waveOutGetNumDevs (); } BOOL CWave::LoadFromDisk (CString Filename) { Close (); CFile File; if (!File.Open (Filename, CFile::modeRead)) return FALSE; DWORD dwLength = File.GetLength (); m_pSoundData = AllocMem (dwLength); if (!m_pSoundData){ File.Close (); return FALSE; } if (File.ReadHuge (m_pSoundData, dwLength) != dwLength){ File.Close ();//把数据读入该内存 return FALSE; } File.Close (); m_bOpened = TRUE; m_nType = 1;//标志:从磁盘文件读入数据 return TRUE; } /* BOOL CWave::LoadFromDisk (CString Filename,DWORD BeginPoint,DWORD Length)//added by myself; { Close (); CFile File; if (!File.Open (Filename, CFile::modeRead)) return FALSE; if(BeginPoint+Length>File.GetLength ()) return FALSE; m_pSoundData = AllocMem (Length); if (!m_pSoundData) { File.Close (); return FALSE; } File.Seek(BeginPoint,CFile::begin); if (File.ReadHuge (m_pSoundData, Length) != Length) { File.Close ();//把数据读入该内存 return FALSE; } File.Close (); m_bOpened = TRUE; m_nType = 1;//标志:从磁盘文件读入数据 return TRUE; } */ BOOL CWave::LoadFromRes (CString ResID, HINSTANCE hInstance) { Close (); m_hInstance = hInstance; HANDLE hResInfo; hResInfo = FindResource (m_hInstance, ResID, "WAVE"); if (!hResInfo) return FALSE; m_hResHandle = LoadResource (m_hInstance, (HRSRC) hResInfo); if (!m_hResHandle) return FALSE; m_pSoundData = LockResource (m_hResHandle); if (!m_pSoundData) return FALSE; m_bOpened = TRUE; m_nType = 2;//标记:从资源读入数据 return TRUE; } void CWave::Close (void) { PlaySound (NULL, NULL, NULL); if (m_pSoundData){ if (m_nType == 1)//释放内存 FreeMem (m_pSoundData); if (m_nType == 2){ UnlockResource (m_hResHandle); FreeResource (m_hResHandle); } m_pSoundData = NULL; } m_nType = 0; m_bRecording = FALSE; m_bOpened = FALSE; if (m_wDeviceID) { mciSendCommand (m_wDeviceID, MCI_STOP, MCI_WAIT, NULL); mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL); } m_wDeviceID = 0; } BOOL CWave::Play (BOOL bLoop) { if (m_bOpened) { if (m_bRecording) { Stop (); MCI_PLAY_PARMS PlayParms; mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); if (mciSendCommand (m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID) &PlayParms)) return FALSE; else return TRUE; } else { DWORD dwFlags = SND_MEMORY | SND_ASYNC | SND_NODEFAULT; if (bLoop) dwFlags |= SND_LOOP; return PlaySound ((char *) m_pSoundData, NULL, dwFlags); } } return FALSE; } void CWave::Stop (void) { if (m_bRecording) mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL); else PlaySound (NULL, NULL, NULL); } BOOL CWave::Record (void) { Close (); MCI_OPEN_PARMS OpenParms; OpenParms.lpstrDeviceType = "waveaudio"; OpenParms.lpstrElementName = ""; if (mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID) &OpenParms)) return FALSE; m_wDeviceID = OpenParms.wDeviceID; MCI_RECORD_PARMS RecordParms; if (mciSendCommand (m_wDeviceID, MCI_RECORD, NULL, (DWORD)(LPVOID) &RecordParms)) return FALSE; m_bRecording = TRUE; m_bOpened = TRUE; return TRUE; } BOOL CWave::Save (CString Filename) {//只用于存储录音得到的数据! if (!m_bRecording) return FALSE; Stop (); MCI_SAVE_PARMS SaveParms; SaveParms.lpfilename = (LPCSTR) Filename; if (mciSendCommand (m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &SaveParms)) return FALSE; m_bRecording = FALSE; //LoadFromDisk (Filename);//我注释掉的/QSD return TRUE; } BOOL CWave::PlayFromDisk (CString Filename) { return PlaySound (Filename, NULL, SND_FILENAME | SND_SYNC | SND_NODEFAULT); } BOOL CWave::PlayFromRes (CString ResID, HINSTANCE hInstance) { return PlaySound (ResID, hInstance, SND_RESOURCE | SND_SYNC | SND_NODEFAULT); } void *CWave::AllocMem (DWORD dwSize) { HGLOBAL Global; HGLOBAL *pGlobal; unsigned char *pMem; Global = GlobalAlloc (GMEM_FIXED, (DWORD) dwSize + 10); if (!Global) return (NULL); pMem = (unsigned char *) GlobalLock (Global); pGlobal = (HGLOBAL *) pMem; *pGlobal = Global; pMem += sizeof (HGLOBAL); return (pMem); } void CWave::FreeMem (void far *pMem) { HGLOBAL Global; HGLOBAL *pGlobal; unsigned char *pUChar; pUChar = (unsigned char *) pMem; pUChar -= sizeof (HGLOBAL); pGlobal = (HGLOBAL *) pUChar; Global = *pGlobal; GlobalUnlock (Global); GlobalFree (Global); }