Пустой поплавок ** для звуковых сэмплов

Я пытался передать и массивировать метод в аудиобиблиотеке DiracLE.

Массив выглядит так в отладчике

введите здесь описание изображения

- (OSStatus) readFloatsConsecutive:(SInt64)numFrames intoArray:(float**)audio withOffset:(long)offset

Это заполняет массив так

if (audio) {
    for (long c = 0; c < mExtAFNumChannels; c++) {
        if (!audio[c]) continue;  // this executes for both channels 
                                  // but doesnt proceed into next for loop
        for (long v = 0; v < numFrames; v++) {
            if (v < loadedPackets) audio[c][v+offset] = (float)data[v*mExtAFNumChannels+c] / 32768.f;
            else audio[c][v+offset] = 0.f;
        }
    }
}

Я называю это так

[reader readFloatsConsecutive:frameCount intoArray:arrayToFill];

arrayToFill является аргументом текущей области действия функции

[self readAudioDataForFile:temp withArray:tempArray];

Массив изначально был передан в функцию следующим образом

 // this array was passed into the function as tempArray  which is float **tempArray = NULL;
 arrayToFill  = (float **) malloc ( (frameCount * channelCount) * sizeof( float ));

Поскольку мне нужно было извлечь аудиоданные из файла в моем методе, я должен выделить там массив и передать его в функцию dirac для заполнения. Я malloc вроде так arrayToFill = (float **) malloc ( (frameCount * channelCount) * sizeof( float )); а затем передаю его функции dirac, как упоминалось ранее.

Этот массив может быть двумерным или одномерным массивом в зависимости от количества каналов.


person user773578    schedule 22.07.2012    source источник
comment
как вы пытаетесь их зарегистрировать? с %@? Потому что вы должны использовать обычный спецификатор формата C %fas.   -  person Jack    schedule 22.07.2012
comment
Я использовал это, похоже, что массив пуст, когда он попадает в цикл for, чтобы заполнить переданный массив. если (аудио) не удается, поэтому у меня ничего нет в массиве? Правильно ли я распределяю массив, потому что кажется, что после передачи его через два вызова функций он не существует.   -  person user773578    schedule 22.07.2012
comment
@Jack - Хорошая игра по ссылке на ваш сайт. :)   -  person user773578    schedule 22.07.2012
comment
Вы не используете имена последовательно, поэтому просто для проверки... массив выделяется с помощью frameCount, но цикл повторяется до numFrames? Это опечатка? А если нет, может ли numFrames быть просто нулем?   -  person Kevin Grant    schedule 22.07.2012
comment
Это не опечатка, numFrames вызывается в функции Dirac, которой я передаю свой массив. Когда я делаю точку останова на операторе if(!audio[c]) continue, он выполняется 4 раза. Что-то определенно не так с массивом, я думаю. Количество каналов равно 2.   -  person user773578    schedule 22.07.2012


Ответы (1)


На мой взгляд, проблема заключается в распределении.

Выделение одномерного массива будет выглядеть так:

arrayToFill = (float *) malloc ( (frameCount * channelCount) * sizeof( float ));

и хватило бы.

Однако выделение двумерного массива будет другим, потому что вам нужно выделить даже внутренние массивы. Если я правильно понял, если у вас два канала, то массив двумерный, вы должны сделать что-то вроде:

arrayToFill = (float **)calloc(channelCount, sizeof(float*));
for (int i = 0; i < channelCount; ++i)
  arrayToFill[i] = (float*)calloc(frameCount, sizeof(float));

Это потому, что вам нужно выделить указатель на указатель с плавающей запятой. Таким образом, на первом этапе вы выделяете двумерный массив указателей для float, эти указатели инициализируются как NULL, поэтому вам нужно пройтись по ним и выделить их отдельно.

Если канал находится внутри массива (например, первый индекс выбирает фрейм, а не канал), вам следует поменять местами размеры.

person Jack    schedule 22.07.2012