[gephex-devel] gephex--main--0.4--patch-1813

gephex at sonnenland.kexbox.org gephex at sonnenland.kexbox.org
Mon Nov 8 17:57:13 CET 2004


Archive: gephex at gephex.org--2004
New revision: gephex--main--0.4--patch-1813

--
Revision: gephex--main--0.4--patch-1813
Archive: gephex at gephex.org--2004
Creator: GePhex <gephex at gephex.org>
Date: Mon Nov  8 17:56:35 CET 2004
Standard-date: 2004-11-08 16:56:35 GMT
New-files: engine/src/dllloader/.arch-ids/frei0r.h.id
    engine/src/dllloader/.arch-ids/frei0r.xpm.id
    engine/src/dllloader/.arch-ids/frei0rwrapper.cpp.id
    engine/src/dllloader/.arch-ids/frei0rwrapper.h.id
    engine/src/dllloader/frei0r.h
    engine/src/dllloader/frei0r.xpm
    engine/src/dllloader/frei0rwrapper.cpp
    engine/src/dllloader/frei0rwrapper.h
Modified-files: configure.ac data/Makefile.am
    data/gephex.conf.default.in
    engine/src/dllloader/Makefile.am
    engine/src/dllloader/c_moduleclass.cpp
    engine/src/dllloader/c_moduleclass.h
    engine/src/dllloader/dllloader.cpp
    engine/src/dllloader/dllloader.h
    engine/src/engine/controller.cpp
    engine/src/engine/main.cpp
New-patches: georg at gephex.org--2004-home/gephex--georg--0.4--patch-348
    georg at gephex.org--2004-home/gephex--georg--0.4--patch-349
    georg at gephex.org--2004-home/gephex--georg--0.4--patch-350
    georg at gephex.org--2004-home/gephex--georg--0.4--patch-351
    georg at gephex.org--2004-piksel/gephex--frei0r--0.4--base-0
    georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-1
    georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-2
    georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-3
    georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-4
    gephex at gephex.org--2004/gephex--main--0.4--patch-1813
    martin at gephex.org--2004/gephex--frei0r--0.4--base-0
    martin at gephex.org--2004/gephex--frei0r--0.4--patch-1
Summary: add frei0r loader support
Keywords: 

Patches applied:

 * georg at gephex.org--2004-home/gephex--georg--0.4--patch-348
   Applied frei0r support patch

 * georg at gephex.org--2004-home/gephex--georg--0.4--patch-349
   Allow frei0r parameter names with spaces

 * georg at gephex.org--2004-home/gephex--georg--0.4--patch-350
   Add frei0r_path to gephex.conf.default and create frei0rs path on install

 * georg at gephex.org--2004-home/gephex--georg--0.4--patch-351
   newer frei0r.h version

 * georg at gephex.org--2004-piksel/gephex--frei0r--0.4--base-0
   tag of martin at gephex.org--2004/gephex--frei0r--0.4--patch-1

 * georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-1
   Fix some frei0r support stuff

 * georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-2
   Remove some frei0r debug output

 * georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-3
   added missing frei0r files to dist and improved frei0r loader

 * georg at gephex.org--2004-piksel/gephex--frei0r--0.4--patch-4
   Some frei0r fixes...

 * martin at gephex.org--2004/gephex--frei0r--0.4--base-0
   tag of gephex at gephex.org--2004/gephex--main--0.4--patch-1811

 * martin at gephex.org--2004/gephex--frei0r--0.4--patch-1
   initial version of frei0r plugins

* added directories

    {arch}/gephex/gephex--frei0r
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel/patch-log
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/martin at gephex.org--2004
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/martin at gephex.org--2004/patch-log

