2011-02-02 6 views
0

VST DSP 플러그인을 C++로 프로그래밍하고 있습니다.클래스 함수 메서드 내에서 버퍼에 값 저장

'필터 뱅크'에 일련의 대역 통과 필터를 생성합니다. 헤더 (함수 포함)에 필터 클래스를 구현하고 .cpp에 생성자/소멸자를 올바르게 작성했습니다.

값을 메서드에 전달하고 반환 할 수도 있습니다. 그러나이 문제는 함수의 버퍼에 데이터를 저장하는 영역에 놓여 있습니다. 함수 메서드가 호출 될 때마다 버퍼에 저장된 값이 다시 설정되거나 그 대신에 첫 번째 위치에 올바르게 저장되지 않는 것으로 보입니다. 따라서 전달 된 것은 '완료'되지 않습니다.

대단히 감사합니다.

n.b. 이 게시물이 새로운 코드를 갱신하고있다 : 여기

클래스입니다 :

class aFilterL 

{

친구 클래스 Beat_to_Midi;

공개 : aFilterL(); ~ aFilterL();

float fOut1_l; 
float filterOut1_l; 
float Out_1_l; 
float Out_2_l; 
float* buffer_Out_1_l; 
float* buffer_Out_2_l; 

가상 플로트 aFilterMethodL (플로트 A0, 플로트 (A1), 플로트 (A2), 플로트 (B1), 플로트 (B2)는, prevInput2L 플로트 prevInput1L 플로트 inputL 플로트) {

Out_1_l = buffer_Out_1_l[0]; 
Out_2_l = buffer_Out_2_l[0]; 

filterOut1_l = (a0 * inputL) + (a1 * prevInput1L) + (a2 * prevInput2L) - (b1 * Out_1_l) - (b2 * Out_2_l) + 1.0E-25; 

fOut1_l = filterOut1_l; 
buffer_Out_2_l[0] = buffer_Out_1_l[0]; 
buffer_Out_1_l[0] = fOut1_l; 
return fOut1_l; 

}

} ;

클래스 aFilterR {

친구 클래스 Beat_to_Midi;

공개 : aFilterR(); ~ aFilterR();

float fOut1_r; 
float filterOut1_r; 
float Out_1_r; 
float Out_2_r; 
float* buffer_Out_1_r; 
float* buffer_Out_2_r; 

가상 플로트 aFilterMethodR (플로트 A0, 플로트 (A1), 플로트 (A2), 플로트 (B1), 플로트 (B2)는, prevInput2R 플로트 prevInput1R 플로트 inputR 플로트) {

Out_1_r = buffer_Out_1_r[0]; 
Out_2_r = buffer_Out_2_r[0]; 

filterOut1_r = (a0 * inputR) + (a1 * prevInput1R) + (a2 * prevInput2R) - (b1 * Out_1_r) - (b2 * Out_2_r) + 1.0E-25; 

fOut1_r = filterOut1_r; 
buffer_Out_2_r[0] = buffer_Out_1_r[0]; 
buffer_Out_1_r[0] = fOut1_r; 
return fOut1_r; 

} }; 다음

그 다음에 파괴 된 CPP/구성된다 :

aFilterL::aFilterL() 

{ fOut1_l = 0.f; filterOut1_l = 0.에프;

Out_1_l = 0.f; 
Out_2_l = 0.f; 

buffer_Out_1_l = new float [1]; 
buffer_Out_2_l = new float [1]; 

buffer_Out_1_l[0] = 0.f; 
buffer_Out_2_l[0] = 0.f; 

}

aFilterL :: ~ aFilterL() {

if (buffer_Out_1_l) 
    delete[] buffer_Out_1_l; 
if (buffer_Out_2_l) 
    delete[] buffer_Out_2_l; 

}

aFilterR :: aFilterR() { fOut1_r = 0.f;

filterOut1_r = 0.f; 

Out_1_r = 0.f; 
Out_2_r = 0.f; 

buffer_Out_1_r = new float [1]; 
buffer_Out_2_r = new float [1]; 

buffer_Out_1_r[0] = 0.f; 
buffer_Out_2_r[0] = 0.f; 

}

aFilterR :: ~ aFilterR() 마지막으로이 같은 processReplacing 기능에 구현되어 {

if (buffer_Out_1_r) 
    delete[] buffer_Out_1_r; 
if (buffer_Out_2_r) 
    delete [] buffer_Out_2_r; 

}

