2013-06-24 1 views
1

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

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++;                     
} 

ответ

0

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

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

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

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

+0

Я немного начинающий программист, поэтому, я думаю, я этого не знал и не знал, зачем мне это нужно. Что касается буфера, когда я распечатываю то, что делает цикл, длина буфера работает хорошо. – pritchardsmith

+0

История броска связана с целым делением (если вы не бросаете в двойник). В остальном вы сказали, что 'как есть, цикл sf_read_double while не будет работать. Только когда я умножу «buflen» на 2 (возможно, количество каналов), что цикл работает, что заставило меня вывести, что 'sf_read_double' возвращался в нуль в начале ... Правильно ли? –

+0

Другая мысль: что произойдет, если вы прочтете образцы один за одним, а не блоками размера 'buflen'? Попытка этого даст вам реальное количество доступных образцов ('sampnum'), и, таким образом, вы сможете убедиться, что это число правильно ... Извините, но мне придется уйти. Держите меня в петле, если вы узнаете что-то новое. –