Re: [LAD] suil error: Unable to open UI library

From: Phil CM <philcm@email-addr-hidden>
Date: Wed Oct 15 2014 - 23:26:44 EEST

On 15/10/14 20:17, Paul Davis wrote:
>
>
> On Wed, Oct 15, 2014 at 2:24 PM, Phil CM <philcm@email-addr-hidden
> <mailto:philcm@email-addr-hidden>> wrote:
>
> Hello LADs
>
> I'm trying to make a GUI for a LV2 synth based on so-404. In fact,
> I'm trying to learn C / C++.
>
> I got everything to build OK, but I'm stuck on a hard to read
> execution error ; when I load the plugin in jalv, it loads it OK,
> but fails to load the UI and says :
>
> suil error: Unable to open UI library
> /usr/local/lib/lv2/kis.lv2/kis_gui.so
> (/usr/local/lib/lv2/kis.lv2/kis_gui.so: undefined symbol:
> _Z17instantiateSO_404PK15_LV2_DescriptordPKcPKPK12_LV2_Feature)
>
>
>
> % echo _Z17instantiateSO_404PK15_LV2_DescriptordPKcPKPK12_LV2_Feature
> | c++filt
> instantiateSO_404(_LV2_Descriptor const*, double, char const*,
> _LV2_Feature const* const*)
> %
>
> your plugin is missing a symbol (instantiateSO_404(...)), apparently.
The problem seems to be different implementations of instantiate().

In Harry's example
<https://github.com/harryhaaren/lv2/tree/master/plugins/eg-sinsynth.lv2>, the
methods that (AFAIU) LV2 expects :

  * instantiate()
  * connect_port()
  * activate()
  * run()
  * deactivate()
  * cleanup()
  * extension_data()

Are declared explicitely, using static.

Like this :

static LV2_Handle
instantiate(const LV2_Descriptor* descriptor,
             double rate,
             const char* bundle_path,
             const LV2_Feature* const* features)
{
   SinSynth* self = (SinSynth*)malloc(sizeof(SinSynth));

   // store the sample rate in "self" so we can retrieve it in run()
   self->sample_rate = rate;

   // initialize the phase so we start at the beginning of the wave
   self->phase = 0.f;

   return self;
}

void
connect_port(LV2_Handle instance,
              uint32_t port,
              void* data)
{
   SinSynth* self=(SinSynth*)instance;

   switch (port) {
   case AMP_FREQ:
     self->freq = (float*)data;
     break;
   case AMP_MIDI:
     self->MidiIn = data;
     break;
   case AMP_OUTPUT:
     self->output = (float*)data;
     break;
   }
}

static void
activate(LV2_Handle instance)
{
}

(...)

Whereas in so-404, they are somehow "surcharged", like this :

void runSO_404( LV2_Handle arg, uint32_t nframes );
LV2_Handle instantiateSO_404(const LV2_Descriptor *descriptor,double
s_rate, const char *path,const LV2_Feature * const* features);
void cleanupSO_404(LV2_Handle instance);
void connectPortSO_404(LV2_Handle instance, uint32_t port, void
*data_location);

static LV2_Descriptor kis_Descriptor= {
     .URI="https://bitbucket.org/xaccrocheur/kis",
     .instantiate=instantiateSO_404,
     .connect_port=connectPortSO_404,
     .activate=NULL,
     .run=runSO_404,
     .deactivate=NULL,
     .cleanup=cleanupSO_404,
     .extension_data=NULL,
};

So apparently instead of being declared thusly:

LV2_Handle
instantiateSO_404(const LV2_Descriptor* descriptor,
                   double s_rate,
                   const char *path,
                   const LV2_Feature * const* features)
{...}

Either my instantiate method return value should be static, or my
"mandatory" methods should be declared explicitely. I tried to adapt
them, but failed so far.
Please excuse my sub-newbie mistakes.

--Phil

>
>
>
> _______________________________________________
> Linux-audio-dev mailing list
> Linux-audio-dev@email-addr-hidden
> http://lists.linuxaudio.org/listinfo/linux-audio-dev

_______________________________________________
Linux-audio-dev mailing list
Linux-audio-dev@email-addr-hidden
http://lists.linuxaudio.org/listinfo/linux-audio-dev
Received on Thu Oct 16 00:15:03 2014

This archive was generated by hypermail 2.1.8 : Thu Oct 16 2014 - 00:15:03 EEST