#ifndef QMPCOREPUBLIC_HPP #define QMPCOREPUBLIC_HPP #include #include #include #include #ifdef _WIN32 #define EXPORTSYM __declspec(dllexport) #else #define EXPORTSYM __attribute__ ((visibility ("default"))) #endif #define QMP_PLUGIN_API_REV "1+indev8" //MIDI Event structure struct SEvent { uint32_t iid,time; uint8_t type,p1,p2; uint8_t flags; std::string str; SEvent(){time=iid=0;type=p1=p2=0;flags=0;str="";} SEvent(uint32_t _iid,uint32_t _t,uint8_t _tp,uint8_t _p1,uint8_t _p2,const char* s=nullptr) { iid=_iid;time=_t;type=_tp; p1=_p1;p2=_p2;flags=0; if(s)str=std::string(s);else str=""; } SEvent(uint32_t _iid,uint32_t _t,uint8_t _tp,uint8_t _p1,uint8_t _p2,std::string s): iid(_iid),time(_t),type(_tp),p1(_p1),p2(_p2),str(s){} friend bool operator <(const SEvent& a,const SEvent& b){return a.time-b.time?a.time eventList; void appendEvent(SEvent e){eventList.push_back(e);} SEvent& operator[](size_t sub){return eventList[sub];} }; //MIDI File class class CMidiFile{ public: bool valid; char *title,*copyright; std::vector tracks; uint32_t std,divs; ~CMidiFile() { if(title)delete[] title; if(copyright)delete[] copyright; } }; //Generic callback function that can be used for hooking the core. //"userdata" is set when you register the callback function. //Deprecated. Removing in 0.9.x. class ICallBack { public: ICallBack(){} virtual void callBack(const void* callerdata,void* userdata)=0; virtual ~ICallBack(){} }; //alternative callback function type typedef std::function callback_t; //MIDI file reader interface. Use this to implement your file importer. class qmpFileReader { public: qmpFileReader(){} virtual ~qmpFileReader(){} virtual CMidiFile* readFile(const char* fn)=0; virtual void discardCurrentEvent()=0; virtual void commitEventChange(SEvent d)=0; }; //Functionality interface. class qmpFuncBaseIntf { public: qmpFuncBaseIntf(){} virtual void show()=0; virtual void close()=0; virtual ~qmpFuncBaseIntf(){} }; //Midi mapper plugin interface. class qmpMidiOutDevice { public: qmpMidiOutDevice(){} virtual void deviceInit()=0; virtual void deviceDeinit()=0; virtual void basicMessage(uint8_t type,uint8_t p1,uint8_t p2)=0; virtual void extendedMessage(uint8_t length,const char* data)=0; virtual void rpnMessage(uint8_t ch,uint16_t type,uint16_t val)=0; virtual void nrpnMessage(uint8_t ch,uint16_t type,uint16_t val)=0; virtual void panic(uint8_t ch)=0; virtual void reset(uint8_t ch)=0; virtual void onMapped(uint8_t ch,int refcnt)=0; virtual void onUnmapped(uint8_t ch,int refcnt)=0; virtual std::vector> getBankList()=0; virtual std::vector> getPresets(uint16_t bank)=0; virtual std::string getPresetName(uint16_t bank,uint8_t preset)=0; virtual bool getChannelPreset(int ch,uint16_t *bank,uint8_t *preset,std::string &presetname)=0; virtual uint8_t getInitialCCValue(uint8_t cc)=0; virtual ~qmpMidiOutDevice(){} }; //Main plugin interface. class qmpPluginIntf { public: qmpPluginIntf(){} virtual ~qmpPluginIntf(){} virtual void init(){} virtual void deinit(){} virtual const char* pluginGetName(){return "";} virtual const char* pluginGetVersion(){return "";} }; #ifdef QMP_MAIN extern "C"{ #endif //The API class provided by the core. Plugins use this class to interact with //the core. class qmpPluginAPI { public: virtual ~qmpPluginAPI(); virtual uint32_t getDivision(); virtual uint32_t getRawTempo(); virtual double getRealTempo(); virtual uint32_t getTimeSig(); virtual int getKeySig(); virtual uint32_t getNoteCount(); virtual uint32_t getMaxTick(); virtual uint32_t getCurrentPolyphone(); virtual uint32_t getMaxPolyphone(); virtual uint32_t getCurrentTimeStamp(); virtual uint32_t getCurrentPlaybackPercentage(); virtual int getChannelCC(int ch,int cc); virtual int getChannelPreset(int ch); virtual void playerSeek(uint32_t percentage); virtual double getPitchBend(int ch); virtual bool getChannelMask(int ch); virtual std::string getTitle(); virtual std::wstring getWTitle(); virtual std::string getChannelPresetString(int ch); virtual bool isDarkTheme(); virtual void* getMainWindow(); //WARNING!!: This function should be called from event reader callbacks only and //it is somehow dangerous -- other plugins might be unaware of the removal of the //event. The design might be modified afterward. virtual void discardCurrentEvent(); //WARNING!!: This function should be called from event reader callbacks only and //it is somehow dangerous -- other plugins might be unaware of the event change. //The design might be modified afterward. virtual void commitEventChange(SEvent d); //This function should be called from a file reader when it has read a new event virtual void callEventReaderCB(SEvent d); virtual void setFuncState(std::string name,bool state); virtual void setFuncEnabled(std::string name,bool enable); virtual void registerFunctionality(qmpFuncBaseIntf* i,std::string name,std::string desc,const char* icon,int iconlen,bool checkable); virtual void unregisterFunctionality(std::string name); virtual int registerUIHook(std::string e,ICallBack* cb,void* userdat); virtual int registerUIHook(std::string e,callback_t cb,void* userdat); virtual void unregisterUIHook(std::string e,int hook); virtual void registerMidiOutDevice(qmpMidiOutDevice* dev,std::string name); virtual void unregisterMidiOutDevice(std::string name); virtual int registerEventReaderIntf(ICallBack* cb,void* userdata); virtual void unregisterEventReaderIntf(int intfhandle); virtual int registerEventHandlerIntf(ICallBack* cb,void* userdata); virtual void unregisterEventHandlerIntf(int intfhandle); virtual int registerFileReadFinishedHandlerIntf(ICallBack* cb,void* userdata); virtual void unregisterFileReadFinishedHandlerIntf(int intfhandle); virtual int registerEventHandler(callback_t cb,void *userdata); virtual void unregisterEventHandler(int id); virtual int registerEventReadHandler(callback_t cb,void *userdata); virtual void unregisterEventReadHandler(int id); virtual int registerFileReadFinishHook(callback_t cb,void *userdata); virtual void unregisterFileReadFinishHook(int id); virtual void registerFileReader(qmpFileReader* reader,std::string name); virtual void unregisterFileReader(std::string name); //if desc=="", the option won't be visible in the settings form. //it will only show up in the configuration file. virtual void registerOptionInt(std::string tab,std::string desc,std::string key,int min,int max,int defaultval); virtual int getOptionInt(std::string key); virtual void setOptionInt(std::string key,int val); virtual void registerOptionUint(std::string tab,std::string desc,std::string key,unsigned min,unsigned max,unsigned defaultval); virtual unsigned getOptionUint(std::string key); virtual void setOptionUint(std::string key,unsigned val); virtual void registerOptionBool(std::string tab,std::string desc,std::string key,bool defaultval); virtual bool getOptionBool(std::string key); virtual void setOptionBool(std::string key,bool val); virtual void registerOptionDouble(std::string tab,std::string desc,std::string key,double min,double max,double defaultval); virtual double getOptionDouble(std::string key); virtual void setOptionDouble(std::string key,double val); virtual void registerOptionString(std::string tab,std::string desc,std::string key,std::string defaultval,bool ispath=false); virtual std::string getOptionString(std::string key); virtual void setOptionString(std::string key,std::string val); virtual void registerOptionEnumInt(std::string tab,std::string desc,std::string key,std::vector options,int defaultval); virtual int getOptionEnumInt(std::string key); virtual void setOptionEnumInt(std::string key,int val); }; #ifdef QMP_MAIN } #endif //The entry type for the plugin. Your plugin should implement //qmpPluginIntf* qmpPluginGetInterface(qmpPluginAPI* api) //as its entry point. A pointer to the core API is also passed to the plugin //through the parameter. This function should return a pointer to a class //that implementes the plugin pinterface (qmpPluginIntf). typedef qmpPluginIntf*(*qmpPluginEntry)(qmpPluginAPI*); //The following symbol only presents in plugins. Its purpose is to help the core reject incompatible plugins. typedef const char*(*qmpPluginAPIRevEntry)(); #endif // QMPCOREPUBLIC_HPP