Am Sat, 25 May 2013 08:59:58 +0200
schrieb Stéphane Letz <l...@grame.fr>:

[...]
> > Some obvious alternatives to the CFFI would be:
> > 
> > - Cython, which is, to my understanding, not dynamic enough for what I 
> > wanted,
> >  but which can be used to wrap C++ code, so would have the advantage of not
> >  requiring FAUST2.
> > 
> > - the FAUST2 LLVM backend + Unladen Swallow, which ties you to CPython, 
> > whereas
> >  the CFFI works (or at least will work) with various Python implementations.
> > 
> > - Ctypes, which is dynamic, like the CFFI, but supposedly not as nice to use
> >  and slower.
[...]
> 
> Have you ever thought about using the *dynamic* Faust technology in this 
> application? That is libfaust + LLVM?  
> 
> Stéphane

Hmmm, no, I hadn't, because 1.) I hadn't really heard of libfaust before outside
of the Makefile and stupidly assumed it was an internal library (perhaps a more
prominent mention should be made somewhere in the docs?), and 2.) I sort of
took my first idea for an implementation and ran with it, just to get something
working quickly.

Now that you mentioned it, I have looked into it more and it looks like it won't
change much, other than that I don't have to spawn a faust process anymore, i.e.

  dsp code -> faust2   -> C code -> CFFI -> Python object

becomes

  dsp code -> libfaust -> C code -> CFFI -> Python object

However, you also mentioned LLVM: do I understand correctly that you mean using
the LLVM backend as (I think) it is used in Pure? That is, generate LLVM
bitcode and link that to Unladen Swallow/CPython (however that exactly
happens)? I dismissed it since that ties you to CPython 3.3+, as I mentioned
in my original email. Plus I like having a pure python solution :) .

Anyway, after lots of fiddling with compiler/Makefile.unix [0] and learning
about the "-rpath" linker option I eventually got libfaust.so and my test
program compile without messing with my system's LDPATH and have now tried it
out in a local branch following the scheme above.

While I think that I prefer using libfaust to spawning a faust process (it
feels more elegant, and the FAUST class and the instantiation overhead shrunk a
bit), I noticed one important (strange) difference between the two: the order
of meta-data declarations (i.e., the line order in the header and the order of
->declare() calls) changes between calls to compile_faust(). This renders the
cffi's caching mechanism useless and leads to re-compiling on every
instantiation. Simple inline code strings still cache fine, as long as they
don't contain more than one meta-data declaration. Here's an example:

    $ diff -U4 test{1,2}.txt
    --- test1.txt       2013-05-25 20:02:38.152409591 +0200
    +++ test2.txt       2013-05-25 20:02:34.688500257 +0200
    @@ -34,12 +34,12 @@
        void* uiInterface;
    } UIGlue;
    
    //-----------------------------------------------------
    -// version: "0.1"
    // name: "Dattoro notch filter and resonator (Regalia)"
    // license: "MIT"
    // copyright: "(c)Marc Joliet 2013"
    +// version: "0.1"
    // author: "Marc Joliet"
    //
    // Code generated with Faust 2.0.a9 (http://faust.grame.fr)
    //-----------------------------------------------------
    @@ -84,14 +84,13 @@
        free(dsp);
    }
    
    void metadatamydsp(MetaGlue* m) { 
    -   m->declare(m->mInterface, "version", "0.1");
        m->declare(m->mInterface, "name", "Dattoro notch filter and resonator
    (Regalia)");
    -   m->declare(m->mInterface, "filter.lib/name", "Faust Filter
    Library");
    -   m->declare(m->mInterface, "filter.lib/license", "STK-4.3");
    -   m->declare(m->mInterface, "filter.lib/reference",
    "https://ccrma.stanford.edu/~jos/filters/";); m->declare(m->mInterface,
    "license", "MIT");
    +   m->declare(m->mInterface, "copyright", "(c)Marc Joliet 2013");
    +   m->declare(m->mInterface, "version", "0.1");
    +   m->declare(m->mInterface, "filter.lib/reference",
    "https://ccrma.stanford.edu/~jos/filters/";); m->declare(m->mInterface,
    "math.lib/name", "Math Library"); m->declare(m->mInterface,
    "math.lib/author", "GRAME"); m->declare(m->mInterface,
    "math.lib/copyright", "GRAME"); m->declare(m->mInterface,
    "math.lib/version", "1.0"); @@ -100,13 +99,14 @@
        m->declare(m->mInterface, "music.lib/author", "GRAME");
        m->declare(m->mInterface, "music.lib/copyright", "GRAME");
        m->declare(m->mInterface, "music.lib/version", "1.0");
        m->declare(m->mInterface, "music.lib/license", "LGPL with exception");
    -   m->declare(m->mInterface, "copyright", "(c)Marc Joliet 2013");
    -   m->declare(m->mInterface, "filter.lib/author", "Julius O. Smith
    (jos at ccrma.stanford.edu)");
    -   m->declare(m->mInterface, "filter.lib/copyright", "Julius O. Smith
    III"); m->declare(m->mInterface, "filter.lib/version", "1.29");
    +   m->declare(m->mInterface, "filter.lib/license", "STK-4.3");
        m->declare(m->mInterface, "author", "Marc Joliet");
    +   m->declare(m->mInterface, "filter.lib/name", "Faust Filter
    Library");
    +   m->declare(m->mInterface, "filter.lib/author", "Julius O. Smith
    (jos at ccrma.stanford.edu)");
    +   m->declare(m->mInterface, "filter.lib/copyright", "Julius O. Smith
    III"); }
    
    int getSampleRatemydsp(mydsp* dsp) { return dsp->fSamplingFreq; }

I don't understand why that happens when using libfaust but not faust, since
faust merely calls compile_faust_internal() :-/ .

[0] Gentoo's libtool is quite a bit newer than the one on Mac OS X and has
changed quite a bit, the libtool-1.3.5 package (the version I think OS X has)
only installs libltdl, and it appears the libtool developers *really*, *really*
want you to use automake, so I gave up and basically had the Makefile call "g++
-shared" instead.

-- 
Marc Joliet
--
"People who think they know everything really annoy those of us who know we
don't" - Bjarne Stroustrup

Attachment: signature.asc
Description: PGP signature

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to