[LV2] inline plugin displays

Robin Gareus robin at gareus.org
Mon Mar 14 19:47:28 PDT 2016


Hi all,

Here's another small ad-hoc LV2 extension. I've just prototyped adding
inline mixer-strip displays. A picture says more than words here:

  http://robin.linuxaudio.org/tmp/inline_display.png

small LV2 UIs; display only (non interactive) pixmaps.

The API consists of two calls:

1) A LV2 extension provided by the plugin to render a pixmap.

This is function is provided by the plugin's shared-object itself (not
the GUI) because it must also be available when the plugin GUI is not
visible (not even loaded). It's intended for visualizing the most
relevant plugin parameters in a tiny area (~100x100px).


/** raw image pixmap format is ARGB32,
 * the data pointer is owned by the plugin and must be valid
 * from the first call to render until cleanup.
 */
typedef struct {
  unsigned char *data;
  int width;
  int height;
  int stride;
} LV2_Inline_Display_Image_Surface;

/**
 * Plugin Inline-Display Interface.
 */
typedef struct {
  /**
   * The render method. This is called by the host in a non-realtime
   * context, usually the main GUI thread.
   * The data pointer is owned by the plugin and must be valid
   * from the first call to render until cleanup.
   *
   * @param instance The LV2 instance
   * @param w the max available width
   * @param h the max available height
   * @return pointer to a LV2_Inline_Display_Image_Surface or NULL
   */
  LV2_Inline_Display_Image_Surface* (*render)
                     (LV2_Handle instance, uint32_t w, uint32_t h);
} LV2_Inline_Display_Interface;



2) A LV2 feature provided by the host. This allows a plugin to tell the
host that the image needs to be updated. It is intended to be called by
the plugin in rt-context - during run(), when the ports are valid.


/** a LV2 Feature provided by the Host to the plugin */
typedef struct {

  /** Opaque host data */
  LV2_Inline_Display_Handle handle;

  /** Request from run() that the host should call render()
   * at a later time to update the inline display.
   */
  void (*queue_draw)(LV2_Inline_Display_Handle handle);
} LV2_Inline_Display;



So far I've implemented this as proof of concept in Ardour, fil4.lv2 and
meters.lv2 (all git/master).

thoughts, comments are welcome,
robin


More information about the Devel mailing list