* added files

    engine/src/dllloader/.arch-ids/frei0r.h.id
    engine/src/dllloader/.arch-ids/frei0r.xpm.id
    engine/src/dllloader/.arch-ids/frei0rwrapper.cpp.id
    engine/src/dllloader/.arch-ids/frei0rwrapper.h.id
    engine/src/dllloader/frei0r.h
    engine/src/dllloader/frei0r.xpm
    engine/src/dllloader/frei0rwrapper.cpp
    engine/src/dllloader/frei0rwrapper.h
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel/patch-log/base-0
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel/patch-log/patch-1
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel/patch-log/patch-2
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel/patch-log/patch-3
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/georg at gephex.org--2004-piksel/patch-log/patch-4
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/martin at gephex.org--2004/patch-log/base-0
    {arch}/gephex/gephex--frei0r/gephex--frei0r--0.4/martin at gephex.org--2004/patch-log/patch-1
    {arch}/gephex/gephex--georg/gephex--georg--0.4/georg at gephex.org--2004-home/patch-log/patch-348
    {arch}/gephex/gephex--georg/gephex--georg--0.4/georg at gephex.org--2004-home/patch-log/patch-349
    {arch}/gephex/gephex--georg/gephex--georg--0.4/georg at gephex.org--2004-home/patch-log/patch-350
    {arch}/gephex/gephex--georg/gephex--georg--0.4/georg at gephex.org--2004-home/patch-log/patch-351
    {arch}/gephex/gephex--main/gephex--main--0.4/gephex at gephex.org--2004/patch-log/patch-1813

* modified files

--- orig/configure.ac
+++ mod/configure.ac
@@ -369,9 +369,10 @@
  cd contrib/ffmpeg/ && ${FFMPEG_CONFIG_DIR}/configure $FFMPEG_CONFIGURE_FLAGS && cd ../..
 fi
 
-# set gphx_module_lib_dir and gphx_type_lib_dir
+# set gphx_module_lib_dir, gphx_frei0r_lib_dir, and gphx_type_lib_dir
 test "x$prefix" = xNONE && prefix=$ac_default_prefix
 AC_SUBST(gphx_module_lib_dir, "${prefix}/lib/gephex-0.4/modules")
