语音特征参数分析平台(三) 语音信号的采集-CWaveFile的设计和实现
二、CWaveFile语音文件类的设计和实现:
读写wave文件是语音分析所要具备的基本功能,在前面介绍了wave文件的基础上,设计了CWaveFile类,实现了wav文件的裸音频和格式的读写。
1 //////////////////////////////////////////////////////////////////////////
2 //定义音频文件类
3 //负责WAV文件的打开关闭、chunk数据的获取
4 //
5 //Author: 陈文凯 chwkai@163.com
6 //Create:2005年5月5日
7
8 class CWaveFile
9 {
10 //构造和析构函数
11 public:
12 CWaveFile(LPCTSTR lpszFileName, UINT nOpenFlags);
13 CWaveFile();
14 ~CWaveFile(void);
15
16 public:
17 //////////////////////////////////////////////////////////////////////////
18 // 返回文件是否读取至末尾
19 BOOL IsEOF() const
20 {
21 return
22 (this->m_wavFile.GetLength() == this->m_wavFile.GetPosition());
23 }
24
25 //////////////////////////////////////////////////////////////////////////
26 // 打开wave文件,并读入header信息
27 BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags);
28
29 //////////////////////////////////////////////////////////////////////////
30 // 关闭wave文件
31 void Close();
32
33 //////////////////////////////////////////////////////////////////////////
34 // 读取裸音频数据
35 UINT ReadBytes(void* pData, UINT nCount);
36
37 //////////////////////////////////////////////////////////////////////////
38 // 写入裸音频数据
39 void WriteBytes(void* pData, UINT nCount);
40
41 //////////////////////////////////////////////////////////////////////////
42 // 预备要写入的header信息
43 void PrepareWriteHeader(WAVEFORMATEX& fmt);
44
45 //////////////////////////////////////////////////////////////////////////
46 // 写入header信息
47 void WriteHeader();
48
49 //////////////////////////////////////////////////////////////////////////
50 // 文件指针返回至裸音频数据开始位置
51 void Reset();
52
53 // 格式信息访问操作
54 //////////////////////////////////////////////////////////////////////////
55 // 返回wave文件中所包含的样本数
56 inline DWORD GetSampleFramesCount() const
57 {
58 return (this->m_dwDataChunkSize / this->m_format.wBlockAlign);
59 }
60
61 //////////////////////////////////////////////////////////////////////////
62 // 返回wave文件的formatex信息
63 WAVEFORMATEX GetWaveFormat() const;
64
65 //////////////////////////////////////////////////////////////////////////
66 // 返回wave文件中所包含的裸音频数据的字节数
67 inline DWORD GetDataChunkSize() const
68 {
69 return this->m_dwDataChunkSize;
70 }
71
72 private:
73 //////////////////////////////////////////////////////////////////////////
74 // 读取wave文件的Format信息,被Open调用来设置m_format
75 void ReadHeader();
76
77 private:
78 CFile m_wavFile; // wave文件
79
80 FormatChunk m_format; // wav文件格式
81 DWORD m_dwDataChunkSize; // 数据部分的长度
82 ULONGLONG m_nDataStartFrom; // 裸音频数据开始的位置
83 DWORD m_nBytesWritten; // 已写入字节数
84 };
2 //定义音频文件类
3 //负责WAV文件的打开关闭、chunk数据的获取
4 //
5 //Author: 陈文凯 chwkai@163.com
6 //Create:2005年5月5日
7
8 class CWaveFile
9 {
10 //构造和析构函数
11 public:
12 CWaveFile(LPCTSTR lpszFileName, UINT nOpenFlags);
13 CWaveFile();
14 ~CWaveFile(void);
15
16 public:
17 //////////////////////////////////////////////////////////////////////////
18 // 返回文件是否读取至末尾
19 BOOL IsEOF() const
20 {
21 return
22 (this->m_wavFile.GetLength() == this->m_wavFile.GetPosition());
23 }
24
25 //////////////////////////////////////////////////////////////////////////
26 // 打开wave文件,并读入header信息
27 BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags);
28
29 //////////////////////////////////////////////////////////////////////////
30 // 关闭wave文件
31 void Close();
32
33 //////////////////////////////////////////////////////////////////////////
34 // 读取裸音频数据
35 UINT ReadBytes(void* pData, UINT nCount);
36
37 //////////////////////////////////////////////////////////////////////////
38 // 写入裸音频数据
39 void WriteBytes(void* pData, UINT nCount);
40
41 //////////////////////////////////////////////////////////////////////////
42 // 预备要写入的header信息
43 void PrepareWriteHeader(WAVEFORMATEX& fmt);
44
45 //////////////////////////////////////////////////////////////////////////
46 // 写入header信息
47 void WriteHeader();
48
49 //////////////////////////////////////////////////////////////////////////
50 // 文件指针返回至裸音频数据开始位置
51 void Reset();
52
53 // 格式信息访问操作
54 //////////////////////////////////////////////////////////////////////////
55 // 返回wave文件中所包含的样本数
56 inline DWORD GetSampleFramesCount() const
57 {
58 return (this->m_dwDataChunkSize / this->m_format.wBlockAlign);
59 }
60
61 //////////////////////////////////////////////////////////////////////////
62 // 返回wave文件的formatex信息
63 WAVEFORMATEX GetWaveFormat() const;
64
65 //////////////////////////////////////////////////////////////////////////
66 // 返回wave文件中所包含的裸音频数据的字节数
67 inline DWORD GetDataChunkSize() const
68 {
69 return this->m_dwDataChunkSize;
70 }
71
72 private:
73 //////////////////////////////////////////////////////////////////////////
74 // 读取wave文件的Format信息,被Open调用来设置m_format
75 void ReadHeader();
76
77 private:
78 CFile m_wavFile; // wave文件
79
80 FormatChunk m_format; // wav文件格式
81 DWORD m_dwDataChunkSize; // 数据部分的长度
82 ULONGLONG m_nDataStartFrom; // 裸音频数据开始的位置
83 DWORD m_nBytesWritten; // 已写入字节数
84 };
All the posts in this blog are provided "AS IS" with no warranties, and confer no rights. Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 2.5 China Mainland License.
浙公网安备 33010602011771号