语音特征参数分析平台(三) 语音信号的采集-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 };
posted @ 2005-08-01 00:02  海南K.K  阅读(1750)  评论(0)    收藏  举报