+AC_SUBST(gphx_frei0r_lib_dir, "${prefix}/lib/gephex-0.4/frei0rs")
 AC_SUBST(gphx_type_lib_dir, "${prefix}/lib/gephex-0.4/types")
 
 AC_CONFIG_FILES([Makefile


--- orig/data/Makefile.am
+++ mod/data/Makefile.am
@@ -8,6 +8,7 @@
 EXTRA_DIST = $(icon_DATA) run_in_terminal.sh gephex-wrapper.in gephex.conf.default.in gephexw.conf.default
 
 install-exec-hook:
+	if [ ! -e @gphx_frei0r_lib_dir@ ]; then mkdir @gphx_frei0r_lib_dir@; fi
 	chmod ug+x $(DESTDIR)$(bindir)/gephex-wrapper
 	rm -rf $(DESTDIR)$(bindir)/gephex-engine
 	rm -rf $(DESTDIR)$(bindir)/gephex-gui


--- orig/data/gephex.conf.default.in
+++ mod/data/gephex.conf.default.in
@@ -4,6 +4,7 @@
 
 engine {
     module_path          = [@gphx_module_lib_dir@/]
+    module_path          = [@gphx_frei0r_lib_dir@/]
     type_path            = [@gphx_type_lib_dir@/]
     graph_path           = [__CONF_DIR__/graphs/]
     ipc_unix_node_prefix = [/tmp/gephex_socket_]


--- orig/engine/src/dllloader/Makefile.am
+++ mod/engine/src/dllloader/Makefile.am
@@ -42,7 +42,11 @@
 	moduleclassspec.h \
 	moduleinfoutils.h \
 	nameresolver.h \
-	module.h
+	module.h \
+	frei0rwrapper.cpp \
+	frei0rwrapper.h \
+	frei0r.h \
+	frei0r.xpm
 
 
 


--- orig/engine/src/dllloader/c_moduleclass.cpp
+++ mod/engine/src/dllloader/c_moduleclass.cpp
@@ -41,19 +41,22 @@
 
 CModuleClass::CModuleClass(const CModuleFunctionTable& ftab_,
 			   const CModuleAttributes& attr_,
-			   const std::string& name)
+			   const std::string& name,
+			   frei0r_funs_t* frei0r)
   : functionTable(new CModuleFunctionTable(ftab_)), 
   attributes(new CModuleAttributes(attr_)), 
   defaultInputValues(attr_.inputs.size()),
-  m_name(name)
+    m_name(name), m_frei0r(0)
 {
+  if (frei0r)
+    m_frei0r = new frei0r_funs_t(*frei0r);
 }
 
 IModuleClass* CModuleClass::clone() const
 {
   CModuleClass* newClass = new CModuleClass(*this->functionTable,
-	  *this->attributes,
-	  this->m_name);
+					    *this->attributes,
+					    this->m_name, this->m_frei0r);
   newClass->defaultInputValues = defaultInputValues;
   return newClass;
 }
@@ -64,13 +67,25 @@
 {
   delete functionTable;
   delete attributes;
+
+  if (m_frei0r)
+    delete m_frei0r;
 }
 
 
 IModule* CModuleClass::buildInstance(const ITypeFactory& tFactory) const
 
 {
-  void* instance = functionTable->newInstance();
+  void* instance;
+  if (m_frei0r)
+    {
+      typedef void* (*harr_t)(void*, int);
+      harr_t harr = (harr_t) functionTable->newInstance;
+
+      instance = harr(m_frei0r, defaultInputValues.size());
+    }
+  else
+    instance = functionTable->newInstance();
   if (instance == 0)
     {
       throw std::runtime_error("Ungute Sache vorgefallen.");


--- orig/engine/src/dllloader/c_moduleclass.h
+++ mod/engine/src/dllloader/c_moduleclass.h
@@ -29,6 +29,8 @@
 
 #include "utils/autoptr.h"
 
+#include "frei0rwrapper.h"
+
 class CModuleFunctionTable;
 class CModuleAttributes;
 class IType;
@@ -43,7 +45,8 @@
 
 	CModuleClass(const CModuleFunctionTable&,
 		     const CModuleAttributes& attr_,
-			 const std::string& name);
+		     const std::string& name,
+		     frei0r_funs_t* frei0r);
 
 	virtual IModuleClass* clone() const;
 
@@ -58,6 +61,7 @@
 	typedef utils::AutoPtr<IType> ITypePtr;
 	mutable std::vector<ITypePtr> defaultInputValues;
 	std::string m_name;
+	frei0r_funs_t* m_frei0r;
 };
 
 #endif


--- orig/engine/src/dllloader/dllloader.cpp
+++ mod/engine/src/dllloader/dllloader.cpp
@@ -59,7 +59,7 @@
 #include "interfaces/itypeclassinforeceiver.h"
 #include "interfaces/itypeclassnamereceiver.h"
 
-
+#include "frei0rwrapper.h"
 
 namespace dllloader
 {
@@ -68,6 +68,32 @@
     void moduleLog(int level, const char* sender, const char* msg);
   };
 
+
+
+  void readFrei0rFuns(DllLoader::SharedLibraryPtr sl, frei0r_funs_t& f0r)
+  {
+    f0r.init            = (f0r_init_t) sl->loadSymbol("f0r_init");
+    f0r.deinit          = (f0r_deinit_t) sl->loadSymbol("f0r_deinit");
+    f0r.get_plugin_info = (f0r_get_plugin_info_t) 
+      sl->loadSymbol("f0r_get_plugin_info");
+    f0r.get_param_info  = (f0r_get_param_info_t)
+      sl->loadSymbol("f0r_get_param_info");
+    f0r.construct       = (f0r_construct_t) sl->loadSymbol("f0r_construct");
+    f0r.destruct        = (f0r_destruct_t) sl->loadSymbol("f0r_destruct");
+    f0r.set_param_value = (f0r_set_param_value_t) sl->loadSymbol("f0r_set_param_value");
+    f0r.get_param_value = (f0r_get_param_value_t)
+      sl->loadSymbol("f0r_get_param_value");
+    f0r.update          = (f0r_update_t) sl->loadSymbol("f0r_update");
+	  
+    if (f0r.init == 0 || f0r.deinit == 0 || f0r.get_plugin_info == 0 ||
+	f0r.get_param_info == 0 || f0r.construct == 0 || f0r.destruct == 0 ||
+	f0r.set_param_value == 0 || f0r.get_param_value == 0 ||
+	f0r.update == 0)
+      {
+	throw std::runtime_error("Funkti0rs are missing!");
+      }
+  }
+
   //TODO: ugly
   static utils::AutoPtr<utils::ILogger> s_logger(0);
 
@@ -112,10 +138,12 @@
 
   namespace
   {
-    void postLoadModule(CModuleFunctionTable& ft)
+    void postLoadModule(CModuleFunctionTable& ft, bool is_frei0r)
     {
-      if (ft.newInstance == 0 || ft.deleteInstance == 0
-	  || ft.update == 0 || ft.getSpec == 0 || ft.getInfo == 0) //TODO
+      if (ft.newInstance == 0 || ft.deleteInstance == 0 ||
+	  ft.update == 0 ||
+	  (!is_frei0r && ft.getSpec == 0) ||
+	  (!is_frei0r && ft.getInfo == 0)) //TODO
 	throw std::runtime_error("Benoetigte Funktion fehlt");
 		
       if (ft.init == 0)
@@ -173,7 +201,8 @@
   }
 
   void DllLoader::readDlls(const std::vector<std::string>& modules,
-			   const std::vector<std::string>& types)
+			   const std::vector<std::string>& types,
+			   const std::vector<std::string>& frei0rs)
   {
     for (std::vector<std::string>::const_iterator it = types.begin();
 	 it != types.end(); ++it)
@@ -203,6 +232,19 @@
 	    std::cerr << e.what() << std::endl;
 	  }
       }		
