dev.nlited.com

>>

Wave.h

<<<< prev
next >>>>

2016-01-24 05:03:01 chip Page 1535 📢 PUBLIC

From Jay Tennant.


Wave.h: 1‌//wave.h 2‌//by Jay Tennant 3/4/12 3‌//Wave helper class, to load simple wave files 4‌//win32developer.com 5‌//this code provided free, as in public domain; score! 6 7#ifndef __WAVE_H__ 8#define __WAVE_H__ 9 10#include <windows.h> 11#include <xaudio2.h> 12#include <fstream> 13 14class Wave { 15private: 16 WAVEFORMATEX m_wf; 17 XAUDIO2_BUFFER m_xa; 18 BYTE* m_waveData; 19public: 20 Wave(const char* szFile = NULL): m_waveData(NULL) { 21 ZeroMemory(&m_wf,sizeof(m_wf)); 22 ZeroMemory(&m_xa,sizeof(m_xa)); 23 24 load(szFile); 25 } 26 Wave(const Wave& c): m_waveData(NULL) { 27 m_wf = c.m_wf; 28 m_xa = c.m_xa; 29 if(c.m_waveData) { 30 m_waveData = new BYTE[m_xa.AudioBytes]; 31 memcpy(m_waveData,c.m_waveData,m_xa.AudioBytes); 32 m_xa.pAudioData = m_waveData; 33 } 34 } 35 ~Wave() { 36 if(m_waveData) 37 delete[] m_waveData; 38 m_waveData = NULL; 39 } 40 41 const XAUDIO2_BUFFER* xaBuffer() const { 42 return &m_xa; 43 } 44 const WAVEFORMATEX* wf() const { 45 return &m_wf; 46 } 47 bool load(const char* szFile) { 48 if(szFile == NULL) 49 return false; 50 51 std::ifstream inFile(szFile,std::ios::binary | std::ios::in); 52 if(inFile.bad()) 53 return false; 54 55 DWORD dwChunkId = 0,dwFileSize = 0,dwChunkSize = 0,dwExtra = 0; 56 57 //look for 'RIFF' chunk identifier 58 inFile.seekg(0,std::ios::beg); 59 inFile.read(reinterpret_cast<char*>(&dwChunkId),sizeof(dwChunkId)); 60 if(dwChunkId != 'FFIR') { 61 inFile.close(); 62 return false; 63 } 64 inFile.seekg(4,std::ios::beg); //get file size 65 inFile.read(reinterpret_cast<char*>(&dwFileSize),sizeof(dwFileSize)); 66 if(dwFileSize <= 16) { 67 inFile.close(); 68 return false; 69 } 70 inFile.seekg(8,std::ios::beg); //get file format 71 inFile.read(reinterpret_cast<char*>(&dwExtra),sizeof(dwExtra)); 72 if(dwExtra != 'EVAW') { 73 inFile.close(); 74 return false; 75 } 76 77 //look for 'fmt ' chunk id 78 bool bFilledFormat = false; 79 for(unsigned int i = 12; i < dwFileSize; ) { 80 inFile.seekg(i,std::ios::beg); 81 inFile.read(reinterpret_cast<char*>(&dwChunkId),sizeof(dwChunkId)); 82 inFile.seekg(i + 4,std::ios::beg); 83 inFile.read(reinterpret_cast<char*>(&dwChunkSize),sizeof(dwChunkSize)); 84 if(dwChunkId == ' tmf') { 85 inFile.seekg(i + 8,std::ios::beg); 86 inFile.read(reinterpret_cast<char*>(&m_wf),sizeof(m_wf)); 87 bFilledFormat = true; 88 break; 89 } 90 dwChunkSize += 8; //add offsets of the chunk id, and chunk size data entries 91 dwChunkSize += 1; 92 dwChunkSize &= 0xfffffffe; //guarantees WORD padding alignment 93 i += dwChunkSize; 94 } 95 if(!bFilledFormat) { 96 inFile.close(); 97 return false; 98 } 99 100 //look for 'data' chunk id 101 bool bFilledData = false; 102 for(unsigned int i = 12; i < dwFileSize; ) { 103 inFile.seekg(i,std::ios::beg); 104 inFile.read(reinterpret_cast<char*>(&dwChunkId),sizeof(dwChunkId)); 105 inFile.seekg(i + 4,std::ios::beg); 106 inFile.read(reinterpret_cast<char*>(&dwChunkSize),sizeof(dwChunkSize)); 107 if(dwChunkId == 'atad') { 108 m_waveData = new BYTE[dwChunkSize]; 109 inFile.seekg(i + 8,std::ios::beg); 110 inFile.read(reinterpret_cast<char*>(m_waveData),dwChunkSize); 111 m_xa.AudioBytes = dwChunkSize; 112 m_xa.pAudioData = m_waveData; 113 m_xa.PlayBegin = 0; 114 m_xa.PlayLength = 0; 115 bFilledData = true; 116 break; 117 } 118 dwChunkSize += 8; //add offsets of the chunk id, and chunk size data entries 119 dwChunkSize += 1; 120 dwChunkSize &= 0xfffffffe; //guarantees WORD padding alignment 121 i += dwChunkSize; 122 } 123 if(!bFilledData) { 124 inFile.close(); 125 return false; 126 } 127 128 inFile.close(); 129 return true; 130 } 131}; 132 133#endif


WebV7 (C)2018 nlited | Rendered by tikope in 47.390ms | 18.191.207.141