117 lines
2.3 KiB
C++
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 */
|