+
+    for (std::vector<std::string>::const_iterator it = frei0rs.begin();
+	 it != frei0rs.end(); ++it)
+      {	
+	try 
+	  {
+	    processFrei0rFile(*it);
+	  }
+	catch (std::runtime_error& e)
+	  {
+	    std::cerr << e.what() << std::endl;
+	  }
+      }		
   }
 	
   //TODO: Fehlerbehandlung!
@@ -246,14 +288,32 @@
 	
     try
       {
-	postLoadModule(fTable);			
-	this->constructModuleClass(&fTable, sl, moduleName);
+	postLoadModule(fTable, false);
+	this->constructModuleClass(&fTable, sl, moduleName, 0);
       }
     catch (std::runtime_error& e)
       {	
 		m_logger->error("DllLoader::loadModule", e.what());
       }
   }
+
+  void DllLoader::loadFrei0r(frei0r_funs_t& f0r, SharedLibraryPtr sl,
+			     const std::string moduleName)
+  {
+    CModuleFunctionTable fTable;
+
+    create_f0r_wrapper(fTable);
+	
+    try
+      {
+	postLoadModule(fTable, true);
+	this->constructModuleClass(&fTable, sl, moduleName, &f0r);
+      }
+    catch (std::runtime_error& e)
+      {	
+	m_logger->error("DllLoader::loadModule", e.what());
+      }
+  }
 	
   void DllLoader::loadModuleClass(const std::string& moduleName)
   {		
@@ -264,7 +324,20 @@
 
 		if (it == m_mod2fileName.end())
 		{
-			throw std::runtime_error("ModulClass gibts halt nicht");
+		  it = m_f0r2fileName.find(moduleName);
+
+		  if (it == m_f0r2fileName.end())
+		    throw std::runtime_error("ModuleClass gibts halt nicht");
+
+		  std::string filename = it->second;
+
+		  frei0r_funs_t f0r;
+		  SharedLibraryPtr sl = this->loadDll(filename);
+
+		  readFrei0rFuns(sl, f0r);
+
+		  loadFrei0r(f0r, sl, moduleName);
+		  return;
 		}
 		
 		std::string filename = it->second;
@@ -335,6 +408,13 @@
       }
 
 
