Мне нужно считывать волновые файлы как можно быстрее. В настоящее время я делаю следующее:
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, если уже в конце файла."
Поэтому я ожидал, что это будет работать и для 10 МБ.
Спасибо за любую подсказку.
short tmpSignal[readBlockSize];
? Невозможно выделить массив в C++ с размером константы, отличной от времени компиляции. - person Gonmator   schedule 20.06.2013sf_readf_short
, я прав? - person Gonmator   schedule 20.06.2013sf_readf_short()
в качестве третьего параметра числоshort
s или количество байтов? Кроме того, возвращает ли он количествоshort
s или количество байтов? - person Gonmator   schedule 20.06.2013