Почему этот аудиофайл не читается с помощью sf_read_double?

Я пытаюсь разделить каждое подразделение барабанной последовательности на отдельный массив внутри двумерного массива (строки для какого подразделения, столбцы для данных в каждом подразделении). Я определяю, сколько сэмплов на подразделение ранее в коде с пользовательскими спецификациями по темпу и желаемому подразделению. Я чувствую, что у меня есть несколько разумный метод для определения размера входного файла в примерах (показан первый раздел). Мой вопрос: как есть, цикл sf_read_double while не будет работать. Цикл запускается только тогда, когда я умножаю «буфлен» на 2 (возможно, количество каналов). И когда он запускается, цикл превышает общее количество рассчитанных выборок и приводит к ошибке sug. Что я делаю неправильно в этом коде?

double framesArray[sfinfo.frames];
int numframes = (sizeof(framesArray)/sizeof(double));
int totalSamps = numframes * sfinfo.channels;
int totalSubdivisions = totalSamps / sampsPerSubdivision;
int buflen = sampsPerSubdivision;


int i;
double** choppeddata = (double**) malloc(totalSubdivisions * sizeof(double**));
for (i = 0; i < totalSubdivisions; i++)
    choppeddata[i] = (double*) malloc(buflen * sizeof(double*));
double* buffereddata = (double*) malloc(buflen * sizeof(double*));
double* outdata = (double*) malloc(totalSamps * sizeof(double*));

int j = 0, k = 0, sampnum = 0;
while ((readcount = sf_read_double (infile, buffereddata, buflen)))
{
    for (k = 0; k < buflen; k++)
    {
        choppeddata[j][k] = buffereddata[k];
        sampnum++;
    }

    j++;                                                                                
}

person pritchardsmith    schedule 24.06.2013    source источник


Ответы (1)


Разве sampsPerSubdivision не следует использовать? Я полагаю, что он был объявлен как int. В этом случае вам понадобится что-то вроде:

int totalSubdivisions = (int)(totalSamps / (double)sampsPerSubdivision);

Так что totalSubdivisions может быть неправильным... В любом случае, это не объясняет, почему ваш buflen плохо подходит для чтения данных. Я предполагаю, что sampsPerSubdivision в первую очередь неверно.

Я не мог сказать больше. Надеюсь, это поможет...

person Gauthier Boaglio    schedule 24.06.2013
comment
Я немного начинающий программист, поэтому, думаю, я этого не знал и не знал, зачем мне это нужно. Что касается буфера, когда я распечатываю, что делает цикл, длина буфера работает хорошо. - person pritchardsmith; 24.06.2013
comment
История приведения имеет отношение к целочисленному делению (если не приводить к двойному). В остальном вы сказали, что as is, the sf_read_double while loop will not run. It is only when I multiply "buflen" by 2 (perhaps number of channels) that the loop runs, из чего я сделал вывод, что sf_read_double с самого начала возвращает ноль... Я прав? - person Gauthier Boaglio; 24.06.2013
comment
Еще одна мысль: что произойдет, если вы будете читать образцы по одному, а не по блокам размером buflen? Попробовав это, вы получите реальное количество доступных семплов (sampnum), и, таким образом, вы сможете убедиться, что это число правильное... Извините, но мне придется уйти. Держи меня в курсе, если узнаешь что-то новое. - person Gauthier Boaglio; 24.06.2013
comment
Я немного повозился с кастингом. Я еще не получил другую реализацию для работы. Причина, по которой я использую 2d-массив, заключается в том, что, как только я заработаю этот упрощенный код, я хотел бы сделать выходные случайные сокращения входных данных - по сути, барабанный манипулятор или резак. Если вам интересно, код находится здесь: ссылка. Наконец-то я научился печатать звук, но он либо обрывает данные, вызывая заикание, либо воспроизводит их с удвоенной скоростью. Как я уже говорил, я новичок. Это просто командная строка, позже я узнаю о классах и т.д. - person pritchardsmith; 25.06.2013