2012-06-27 2 views
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++; 
    } 
} 

아무도 나에게 무엇이 잘못 되었습니까?

답변

2

p을 초기화하지 않았습니다. 이 코드에서주의해야 할 다른 사항 : -

  • sampleFrames + bufferOffset이 입출력 버퍼의 크기보다 작습니까? 당신은 그것을 확인하는 방법으로 정말로 할 수 있습니다.
  • buffer의 출처 또는 그 외 무엇을 쓰고 있는지 명확하지 않습니다. 코드가 실행되기 전에 쓰레기가 발생하면 가장 먼저해야 할 일이 있기 때문에 모든 곳에서 쓰레기가 날 것입니다.
  • pinInput1.getBuffer() 등을 반환하는 것은 아닙니다. 반환 값이 char*이고 float 배열을 가리킨다는 것을 알게되면 float*으로 결과를 캐스팅해야합니다. 전에 포인터 계산을 수행하여 다음 float으로 넘어 가고 있는지 확인하십시오. 배열의 다음 바이트가 아닌 배열.
+0

안녕하세요 - 잊어 버렸습니다. 문제는 for 루프에 있습니다. 이 코드는 .dll을위한 것입니다 - 오디오 플로팅을 스트리밍하려면 -> float - pinInput1.getBuffer()는 표준 호출 규칙입니다. 버퍼는 원형 지연 버퍼 -> .h 파일에서 float 버퍼 [65536]로 초기화됩니다. –

+0

당신이 옳았어요! p는 제대로 초기화되지 않았습니다 - 둘 다 r이 아니 었습니다! 그들은 "캐주얼 (casual)"을 위해 1- 샘플 딜레이가 필요하기 때문에 별도의 인텐시이션이 필요했습니다. 나는 바보 같은 바보 ;-) 당신의 도움에 감사드립니다! –

관련 문제