changeset 8:e15ebd222c63

* (Messy) fixes to VST (e.g. for in-place buffers)
author Chris Cannam
date Fri, 11 Jun 2010 20:20:20 +0100
parents 5adad2ca3188
children a1539d4e3b08
files devuvuzelator-vst.cpp devuvuzelator.cpp
diffstat 2 files changed, 81 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/devuvuzelator-vst.cpp	Fri Jun 11 16:38:16 2010 +0100
+++ b/devuvuzelator-vst.cpp	Fri Jun 11 20:20:20 2010 +0100
@@ -5,14 +5,13 @@
 #include <iostream>
 #include <cmath>
 #include <cstdio>
-#include <malloc.h>
 
 #include "public.sdk/source/vst2.x/audioeffect.h"
 
 #define snprintf _snprintf
 #define alloca _alloca
 
-#define FFTSIZE 4096
+#define FFTSIZE 1024
 #define WINSIZE 1024
 
 #include "median.h"
@@ -83,6 +82,8 @@
     int m_read;
     float *m_buffer;
     float *m_outacc;
+	double *m_frame;
+	double *m_spare;
     double *m_real;
     double *m_imag;
     double *m_window;
@@ -169,6 +170,8 @@
     m_buffer = new float[m_winsize];
     m_outacc = new float[m_winsize * 2];
     m_window = new double[m_winsize];
+	m_frame = new double[m_fftsize];
+	m_spare = new double[m_fftsize];
     m_real = new double[m_fftsize];
     m_imag = new double[m_fftsize];
     m_medians = new MedianFilter<double> *[m_fftsize/2+1];
@@ -198,6 +201,8 @@
 {
     delete[] m_buffer;
     delete[] m_outacc;
+	delete[] m_frame;
+	delete[] m_spare;
     delete[] m_real;
     delete[] m_imag;
     delete[] m_window;
@@ -228,17 +233,52 @@
 {
     if (!m_input || !m_output) return;
 
-    int ii = 0;
-    int oi = 0;
     const int sc = sampleCount;
+/*
+	static FILE *blah = 0;
+	if (!blah) {
+		blah = fopen("d:\\devuvu-counts.txt", "w");
+	}
 
-    while (ii < sc) {
+	if (m_input == m_output) fprintf(blah, "in-place\n");
+*/
+	float *output = m_output;
+	if (m_input == m_output) {
+		output = (float *)alloca(sampleCount * sizeof(float));
+	}
+/*	
+	float inmean = 0;
+	for (int i = 0; i < sc; ++i) {
+		inmean += m_input[i] * m_input[i];
+		fprintf(blah, "i:%d:%f ", i, m_input[i]);
+	}
+	inmean/=sc;
+	inmean = sqrt(inmean);
 
-        m_output[oi++] = m_outacc[m_read++];
+	fprintf(blah, "%d\n", (int)sampleCount);
+	fflush(blah);
+*/
+	int oi = 0;
+	for (int ii = 0; ii < sc; ++ii) {
 
+		output[oi++] = m_outacc[m_read++];
+//	m_output[oi++] = inmean * float(ii%100)/100;
+//	m_read++;
         if (m_fill == m_winsize) {
 
             processFrame();
+/*
+	for (int i = 0; i < m_winsize; ++i) {
+		float v = m_buffer[i];
+		fprintf(blah, "%f ", v);
+		m_outacc[m_winsize + i] = m_buffer[i];//m_input[i];//m_buffer[i] ;//* m_window[i];
+	}
+	fprintf(blah, "\n");
+
+//			for (int j = 0; j < m_winsize; ++j) {
+//				m_outacc[m_winsize+j] = inmean * float(j%100)/100;
+//			}
+*/
 
             for (int j = m_increment; j < m_winsize; ++j) {
                 m_buffer[j - m_increment] = m_buffer[j];
@@ -252,45 +292,63 @@
                 m_outacc[j] = 0.f;
             }
 
-            m_fill -= m_increment;
-            m_read -= m_increment;
+            m_fill = m_fill - m_increment;
+            m_read = m_read - m_increment;
         }
+/*
+		fprintf(blah, "%d:%f ", ii, m_input[ii]);
+*/
+		m_buffer[m_fill] = m_input[ii];
+		++m_fill;
+    }
 
-        m_buffer[m_fill++] = m_input[ii++];
-    }
+	static int block = 0;
+	for (int i = 0; i < sc; ++i) {
+//		m_output[i] = float(block % 100) / 100;
+//		m_output[i] = inmean * float(i % 100) / 100;
+	}
+	++block;
+
+	if (m_input == m_output) {
+		for (int i = 0; i < sc; ++i) m_output[i] = output[i];
+	}
 }
 
 void
 Devuvuzelator::processFrame()
 {
-    double *frame = (double *)alloca(m_fftsize * sizeof(double));
+/*	for (int i = 0; i < m_winsize; ++i) {
+		m_outacc[m_winsize + i] += m_buffer[i] ;//* m_window[i];
+	}
+	return;
+*/
+
     for (int i = 0; i < m_fftsize; ++i) {
-        frame[i] = 0.0;
+        m_frame[i] = 0.0;
     }
 
     int ix = m_fftsize - m_winsize/2;
     while (ix < 0) ix += m_fftsize;
     for (int i = 0; i < m_winsize; ++i) {
-        frame[ix++] += m_buffer[i] * m_window[i];
+        m_frame[ix++] += m_buffer[i] * m_window[i];
         if (ix == m_fftsize) ix = 0;
     }
 
-    fft(m_fftsize, false, frame, 0, m_real, m_imag);
+    fft(m_fftsize, false, m_frame, 0, m_real, m_imag);
 
-    processSpectralFrame();
+//    processSpectralFrame();
 
     for (int i = 0; i < m_fftsize/2-1; ++i) {
         m_real[m_fftsize-i-1] =  m_real[i+1];
         m_imag[m_fftsize-i-1] = -m_imag[i+1];
     }
 
-    double *spare = (double *)alloca(m_fftsize * sizeof(double));
-    fft(m_fftsize, true, m_real, m_imag, frame, spare);
+    fft(m_fftsize, true, m_real, m_imag, m_frame, m_spare);
 
     ix = m_fftsize - m_winsize/2;
     while (ix < 0) ix += m_fftsize;
     for (int i = 0; i < m_winsize; ++i) {
-        m_outacc[m_winsize + i] += frame[ix++];
+        m_outacc[m_winsize + i] += m_frame[ix++];
         if (ix == m_fftsize) ix = 0;
     }
 }
--- a/devuvuzelator.cpp	Fri Jun 11 16:38:16 2010 +0100
+++ b/devuvuzelator.cpp	Fri Jun 11 20:20:20 2010 +0100
@@ -23,7 +23,7 @@
         int highbin = 0.5 + (m_fftsize * highfreq) / m_sampleRate;
 
         for (int i = lowbin; i <= highbin; ++i) {
-
+/*
             if (!m_medians[i]) {
                 const float filtersecs = 5.f;
                 int filterlen = (filtersecs * m_sampleRate) / m_increment;
@@ -32,7 +32,10 @@
 
             m_medians[i]->push(mags[i]);
             double threshold = m_medians[i]->getAt(m_reduction);
-            if (mags[i] > threshold && mags[i] > 0.0) {
+
+			*/
+			double threshold = 0.0;
+			if (mags[i] > threshold && mags[i] > 0.0) {
                 double target = mags[i] - threshold;
                 ratios[i] = (target / mags[i]);
             } else {