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でも機能すると予想していました。
ヒントをありがとう。