pplugins/pui/lv2pui.h

117 lines
2.3 KiB
C++

#ifndef LV2PUI_H
#define LV2PUI_H
#include <lv2.h>
#include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
#include <map>
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<const char *, LV2PUiFactoryBase *, StringCompare> 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<LV2PUis::iterator, bool> 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 <class T>
struct LV2PUiFactory : LV2PUiFactoryBase {
LV2PUiFactory() { this->RegisterLV2PUi(((T *)this)->GetUri()); }
const char *GetUri();
};
#endif /* LV2PUI_H */