fanch 1 年之前
父节点
当前提交
a12a909107

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+/Debug/
+/debug/

+ 0 - 1
src/core/PluginIndex.cpp

@@ -86,7 +86,6 @@ void PluginIndex::_update_dir(const std::string& dir){
 		  closedir(psDirectory);
 		  return;
 		}
-		printf("-> %s\n", direntry->d_name);
 		if(!endswith(direntry->d_name, ".so")){
 			continue;
 		}

+ 1 - 1
src/core/PluginIndex.h

@@ -56,7 +56,7 @@ public:
 			if(m_table[i].ptr == ptr){
 				m_table[i].count--;
 				if(m_table[i].count<=0){
-					printf("Close %s\n", m_table[i].path.c_str());
+					//printf("Close %s\n", m_table[i].path.c_str());
 					dlclose(m_table[i].ptr);
 					m_table.erase(m_table.begin()+i);
 				}

+ 6 - 2
src/core/PluginInstance.cpp

@@ -10,8 +10,9 @@
 #include "PluginInstance.h"
 
 PluginInstance::PluginInstance(PluginManager& manager, PluginEntry& entry, int index, int id) :
-	m_id(id), m_index(index), m_manager(manager), m_entry(entry){
+	m_id(id), m_index(index), m_manager(manager), m_entry(entry), m_sample_count(0){
 	m_dll = DllManager::open(entry.path());
+	m_sample_rate = 0;
 	if(!m_dll){
 		throw "unable to open dll";
 	}
@@ -63,6 +64,9 @@ void PluginInstance::desactivate(){
 }
 
 void PluginInstance::run(){
-	m_desc->run(m_instance, m_sample_rate);
+	m_desc->run(m_instance, m_sample_count);
+}
 
+void PluginInstance::set_sample_count(unsigned long d) {
+	m_sample_count = d;
 }

+ 2 - 0
src/core/PluginInstance.h

@@ -47,6 +47,7 @@ class PluginInstance {
 	void connect(int self_id, LADSPA_Data *data);
 	LADSPA_Data get(int id) const;
 	void set(int id, LADSPA_Data d);
+	void set_sample_count(unsigned long d);
 	void activate();
 	void desactivate();
 	void run();
@@ -65,6 +66,7 @@ protected:
 	PluginManager &m_manager;
 	PluginEntry &m_entry;
 	unsigned long m_sample_rate;
+	unsigned long m_sample_count;
 
 	friend class PluginManager;
 };

+ 2 - 1
src/core/PluginManager.cpp

@@ -63,13 +63,14 @@ PluginInstance* PluginManager::add_plugin(PluginEntry &p) {
 	for(const PluginPort& port : p.ports()){
 		if(port.is_audio){
 			if(port.is_input){
-				plugin->connect(port.index, output);
+				plugin->connect(port.index, input);
 			}
 			if(port.is_output){
 				plugin->connect(port.index, output);
 			}
 		}
 	}
+	plugin->set_sample_count(m_sample_count);
 	m_plugins.push_back(plugin);
 	return plugin;
 }

+ 3 - 0
src/core/PluginManager.h

@@ -43,6 +43,9 @@ public:
 	void disconnect(PluginInstance* p, int pid);
 	PluginInstance*  add_plugin(PluginEntry& p);
 	LADSPA_Data* run(LADSPA_Data*);
+	LADSPA_Data* get_input() const {
+		return m_input;
+	}
 
 
 

+ 20 - 4
src/io/FileSoundInput.cpp

@@ -6,28 +6,44 @@
  */
 
 #include "FileSoundInput.h"
-
+#include <cstring>
+#include <cmath>
 FileSoundInput::FileSoundInput(const std::string &path, unsigned int sc) {
 	m_path = path;
 	m_type = Type::FILE;
 	SF_INFO info;
+   memset(&info, 0, sizeof(SF_INFO));
 	m_fd = sf_open(m_path.c_str(), SFM_READ, &info);
 	if (!m_fd){
 		throw "Erreur de lecture de fichier";
 	}
-	m_channles = info.channels;
+	m_channels = info.channels;
 	m_sample_rate = info.samplerate;
 	m_sample_size = info.format;
+	m_sample_count = sc;
+	m_buffer = new LADSPA_Data[m_channels * sc];
 	init(sc);
 }
-
+int icount = 0;
 FileSoundInput::~FileSoundInput() {
 	close();
 }
 
 LADSPA_Data* FileSoundInput::_next(LADSPA_Data* x) {
 	sf_count_t len;
-	len = sf_readf_float(m_fd, x, (sf_count_t)m_sample_count);
+
+	len = sf_readf_float(m_fd, m_buffer, (sf_count_t)(m_sample_count*m_channels) );
+	int j=0;
+	for(int i=0; i<len; i++){
+		int ch = i % m_channels;
+		if(!ch){
+			x[j] = m_buffer[j];
+			j++;
+		}
+	}
+
+	icount ++;
+	//printf("len = %d\n", len);
 	if(!len) return NULL;
 	return x;
 }

+ 3 - 1
src/io/FileSoundInput.h

@@ -15,15 +15,17 @@
 
 class FileSoundInput : public SoundInputStream {
 public:
-	FileSoundInput(const std::string& path, unsigned int sample_cout = 1024);
+	FileSoundInput(const std::string& path, unsigned int sample_cout);
 	~FileSoundInput();
 
+
 	void close();
 
 protected:
 	virtual LADSPA_Data* _next(LADSPA_Data*);
 	std::string m_path;
 	SNDFILE*	m_fd;
+	LADSPA_Data* m_buffer;
 
 };
 

+ 1 - 1
src/io/SoundInput.h

@@ -41,7 +41,7 @@ protected:
 	virtual LADSPA_Data* _next(LADSPA_Data*) = 0;
 	Type m_type;
 	unsigned long m_sample_rate;
-	unsigned int m_channles;
+	unsigned int m_channels;
 	unsigned int m_sample_size;
 	unsigned int m_sample_count;
 	LADSPA_Data* m_buffer;

+ 45 - 20
src/plugins/AudiToMidi.cpp

@@ -36,6 +36,7 @@ public:
 		m_output = output;
 		m_input_complex = NULL;
 		m_output_complex = NULL;
+		m_count = 0;
 	}
 
 	void set_count(int n){
@@ -114,18 +115,18 @@ public:
 		return new AudiToMidi(SampleRate);
 	}
 
-	AudiToMidi(long sample_rate) : m_input_data(NULL), m_output_data(NULL), m_sample_rate(sample_rate) {
-		m_input_complex = fftw_alloc_complex(sample_rate);
-		m_output_complex = fftw_alloc_complex(sample_rate);
-		for(unsigned int i=0; i<sample_rate; i++){
-			m_output_complex[i][1] = m_input_complex[i][1] =0  ;
-		}
-		m_dftplan = fftw_plan_dft_1d(sample_rate, m_input_complex, m_output_complex, FFTW_FORWARD, FFTW_ESTIMATE);
-
-		count = 0;
+	AudiToMidi(long sample_rate) :
+		m_sample_rate(sample_rate){
+			count = 0;
+			m_input_complex = m_output_complex = NULL;
+			m_input_data = m_output_data = NULL;
+			m_sample_count = 0;
+			m_dftplan = NULL;
 		m_fft = new CustomFft(&m_input_data, &m_output_data);
 	}
 
+
+
 	virtual ~AudiToMidi(){
 		fftw_destroy_plan(m_dftplan);
 		fftw_free(m_input_complex);
@@ -135,6 +136,7 @@ public:
 	LADSPA_Data * m_input_data;
 	LADSPA_Data * m_output_data;
 	long  m_sample_rate;
+	long m_sample_count;
 	fftw_complex* m_input_complex;
 	fftw_complex* m_output_complex;
 	int count;
@@ -154,27 +156,51 @@ public:
 	}
 
 
-	void run(long sc){
+	void set_count(long sc){
+		if(m_sample_count != sc){
+			m_sample_count = sc;
+			if(m_input_complex) fftw_free(m_input_complex);
+			if(m_output_complex) fftw_free(m_output_complex);
 
-		printf("RUN !!!!!!!\n");
-		m_fft->set_count(sc);
+			m_fft->set_count(sc);
+			m_input_complex = fftw_alloc_complex(m_sample_count);
+			m_output_complex = fftw_alloc_complex(m_sample_count);
+			for(unsigned int i=0; i<m_sample_count; i++){
+				m_output_complex[i][1] = m_input_complex[i][1] =0  ;
+			}
+			m_dftplan = fftw_plan_dft_1d(m_sample_count, m_input_complex, m_output_complex, FFTW_FORWARD, FFTW_ESTIMATE);
 
-		if(!m_input_data || !m_output_data) return;
+			count = 0;
+		}
+	}
+	void run(long sc){
+		float none[4096] = {0};
+		//printf("RUN %d!!!!\n", sc);
+		set_count(sc);
+		if(!m_input_data) return;
 		uint64_t start, stop;
 		start = get_time_ns();
+
+
 		for(unsigned int i=0; i<sc; i++){
 			m_input_complex[i][0] = m_input_data[i] ;
 		}
 		fftw_execute(m_dftplan);
-		for(unsigned int i=0; i<sc; i++){
-			m_output_data[i] =isnan(m_output_complex[i][0])?0.0:m_output_complex[i][0] ;
+		if(m_output_data){
+			for(unsigned int i=0; i<sc; i++){
+				//m_output_data[i] =isnan(m_output_complex[i][0])?0.0:m_output_complex[i][0] ;
+				m_output_data[i] = m_output_complex[i][0];
+			}
+			m_window.set_value(m_output_data, sc);
 		}
-		m_window.set_value(NULL, sc);
-		//m_fft->execute();
+
+
+
 		count+=1;
 		stop = get_time_ns();
-		//m_window.set_value(m_output_data, sc);
-		printf("----- %d %d %lf ms\n", count, sc, ((double)(stop-start))/1000000);
+		/*printf("----- %d %d %lf us\n",
+				count, sc, ((double)(stop-start))/1000000
+				);*/
 
 
 	}
@@ -187,7 +213,6 @@ static void activate_plugin(LADSPA_Handle Instance){
 }
 
 static void connect_plugin(LADSPA_Handle Instance, unsigned long SampleCount,  LADSPA_Data * data){
-	printf("connect_plugin\n");
 	return ((AudiToMidi*)Instance)->connect(SampleCount, data);
 }
 

+ 2 - 0
src/plugins/SDLWindow.cpp

@@ -48,6 +48,8 @@ void SDLWindow::set_value(float* value, int size, float ratio){
 	}
 	for(int j=0; j<m_w; j+=2){
 		int h = ((value[j]*ratio) + m_h/2);
+		if(h<0) h=0;
+		if(h>=m_h) h=m_h-1;
 		m_pixels[h*m_w+j] = 0xFFFFFF00;
 		m_pixels[h*m_w+j+1] = 0xFFFFFF00;
 	}

+ 12 - 4
src/plugins/TestPlugin.cpp

@@ -8,6 +8,7 @@
 #include "TestPlugin.h"
 #include <string>
 
+#define SAMPLE_WINDOW 4096
 int main(int argc, char** argv){
 	try {
 		TestPlugin plugins;
@@ -15,17 +16,24 @@ int main(int argc, char** argv){
 		//plugins.host.add_path("/usr/lib/ladspa");
 		plugins.host.update();
 		PluginEntry& plugin = plugins.host.load_from_path("/home/fanch/Programmation/audio_renderer/debug/src/plugins/libaudio_to_midi.so");
-		printf("Add plugin\n");
-		FileSoundInput fsi("/home/fanch/Programmation/LADSPA/audio_to_midi/snd/yafs1.wav");
+		//printf("Add plugin\n");
+		FileSoundInput fsi("/home/fanch/Programmation/LADSPA/audio_to_midi/snd/yafs1.wav", SAMPLE_WINDOW);
 
-		plugins.manager.set_rate(44100, 1024);
+		plugins.manager.set_rate(44100, SAMPLE_WINDOW);
 		plugins.manager.add_plugin(plugin);
 
 
-		LADSPA_Data* buffer;
+		LADSPA_Data* buffer = plugins.manager.get_input();
+		int count = 0;
 		while ((buffer = fsi.next(buffer))){
 			plugins.manager.run(buffer);
+			count ++;
+			if(count>1000){
+				break;
+			}
 		}
+		printf("fin\n");
+		delete[] buffer;
 
 	} catch (const char* x) {
 		printf("Erreur: %s\n", x);