Быстрые звонки на фред вылетает из приложения

Я пишу функцию для загрузки волнового файла и, в процессе, разделяю данные на 2 отдельных буфера, если это стерео. Программа доходит до i = 18 и вылетает во время прохода левого канала. (Вы можете игнорировать койты, они просто для отладки.) Может быть, я должен загрузить файл за один проход и использовать memmove для заполнения буферов?

if(params.channels == 2){
params.leftChannelData = new unsigned char[params.dataSize/2];
params.rightChannelData = new unsigned char[params.dataSize/2];

bool isLeft = true;

int offset = 0;
const int stride = sizeof(BYTE) * (params.bitsPerSample/8);

for(int i = 0; i < params.dataSize; i += stride)
{
std::cout << "i = " << i << " ";
if(isLeft){
std::cout << "Before Left Channel, ";
fread(params.leftChannelData+offset, sizeof(BYTE), stride, file + i);
std::cout << "After Left Channel, ";
}
else{
std::cout << "Before Right Channel, ";
fread(params.rightChannelData+offset, sizeof(BYTE), stride, file + i);
std::cout << "After Right Channel, ";
offset += stride;
std::cout << "After offset incr.\n";
}

isLeft != isLeft;
}

} else {
params.leftChannelData = new unsigned char[params.dataSize];
fread(params.leftChannelData, sizeof(BYTE), params.dataSize, file);
}

0

Решение

Это выглядит неправильно для меня: file + i

У вас только один дескриптор файла, верно? Не добавлять i к этому !!

file is FILE * Мое предположение было, как и большинство указателей, что добавление
целое число для указателя будет считывать из смещения в файле.

FILE * — указатель на структуру FILE, которая хранит информацию о файле, который вы открыли. Вы всегда передаете этот указатель в функции stdio. Если вы хотите найти определенную позицию в файле, используйте fseek, Если вы просто читаете файл последовательно от начала до конца, вам не нужно искать.

3

Другие решения

Для тех, кто хочет, это мое полное решение, я публикую это. Оказывается, циклическое переключение между вызовами Fread происходит намного медленнее, чем одно использование Fread, с циклическим переключением между вызовами memcpy (хотя это занимает в два раза больше памяти). Еще одна проблема в моем опубликованном коде заключалась в том, что я сказал:

isLeft != isLeft;

вместо

isLeft = !isLeft;

Решение:

if(params.channels == 2){
params.leftChannelData = new unsigned char[params.dataSize/2];
params.rightChannelData = new unsigned char[params.dataSize/2];
unsigned char * buf = new unsigned char[params.dataSize];

fread(buf, sizeof(BYTE), params.dataSize, file);

bool isLeft = true;

int offset = 0;
const int stride = params.bitsPerSample/8;

for(int i = 0; i < params.dataSize; i += stride)
{

if(isLeft)
memcpy(&params.leftChannelData[offset], &buf[i], stride * sizeof(BYTE));
else{
memcpy(&params.rightChannelData[offset], &buf[i], stride * sizeof(BYTE));
offset += stride;
}
isLeft = !isLeft;
}

params.dataSize = params.dataSize/2;

delete(buf);

} else {
params.leftChannelData = new unsigned char[params.dataSize];
params.rightChannelData = NULL;
fread(params.leftChannelData, sizeof(BYTE), params.dataSize, file);
}
0

По вопросам рекламы [email protected]