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