我使用此library来阅读wave文件的样本,特别是this method:
unsigned int ReadDoublesNI(double** samples, unsigned int offs, unsigned int nsamples, int nchdest = 0)
我打开的Grv Kick Acoustic 01.wav
文件可以下载here。
似乎使用此代码正确加载文件(文件属性正确,例如m_bps
,m_nch
和size
):
WaveReader mWaveReader = WaveReader("D:\\Google Drive\\Samples\\Grv Kick Acoustic 01.wav");
const unsigned int size = mWaveReader.GetSize();
vector<double> samplesContainer(size);
double* mono[1] = { samplesContainer.data() };
mWaveReader.ReadDoublesNI(mono, 0, size, 0);
但是一旦它在ReadDoublesNI上达到fread,它就跳到函数的结尾,结束for语句并立即返回。所以我无法从文件中读取任何样本。
我哪里错了?
答案 0 :(得分:2)
您当前的代码会在WaveReader
构造函数调用中打开该文件:
WaveReader mWaveReader = WaveReader("D:\\Google Drive\\Samples\\Grv Kick Acoustic 01.wav");
此构造函数调用Open
,但不处理此调用失败的情况。
相反,调用默认构造函数,然后显式调用Open
,并自己处理错误情况:
WaveReader mWaveReader = WaveReader();
if (!mWaveReader.Open("D:\\Google Drive\\Samples\\Grv Kick Acoustic 01.wav")) {
// something went wrong - handle this appropriately, and don't use the mWaveReader object
}
这至少会处理文件未正确打开的情况。