Я пишу функцию для загрузки волнового файла и, в процессе, разделяю данные на 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);
}
Это выглядит неправильно для меня: file + i
У вас только один дескриптор файла, верно? Не добавлять i
к этому !!
file is FILE * Мое предположение было, как и большинство указателей, что добавление
целое число для указателя будет считывать из смещения в файле.
FILE * — указатель на структуру FILE, которая хранит информацию о файле, который вы открыли. Вы всегда передаете этот указатель в функции stdio. Если вы хотите найти определенную позицию в файле, используйте fseek
, Если вы просто читаете файл последовательно от начала до конца, вам не нужно искать.
Для тех, кто хочет, это мое полное решение, я публикую это. Оказывается, циклическое переключение между вызовами 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(¶ms.leftChannelData[offset], &buf[i], stride * sizeof(BYTE));
else{
memcpy(¶ms.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);
}