我需要尽可能快地读入wave文件。我目前正在做的是:
SFINFO sfinfo;
SNDFILE *wavFilefd = sf_open ("mySong.wav", SFM_READ, &sfinfo);
int readBlockSize = 1024*1024; // 1MB
if( sfinfo.frames * 2 < readBlockSize )
{
// actually I don't know where this factor two comes from, but it work's for me
readBlockSize = sfinfo.frames * 2;
}
short tmpSignal[readBlockSize];
int readcount = -1;
std::vector< short > wavVector;
while ((readcount = sf_readf_short (wavFilefd, tmpSignal, readBlockSize)) > 0)
{
++nRead;
wavVector.reserve( (nRead-1) * readBlockSize + nRead);
wavVector.insert( wavVector.end(), tmpSignal, tmpSignal+readcount);
}
sf_close(wavFilefd);
此代码目前运作良好。
问题:当我增加readBlockSize的值时,假设因子为10,然后尝试读取115212164字节的波形文件,我在执行sf_readf_short
时会出现分段错误。
从help我得到“sf_readf_XXXX函数返回读取的帧数。除非在读取期间到达文件末尾,否则返回值应等于请求的帧数。尝试读取超出文件末尾不会导致错误,但会导致sf_readf_XXXX函数返回少于请求的帧数,如果已经在文件末尾,则返回0。“
所以我预计这也适用于10MB。
感谢任何提示。
答案 0 :(得分:0)
来自libsndfile文档:
sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
文件读取框架函数填充ptr指向的数组 请求的数据帧数。阵列必须足够大 保持帧数和通道数。
必须注意确保阵列中有足够的空间 由ptr指出,采取(帧*频道)项目数 (短裤,整体,花车或双打)。
readBlockSize
指定帧数,但你必须为帧数*通道数分配内存。
我不知道你如何真正分配tmpSignal
缓冲区,但你应该用readBlockSize
*频道数量(大概是2)来做。 (或者将每2指定的帧数除以readBlockSize
调用函数。)
答案 1 :(得分:0)
问题是堆栈大小,因此在访问由
分配的变量`tmpSignal'时//..
short tmpSignal[readBlockSize];
//..
我得到了分段错误。
此行为可以通过
重现(至少在我的机器上)short tmp[10485760];
for(unsigned int i = 0; i < 10485760; ++i )
{
tmp[i] = 0;
}