0

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 ));

メソッドでファイルからオーディオ データを抽出する必要があったため、そこに配列を malloc し、それを dirac 関数に渡して入力する必要があります。私はそのように mallocarrayToFill = (float **) malloc ( (frameCount * channelCount) * sizeof( float ));し、前述のように dirac 関数に渡します。

この配列は、チャネル数に応じて 2 次元または 1 次元の配列になります。

4

1 に答える 1

1

私の意見では、問題は割り当てに依存しています。

1 次元配列を割り当てると、次のようになります。

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

それで十分でしょう。

ただし、内部配列も割り当てる必要があるため、2 次元配列の割り当ては異なります。チャンネルが 2 つある場合に配列が 2 次元であることを正しく理解していれば、次のようにする必要があります。

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

これは、float へのポインターへのポインターを割り当てる必要があるためです。したがって、最初のステップでは、ポインターの 2 次元配列を float に割り当てます。これらのポインターは初期化されるNULLため、ループして個別に割り当てる必要があります。

チャネルが配列の内側にある場合 (たとえば、最初のインデックスがチャネルではなくフレームを選択する場合)、次元を交換する必要があります。

于 2012-07-22T14:05:24.303 に答える