:

무효 myPlugin :: processRe 재치 (출력 ** ** 입력 플로트 플로트, VstInt32 sampleFrames) {

float* in1 = inputs[0]; 
float* in2 = inputs[1]; 
float* out1 = outputs[0]; 
float* out2 = outputs[1]; 

    aFilterL *my_aFilter1L = new aFilterL; 
aFilterR *my_aFilter1R = new aFilterR; 

동안 (--sampleFrames> = 0) {

// 필터 입력

In_1_l = buffer_In_1_l [0];

In_1_r = buffer_In_1_r [0];

In_2_l = buffer_In_2_l [0];

In_2_r = buffer_In_2_r [0];

// 관리 필터

buffer_In_2_l [0] = buffer_In_1_l [0];

buffer_In_2_r [0] = buffer_In_1_r [0];

buffer_in_1_l [0] = * in1;

buffer_in_1_r [0] = * in2;

// 처리

위해 작동 보내

returnedL = my_aFilter1L-> aFilterMethodL (0.000171f, 0.0f를, -0.000171f, -1.999911f, 0.999943f * IN1, In_1_l, In_2_l);

returnedR = my_aFilter1R-> aFilterMethodR (0.000171f, 0.0f, -0.000171f, -1.999911f, 0).999943f, * in2, In_1_r, In_2_r);

필터 출력 보내기 // 밖으로

* OUT1 = returnedL;

* out2 = returnedR;

* in1 ++;

* in2 ++;

* out1 ++;

* out2 ++; }}

+0

가상 메소드가 있고 포인터가 초기화되지 않았 으면 소멸자가 가상이어야합니다 ... 운좋게도 반환 값은 정의되지 않은 동작을 건너 뜁니다. – AJG85

답변

1

중첩 된 클래스에 대한 내 새 질문을 만든 후 here 해결책을 찾았습니다.

필터 클래스는 myPlugin 클래스 내에서 선언됩니다. 새로운 인스턴스가 생성되는 myPlugin 생성자

myPlugin::aFilterL::aFilterL() 
myPlugin::aFilterL::~aFilterL() 

:

여기에서 생성자와 소멸자는 다음과 같이 내장되어

aFilterL *my_aFilter1L = new aFilterL(); 

과 퍼즐의 마지막 조각이 있는지 확인하기 위해 다음이다 그들이 myPlugin 효과에 인스턴스로 추가됩니다.

aFilterL my_aFilter1L; 
aFilterR my_aFilter1R; 

my_aFilter1L etc는 processReplacing을 통해 액세스 할 수 있으며 제대로 작동하는 것 같습니다.

이 문제에 도움을 주신 모든 분들께 많은 감사를드립니다.

3

return이 기능을 즉시 종료한다는 사실을 알고 있습니까? 따라서 버퍼에 값을 저장하는 코드는 절대로 실행되지 않습니다.

대신 함수 호출이 끝날 때 호출해야합니다.

일부 다른 노트 :

  • 당신은 오직 첫 번째 요소를 사용하는 경우 버퍼에 대한 포인터를해야 할 이유가 내게 불분명하다.
  • -L 및 -R 함수에 중복 코드가 있습니다. 대신 '모노'클래스의 인스턴스 두 개를 사용하므로 클래스 당 하나의 채널에 대한 데이터 만 저장합니다.
  • this->을 사용할 필요는 거의 없습니다. 그냥 내버려둬.
+0

이것은 aFilterMethodR과 aFilterMethodL 모두에서 발생합니다. – Muggen

+0

예. 나는 그걸 주워주지 않았다. 나는 지금 그것을 바꿨으며 프로그램이 작동하는 방식과 청각 적으로 출력되는 방식을 바 꾸었습니다. 그러나 일부 라이브 디버깅을 수행하는 경우에도 버퍼에 저장된 값 0.0이 표시됩니다. 이는 필터가 여전히 작동하지 않음을 의미합니다. –

+0

1.이것은 나에게 다소 이상하게 보이지만 vst sdk는 버퍼 데이터를 처리하는 방법에 대해 까다롭기 때문에 이러한 값은 생성자에서 buffer_Out_1_r = new float [1];로 초기화됩니다. \t buffer_Out_1_r [0] = 0.f;'2. 명확한 설명을 위해 aFilterL과 aFilterR이라는 두 개의 클래스를 만들었습니다. 3.이 기능과 현재 기능을 동일하게 제거했습니다. 덕분에 –