+    for (std::map<std::string,std::string>::const_iterator nameIt 
+	   = m_f0r2fileName.begin();
+	 nameIt != m_f0r2fileName.end(); ++nameIt)
+      {
+     	m_nameReceiver->moduleClassNameExists(nameIt->first);       
+      }
+
     for (std::map<std::string,utils::AutoPtr<utils::Buffer> >::const_iterator
 	   modIt = m_moduleInfos.begin();
 	 modIt != m_moduleInfos.end(); ++modIt)
@@ -437,20 +517,53 @@
 	
   void DllLoader::constructModuleClass(CModuleFunctionTable* fTable,
 				       SharedLibraryPtr sl,
-                                       const std::string& moduleName) 
+                                       const std::string& moduleName,
+				       frei0r_funs_t* frei0r)
   {
-    if (fTable->init != 0)
+    if (frei0r)
       {
-        if (fTable->init(moduleLog) == 0)
+	if (frei0r->init() == 0)
 	  {
-	    throw std::runtime_error("init of plugin " + moduleName
-                                     + " failed");
-          }
+	    throw std::runtime_error("init0r of plugin " + moduleName
+				     + " failed");
+	  }
       }
-		
-    std::string moduleSpec = fTable->getSpec();
-    utils::StructReader spec(moduleSpec);
+    else
+      {
+	if (fTable->init != 0)
+	  {
+	    if (fTable->init(moduleLog) == 0)
+	      {
+		throw std::runtime_error("init of plugin " + moduleName
+					 + " failed");
+	      }
+	  }
+      }
+
     int numInputs;
+    int numOutputs ;
+    std::string moduleSpec;
+    bool isDeterministic;
+    f0r_plugin_info_t f0r_info;
+    if (frei0r)
+      {
+	frei0r->get_plugin_info(&f0r_info);
+
+	// +1 for input frame, +1 for time
+	numInputs = 1 + f0r_info.num_params + 1;
+	numOutputs = 1;
+	isDeterministic = false;
+
+
+	moduleSpec = frei0r_create_spec(f0r_info);
+      }
+    else
+      {
+	moduleSpec = fTable->getSpec();
+      }
+
+    utils::StructReader spec(moduleSpec);
+
     try {
       numInputs = spec.getIntValue("number_of_inputs");
     }
@@ -458,9 +571,6 @@
       {
 	throw std::runtime_error("number_of_inputs nicht angegeben");
       }
