From bd165c0254b9095bb9e5ea54def56b6404033ebe Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Thu, 30 Apr 2020 01:12:38 +0800 Subject: Add visualization renderer. Add API for getting raw pitch bend values. Fix non-compliant RPN handling. The visualization renderer is still at the "proof-of-concept" stage. It's not very usable (yet). --- visualization/renderer/qmpvisrendercore.cpp | 88 +++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 visualization/renderer/qmpvisrendercore.cpp (limited to 'visualization/renderer/qmpvisrendercore.cpp') diff --git a/visualization/renderer/qmpvisrendercore.cpp b/visualization/renderer/qmpvisrendercore.cpp new file mode 100644 index 0000000..fb1a7ef --- /dev/null +++ b/visualization/renderer/qmpvisrendercore.cpp @@ -0,0 +1,88 @@ +#include "qmpvisrendercore.hpp" +#include "qmppluginapistub.hpp" +#include "qmpsettingsro.hpp" +#include "qmpmidiplay.hpp" +#include "qmpcorepublic.hpp" + +#include +#include + +#include +#include +#include +qmpVisRenderCore *qmpVisRenderCore::inst=nullptr; + +qmpVisRenderCore::qmpVisRenderCore():QObject(nullptr) +{ + inst=this; + player=new CMidiPlayer(); + api=new qmpPluginAPIStub(this); + msettings=new qmpSettingsRO(); + msettings->registerOptionEnumInt("MIDI","Text encoding","Midi/TextEncoding",{"Unicode","Big5","Big5-HKSCS","CP949","EUC-JP","EUC-KR","GB18030","KOI8-R","KOI8-U","Macintosh","Shift-JIS"},0); +} + +void qmpVisRenderCore::loadVisualizationLibrary() +{ + mp=dlopen("libvisualization.so",RTLD_LAZY); + if(!mp)fprintf(stderr,"failed to load visualization module!\n"); + GetInterface_func getintf=reinterpret_cast(dlsym(mp,"qmpPluginGetInterface")); + SwitchMode_func switchmode=reinterpret_cast(dlsym(mp,"switchToRenderMode")); + vf=nullptr; + vp=getintf(api); + switchmode(&qmpVisRenderCore::framefunc,false); + vp->init(); + msettings->load("/home/chrisoft/.config/qmprc"); +} + +void qmpVisRenderCore::unloadVisualizationLibrary() +{ + vp->deinit(); + dlclose(mp); +} + +void qmpVisRenderCore::setMIDIFile(const char *url) +{ + player->playerLoadFile(url); +} + +void qmpVisRenderCore::startRender() +{ + assert(vf); + ffmpegproc=new QProcess(); + ffmpegproc->setProgram("ffmpeg"); + QStringList arguments; + arguments + <<"-f"<<"rawvideo" + <<"-pixel_format"<<"rgba" + <<"-video_size"<<"1600x900" + <<"-framerate"<<"60" + <<"-i"<<"pipe:"; + arguments + <<"-vf"<<"vflip" + <<"-pix_fmt"<<"yuv420p" + <<"-c:v"<<"libx264" + <<"-preset"<<"fast" + <<"-crf"<<"22"; + arguments<<"output.mp4"; + ffmpegproc->setArguments(arguments); + ffmpegproc->start(); + connect(ffmpegproc,QOverload::of(&QProcess::finished), + [this](int x,QProcess::ExitStatus){qDebug("%d",x);qDebug()<ffmpegproc->readAllStandardError();}); + vf->show(); + startcb(nullptr,nullptr); +} + +void qmpVisRenderCore::framefunc(void *px, size_t sz) +{ + if(sz) + { + inst->ffmpegproc->write((const char*)px,sz); + while(inst->ffmpegproc->bytesToWrite()>1<<26) + { + inst->ffmpegproc->waitForBytesWritten(); + QThread::yieldCurrentThread(); + } + } + else + inst->ffmpegproc->closeWriteChannel(); +} -- cgit v1.2.3