libsndfile sf_readf_short最大帧数

时间:2013-06-20 07:35:39

标签: c++ libsndfile

我需要尽可能快地读入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。

感谢任何提示。

2 个答案:

答案 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;
}