-		
-		
-    int numOutputs ;
     try
       {
 	numOutputs = spec.getIntValue("number_of_outputs");
@@ -469,23 +579,51 @@
       {
 	throw std::runtime_error("number_of_outputs nicht angegeben");
       }
-		
-    bool isDeterministic = spec.getBoolValue("deterministic", false);
+    
+    isDeterministic = spec.getBoolValue("deterministic", false);
+
+  std::vector<int> inputs(numInputs);
+  std::vector<utils::Buffer> 
+  defaultVals(numInputs,
+	      utils::Buffer(reinterpret_cast<const unsigned char*>(""),1));
+  std::vector<std::string> inputNames(numInputs);
+  std::vector<std::string> inputIDs(numInputs);
+		
+  std::vector<bool> isConst(numInputs);
+  std::vector<bool> isStrong(numInputs);
+  std::vector<const TypeAttributes*> fixedAttributes(numInputs);
+
+  std::vector<std::string> f0r_param_names;
+
+  for (int i = 0; i < numInputs; ++i)
+      {
+	std::string inSpec;
+	if (frei0r)
+	  {
+	    std::cout << "i = " << i << "
";
+	    if (i == 0)
+	      {
+		inSpec = frei0r_create_in_spec();
+	      }
+	    else if (i == numInputs-1)
+	      {
+		inSpec = frei0r_create_time_spec();
+	      }
+	    else
+	      {
+		f0r_param_info_t pinfo;
+		frei0r->get_param_info(&pinfo, i-1);
+		inSpec = frei0r_create_in_param_spec(pinfo);
+		std::cout << "param # " << i-1 << " name '" 
+			  << pinfo.name << "'
";
+		f0r_param_names.push_back(pinfo.name);
+	      }
+	  }
+	else
+	  {
+	    inSpec = fTable->getInputSpec(i);
+	  }
 
-    std::vector<int> inputs(numInputs);
-    std::vector<utils::Buffer> 
-      defaultVals(numInputs,
-		  utils::Buffer(reinterpret_cast<const unsigned char*>(""),1));
-    std::vector<std::string> inputNames(numInputs);
-    std::vector<std::string> inputIDs(numInputs);
-		
-    std::vector<bool> isConst(numInputs);
-    std::vector<bool> isStrong(numInputs);
-    std::vector<const TypeAttributes*> fixedAttributes(numInputs);
-		
-    for (int i = 0; i < numInputs; ++i)
-      {
-	std::string inSpec = fTable->getInputSpec(i);
 	utils::StructReader inputSpec(inSpec);
 	
 	try {
@@ -513,61 +651,69 @@
 	  }
 
 #if (ENGINE_VERBOSITY > 2)
-	std::cout << "inputNames[" << i << "] = \"" 
-		  << inputNames[i] << '"' << std::endl;
+    std::cout << "inputNames[" << i << "] = \"" 
+	      << inputNames[i] << '"' << std::endl;
 #endif
+	
+    try 
+      {
+	inputs[i] = resolver->getObjectID(inputNames[i]);
+      }
+    catch(std::runtime_error& e)
+      {
+	std::string msg = "Unbekannter Typ: \"";
+	msg += inputNames[i];
+	msg += '"';
+	msg += " beim Laden von ";
+	msg += spec.getStringValue("name");
+	throw std::runtime_error(msg.c_str());
+      }
 			
-	try 
-	  {
-	    inputs[i] = resolver->getObjectID(inputNames[i]);
-	  }
-	catch(std::runtime_error& e)
-	  {
-	    std::string msg = "Unbekannter Typ: \"";
-	    msg += inputNames[i];
-	    msg += '"';
-	    msg += " beim Laden von ";
-	    msg += spec.getStringValue("name");
-	    throw std::runtime_error(msg.c_str());
-	  }
-			
-			
-	try 
-	  {
-	    isConst[i] = (inputSpec.getBoolValue("const"));
-	  }
-	catch (...)
-	  {
-	    throw std::runtime_error("const nicht angegeben");
-	  }
+    
+    try 
+      {
+	isConst[i] = (inputSpec.getBoolValue("const"));
+      }
+    catch (...)
+      {
+	throw std::runtime_error("const nicht angegeben");
+      }
 			
-	try 
-	  {
-	    isStrong[i] = (inputSpec.getBoolValue("strong_dependency"));
-	  }
-	catch (...)
-	  {
-	    throw std::runtime_error("strong_dependency nicht angegeben");
-	  }
-
-	try
-	  {
-	    fixedAttributes[i] 
-	      = static_cast<TypeAttributes*>(fTable->getInputAttributes(i));
-	  }
-	catch (...)
-	  {
-	    throw std::runtime_error("darf net sein");
-	  }
+    try 
+      {
+	isStrong[i] = (inputSpec.getBoolValue("strong_dependency"));
+      }
+    catch (...)
+      {
+	throw std::runtime_error("strong_dependency nicht angegeben");
+      }
 
+    try
+      {
+	fixedAttributes[i] 
+	  = static_cast<TypeAttributes*>(fTable->getInputAttributes(i));
+      }
+    catch (...)
+      {
+	throw std::runtime_error("darf net sein");
+      }
       }
+ 
 		
     std::vector<int> outputs(numOutputs);
     std::vector<std::string> outputNames(numOutputs);
     std::vector<std::string> outputIDs(numOutputs);
     for (int j = 0; j < numOutputs; ++j)
       {
-	std::string outSpec = fTable->getOutputSpec(j);
+	std::string outSpec;
+	if (frei0r)
+	  {
+	    outSpec = frei0r_create_out_spec();
+	  }
+	else
+	  {
+	    outSpec = fTable->getOutputSpec(j);
+	  }
 	utils::StructReader outputSpec(outSpec);			
 			
 	try {
@@ -594,7 +740,7 @@
 	    throw std::runtime_error(msg.c_str());
 	  }
       }
-		
+      		
     CModuleAttributes attributes;
     attributes.inputs = inputs;
     attributes.outputs = outputs;
@@ -616,14 +762,27 @@
     std::cout << "Registriere Modul " << name << std::endl;
 #endif
 
-    int bufLen = fTable->getInfo(0,0);
-    char* data = new char[bufLen];
-    int len = fTable->getInfo(data,bufLen);
+    char* data = 0;
+    int bufLen = 0;
+    if (frei0r)
+      {
+	std::vector<char> buf = frei0r_create_info(f0r_info,
+						   f0r_param_names);
+	data = new char[buf.size()];
+	memcpy(data, &buf[0], buf.size());
+	bufLen = buf.size();
+      }
+    else
+      {
+	bufLen = fTable->getInfo(0,0);
+	data = new char[bufLen];
+	int len = fTable->getInfo(data,bufLen);
 	if (len == 0) {
-		//TODO: is it ok to throw here (probably some leaks)?		
-		delete[] data;
-		throw std::runtime_error("getInfo failed!");
+	  //TODO: is it ok to throw here (probably some leaks)?		
+	  delete[] data;
+	  throw std::runtime_error("getInfo failed!");
 	}
+      }
     try 
       {
 	utils::Buffer mi = 
@@ -638,7 +797,7 @@
 	m_infoReceiver->moduleClassLoaded(name,mi);
 
 	m_classReceiver->moduleClassLoaded(name,
-					   CModuleClass(*fTable,attributes,name));
+					   CModuleClass(*fTable,attributes,name, frei0r));
 
 	m_specReceiver->moduleClassLoaded(name,ModuleClassSpec(name,inputs,
 							       defaultVals,
@@ -655,7 +814,7 @@
 
     delete[] data;
     
-  }
+      }
   
 
   DllLoader::SharedLibraryPtr DllLoader::loadDll(const std::string& filename)
@@ -723,6 +882,39 @@
     m_nameReceiver->moduleClassNameExists(name);
   }
 
+
+
+  void DllLoader::processFrei0rFile(const std::string& fname)
+  {
+    frei0r_funs_t f0r;
+    SharedLibraryPtr sl = loadDll(fname);
+    readFrei0rFuns(sl, f0r);
+
+    if (!f0r.init())
+      throw std::runtime_error("init0r failed");
+
+    f0r_plugin_info_t inf0r;
+    f0r.get_plugin_info(&inf0r);
+    std::string name = std::string("mod_") + inf0r.name;
+
+    std::cout << "Nam0r = " << name << "
";
+
+    f0r.deinit();
+
+    std::map<std::string,std::string>::const_iterator 
+      it = m_f0r2fileName.find(name);
+
+    if (it != m_f0r2fileName.end())
+      {
+	throw std::runtime_error("Nam0r '" + name 
+				 + "'doppelt bei processFrei0rFile");
+      }
+
+    m_f0r2fileName[name] = fname;
+
+    m_nameReceiver->moduleClassNameExists(name);
+  }
+
   void DllLoader::processTypFile(const std::string& fname)
   {
     std::string name = getDllName(fname);


--- orig/engine/src/dllloader/dllloader.h
+++ mod/engine/src/dllloader/dllloader.h
@@ -41,6 +41,8 @@
 
 #include "utils/autoptr.h"
 
+struct frei0r_funs_t;
+
 namespace utils 
 {
   class Buffer;
@@ -72,6 +74,9 @@
     {
 
     public:
+      typedef utils::AutoPtr<utils::SharedLibrary> SharedLibraryPtr;
+
+
       /**
        * Erzeugt neuen DllLoader.
        * @param logger used for reporting errors
@@ -85,9 +90,12 @@
        * Davor sollte der ModuleClassNameReceiver registriert sein !!
        */
       void readDlls(const std::vector<std::string>& modules,
-		    const std::vector<std::string>& types);
+		    const std::vector<std::string>& types,
+		    const std::vector<std::string>& frei0rs);
 
       virtual void loadModuleClass(const std::string& name);
+      virtual void loadFrei0r(frei0r_funs_t&, SharedLibraryPtr sl,
+			      const std::string moduleName);
       virtual void unloadModuleClass(const std::string& name);
 
       //TODO: war mal const
@@ -111,8 +119,6 @@
       virtual void registerTypeClassNameReceiver(ITypeClassNameReceiver&);
 
     private:
-      typedef utils::AutoPtr<utils::SharedLibrary> SharedLibraryPtr;
-
       SharedLibraryPtr loadDll(const std::string& filename);
       std::string getDllName(const std::string& filename);
 
@@ -120,11 +126,13 @@
                       const std::string& moduleName);
 
       void processModFile(const std::string&);
+      void processFrei0rFile(const std::string&);
       void processTypFile(const std::string&);
 	
       void constructModuleClass(CModuleFunctionTable* fTable,
 				SharedLibraryPtr sl,
-                                const std::string& moduleName);
+                                const std::string& moduleName,
+				frei0r_funs_t*);
 
       NameResolver* resolver;
 
@@ -139,6 +147,8 @@
 
       std::map<std::string,std::string> m_mod2fileName;
       std::map<std::string,std::string> m_typ2fileName;
+      std::map<std::string,std::string> m_f0r2fileName;
+
       std::map<std::string,SharedLibraryPtr> m_moduleHandles;
       std::map<std::string,utils::AutoPtr<utils::Buffer> > m_moduleInfos;
 


--- orig/engine/src/engine/controller.cpp
+++ mod/engine/src/engine/controller.cpp
@@ -316,10 +316,16 @@
     std::string type_path = config.get_string_param("type_path");
     std::vector<std::string> types = getFilesInDir(type_path,
                                                    TYPE_ENDING);
-	
+
+
+    std::string frei0r_path = config.get_string_param("frei0r_path");
+    std::vector<std::string> frei0rs = getFilesInDir(frei0r_path,
+						     MODULE_ENDING);
+
+    
     std::cout << "Reading plugins...";
     std::cout.flush();
-    pDllLoader.readDlls(modules, types);
+    pDllLoader.readDlls(modules, types, frei0rs);
     std::cout << "   done
";
 
     if (config.get_bool_param("headless"))


--- orig/engine/src/engine/main.cpp
+++ mod/engine/src/engine/main.cpp
@@ -203,6 +203,12 @@
                                    "Directory that contains gephex modules",
                                       0));
 
+      params.push_back(config_param_t("frei0r_path",
+				      config_param_t::STRING_PARAM,
+				      "engine",
+				      "Directory that contains frei0r effects",
+                                      0));
+
       params.push_back(config_param_t("type_path",
                                    config_param_t::STRING_PARAM,
                                    "engine",



More information about the gephex-devel mailing list