3

私は基本的なオーディオ遅延を実装しようとしています-しかし、私が得ているのはゴミであり、おそらく非常に明白なものです-しかし、私はそれを見つけることができないようです...

オーディオは、実行時に決定されるバッファを介して処理されます。

私はポインターでひどく間違ったことをしていると思います。他のコードを見てみましたが、それらはすべて「不完全」に見えますが、常に基本的なものが欠けています。おそらく私のコードにも欠けているものです。

// Process audio
// 1
void Gain::subProcessSimpleDelay( int bufferOffset, int sampleFrames )
{
    // Assign pointers to your in/output buffers. 
    // Each buffer is an array of float samples.
    float* in1  = bufferOffset + pinInput1.getBuffer();
    float* in2  = bufferOffset + pinInput2.getBuffer();
    float* out1 = bufferOffset + pinOutput1.getBuffer();

    // SampleFrames = how many samples to process (can vary). 
    // Repeat (loop) that many times
    for( int s = sampleFrames; s > 0; --s ) 
    {
        // get the sample 'POINTED TO' by in1.
        float input1 = *in1;    

        float feedback = *in2;
        float output;
        unsigned short int p, r;
        unsigned short int len;
        len =  600;

        // check at delay length calculation
        if (len > 65535) 
            len = 65535; 
        // otherwise, a length of 0 will output the input from 
        // 65536 samples ago
        else if (len < 1) 
            len = 1; 

        r = p - len; // loop
        output = buffer[r];
        buffer[p] = input1 + output * feedback;
        p++;

        *out1 = output;

        // store the result in the output buffer.
        // increment the pointers (move to next sample in buffers).
        in1++;
        in2++;
        out1++;
    }
}

誰かが私に何が悪いのか教えてもらえますか?

4

1 に答える 1

2

を初期化していませんp。このコードで注意すべきその他の事項:-

  • sampleFrames + bufferOffsetが入力バッファーと出力バッファーのサイズよりも小さいことを確認しますか?あなたは本当にそれをチェックする方法で行うことができます。
  • bufferどこから来たのか、他に何が書かれているのかは明らかではありません。コードを実行する前にガベージであると、最初にコードから読み取られるため、どこでもガベージになってしまいます。
  • pinInput1.getBuffer()どのタイプなどが返されるかはわかりません。それらがを返し、char*floatの配列を指していることがわかっている場合は、ポインタ演算を実行するfloat* に結果をにキャストして、配列内の次のfloatに進んでいることを確認する必要があります。配列の次のバイト。
于 2012-06-27T19:26:40.630 に答える