From 4ffde0ad55d041229793ca4457123bcbcbf8e0c0 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Mon, 25 Apr 2016 23:46:17 +0800 Subject: Plugin API now works correctly. Port old visualization code. --- core/qmpmidiplay.cpp | 6 ++---- core/qmpmidiplay.hpp | 3 +-- core/qmpmidiread.cpp | 8 +++++++- 3 files changed, 10 insertions(+), 7 deletions(-) (limited to 'core') diff --git a/core/qmpmidiplay.cpp b/core/qmpmidiplay.cpp index 4e28be0..ca2878c 100644 --- a/core/qmpmidiplay.cpp +++ b/core/qmpmidiplay.cpp @@ -49,7 +49,7 @@ void CMidiPlayer::fluidDeinitialize() } void CMidiPlayer::processEvent(const SEvent *e) { - SEventCallBackData cbd(e->type,e->p1,e->p2); + SEventCallBackData cbd(e->type,e->p1,e->p2,tceptr); for(int i=0;i<16;++i)if(eventHandlerCB[i]) eventHandlerCB[i]->callBack(&cbd,eventHandlerCBuserdata[i]); switch(e->type&0xF0) @@ -317,9 +317,7 @@ void CMidiPlayer::playerPanic(bool reset) } bool CMidiPlayer::playerLoadFile(const char* fn) { - midiFile=new CMidiFile(fn); - memcpy(midiFile->eventReaderCB,this->eventReaderCB,sizeof(this->eventReaderCB)); - memcpy(midiFile->eventReaderCBuserdata,this->eventReaderCBuserdata,sizeof(this->eventReaderCBuserdata)); + midiFile=new CMidiFile(fn,this->eventReaderCB,this->eventReaderCBuserdata); if(!midiFile->isValid())return false; divs=midiFile->getDivision(); fileTimer1Pass(); diff --git a/core/qmpmidiplay.hpp b/core/qmpmidiplay.hpp index 35fecea..a89a925 100644 --- a/core/qmpmidiplay.hpp +++ b/core/qmpmidiplay.hpp @@ -23,7 +23,6 @@ struct SEvent }; class CMidiFile { - friend class CMidiPlayer; private: std::vectoreventList; char *title,*copyright; @@ -45,7 +44,7 @@ class CMidiFile int chunkReader(int hdrXp); void dumpEvents(); public: - CMidiFile(const char* fn); + CMidiFile(const char* fn,IMidiCallBack** ercb,void** ercbdata); ~CMidiFile(); const SEvent* getEvent(uint32_t id); uint32_t getEventCount(); diff --git a/core/qmpmidiread.cpp b/core/qmpmidiread.cpp index 762ce5d..380b603 100644 --- a/core/qmpmidiread.cpp +++ b/core/qmpmidiread.cpp @@ -172,6 +172,10 @@ int CMidiFile::eventReader()//returns 0 if End of Track encountered error(0,"W: Unknown event type %#x",type); } lasttype=type;++curid; + SEvent* le=eventList[eventList.size()-1]; + SEventCallBackData cbd(le->type,le->p1,le->p2,le->time); + for(int i=0;i<16;++i)if(eventReaderCB[i]) + eventReaderCB[i]->callBack(&cbd,eventReaderCBuserdata[i]); return 1; } void CMidiFile::trackChunkReader() @@ -222,9 +226,11 @@ void CMidiFile::dumpEvents() printf("type %x #%d @%d p1 %d p2 %d\n",eventList[i]->type, eventList[i]->iid,eventList[i]->time,eventList[i]->p1,eventList[i]->p2); } -CMidiFile::CMidiFile(const char* fn) +CMidiFile::CMidiFile(const char* fn,IMidiCallBack **ercb,void **ercbdata) { title=copyright=NULL;notes=0;std=0;valid=1; + memcpy(eventReaderCB,ercb,sizeof(eventReaderCB)); + memcpy(eventReaderCBuserdata,ercbdata,sizeof(eventReaderCBuserdata)); try { if(!(f=fopen(fn,"rb")))throw (fprintf(stderr,"E: file %s doesn't exist!\n",fn),2); -- cgit v1.2.3