#ifndef LV2PUI_H #define LV2PUI_H #include #include #include struct LV2PUi : PUi { pthread_t thread; bool exit; LV2UI_Write_Function write; LV2UI_Controller controller; LV2UI_Resize *resize; LV2UI_Touch *touch; virtual ~LV2PUi(); virtual void Instantiate( const LV2UI_Descriptor *descriptor, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features ); virtual void PortEvent(uint32_t port_index, uint32_t buffer_size, uint32_t format, const void *buffer); /* virtual */ void ParameterChanged(const Widget *w); /* virtual */ void WidgetGrabbed(const Widget *widget, bool grabbed); }; struct StringCompare { bool operator () (const char *a, const char *b) const { return strcmp(a, b) < 0; } }; struct LV2PUiFactoryBase { private: const char *uri; typedef std::map LV2PUis; static LV2PUis &GetLV2PUis() { static LV2PUis &s_lv2puis = *new LV2PUis(); return s_lv2puis; } protected: void RegisterLV2PUi(const char *uri) { if (!uri) return; this->uri = uri; //std::pair P = ; GetLV2PUis().insert(LV2PUis::value_type(uri, this)); } public: LV2PUiFactoryBase() : uri(NULL) {} virtual ~LV2PUiFactoryBase() { if (!this->uri) return; GetLV2PUis().erase(this->uri); if (GetLV2PUis().empty()) delete &GetLV2PUis(); } static LV2PUi *CreateInstance(const char *uri) { if (!uri) return NULL; if (GetLV2PUis().size() == 0) return NULL; LV2PUis::iterator it = GetLV2PUis().begin(); for (; it != GetLV2PUis().end(); ++it) { LV2PUiFactoryBase *b = (*it).second; if (!strcmp(uri, b->uri)) { return b->CreateInstance(); } } return NULL; } static const char *GetUri(uint32_t index) { if (GetLV2PUis().size() <= index) return NULL; LV2PUis::iterator it = GetLV2PUis().begin(); for (; it != GetLV2PUis().end(); ++it) { if (!index--) { LV2PUiFactoryBase *b = (*it).second; return b->uri; } } return NULL; } virtual LV2PUi *CreateInstance() = 0; }; template struct LV2PUiFactory : LV2PUiFactoryBase { LV2PUiFactory() { this->RegisterLV2PUi(((T *)this)->GetUri()); } const char *GetUri(); }; #endif /* LV2PUI_H */