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