0

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ます。

私が得たヘルプから、 「sf_readf_XXXX関数は読み取ったフレーム数を返します。読み取り中にファイルの終わりに達しない限り、戻り値は要求されたフレーム数と等しくなるはずです。ファイルの終わりを超えて読み取ろうとすると、エラーになりますが、sf_readf_XXXX 関数は要求されたフレーム数よりも少ない値を返すか、すでにファイルの最後にある場合は 0 を返します。」

したがって、これは10MBでも機能すると予想していました。

ヒントをありがとう。

4

2 に答える 2

0

問題はスタック サイズです。

//..
short tmpSignal[readBlockSize];
//..

セグメンテーション違反が発生します。

この動作は、(少なくとも私のマシンでは)次の方法で再現できます

short tmp[10485760];
for(unsigned int i = 0; i < 10485760; ++i ) 
{
    tmp[i] = 0;
}
于 2013-06-21T14:30:04.083 に答える