aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2019-12-04 23:02:40 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2019-12-04 23:02:40 +0800
commit06496661120f7858f26a29f76631e6f0a0ebae7f (patch)
tree569d912a4d10a9439e2def8d71e5d9dcafe2cb95
parent96a17cb0283647b7a5b7afa9c35a5d1d2b8d6fc7 (diff)
downloadQMidiPlayer-06496661120f7858f26a29f76631e6f0a0ebae7f.tar.xz
Do not crash if midi device is disconnected during the playback.
Linux build no longer searches working directory for plugins. Instead it should search the plugin folder in the executable directory. Documentation update.
-rw-r--r--core/qmpmidioutrtmidi.cpp24
-rw-r--r--doc/optionsdialog.html4
-rw-r--r--doc/qmidiplayer12
-rw-r--r--doc/troubleshooting.html2
-rw-r--r--doc/visualization.html28
-rw-r--r--qmidiplayer-desktop/qmpplugin.cpp6
-rw-r--r--visualization/qmpvisualization.cpp6
7 files changed, 49 insertions, 33 deletions
diff --git a/core/qmpmidioutrtmidi.cpp b/core/qmpmidioutrtmidi.cpp
index 76b12e6..3ed8a4a 100644
--- a/core/qmpmidioutrtmidi.cpp
+++ b/core/qmpmidioutrtmidi.cpp
@@ -197,7 +197,7 @@ void qmpMidiOutRtMidi::deviceInit()
}
catch(RtMidiError &e)
{
- printf("Cannot create RtMidi Output instance: %s\n",e.what());
+ fprintf(stderr,"Cannot create RtMidi Output instance: %s\n",e.what());
outport=nullptr;
}
}
@@ -214,13 +214,27 @@ void qmpMidiOutRtMidi::basicMessage(uint8_t type,uint8_t p1,uint8_t p2)
msg.push_back(p1);
if(((type&0xF0)!=0xC0)&&((type&0xF0)!=0xD0))
msg.push_back(p2);
- outport->sendMessage(&msg);
+ try
+ {
+ outport->sendMessage(&msg);
+ }
+ catch(RtMidiError &e)
+ {
+ fprintf(stderr,"Failed to send midi message: %s\n",e.what());
+ }
}
void qmpMidiOutRtMidi::extendedMessage(uint32_t length,const char *data)
{
if(!outport||!outport->isPortOpen())return;
std::vector<unsigned char>msg(data,data+length);
- outport->sendMessage(&msg);
+ try
+ {
+ outport->sendMessage(&msg);
+ }
+ catch(RtMidiError &e)
+ {
+ fprintf(stderr,"Failed to send midi message: %s\n",e.what());
+ }
}
void qmpMidiOutRtMidi::rpnMessage(uint8_t ch,uint16_t type,uint16_t val)
{
@@ -271,7 +285,7 @@ void qmpMidiOutRtMidi::onMapped(uint8_t,int)
}
catch(RtMidiError &e)
{
- printf("Device initialization failure: %s\n",e.what());
+ fprintf(stderr,"Device initialization failure: %s\n",e.what());
}
}
@@ -333,7 +347,7 @@ std::vector<std::pair<qmpMidiOutRtMidi*,std::string>> qmpRtMidiManager::getDevic
try{dummy=new RtMidiOut();}
catch(RtMidiError &e)
{
- printf("Failed to initialize the dummy device: %s\n",e.what());
+ fprintf(stderr,"Failed to initialize the dummy device: %s\n",e.what());
return{};
}
for(unsigned i=0;i<dummy->getPortCount();++i)
diff --git a/doc/optionsdialog.html b/doc/optionsdialog.html
index 24a6ca7..b473b91 100644
--- a/doc/optionsdialog.html
+++ b/doc/optionsdialog.html
@@ -81,11 +81,11 @@
</ul>
<img src="../img/options5.png" width="440"><br>
Plugin manager. View details of plugins, enable or disable them here.<br>
- Enabled plugin list is applied after a restart.<br>
+ Changes in this page require a restart to take effect. New plugins are enabled by default.<br>
Plugin scanning follows the order below:
<ul>
<li>(*nix) /usr/lib/qmidiplayer</li>
- <li>The folder containing QMidiPlayer's executable file.</li>
+ <li>a folder named "plugins" in the folder containing QMidiPlayer's executable file.</li>
</ul>
<br><a href="index.html">Return</a>
</div>
diff --git a/doc/qmidiplayer b/doc/qmidiplayer
index 8dacdb1..4b318cd 100644
--- a/doc/qmidiplayer
+++ b/doc/qmidiplayer
@@ -1,15 +1,17 @@
.\" Manpage for qmidiplayer.
-.TH man 1 "29 Dec 2016" "0.8.3" "qmidiplayer man page"
+.TH man 1 "04 Dec 2019" "0.8.7" "qmidiplayer man page"
.SH NAME
-qmidiplayer \- Plays midi file
+qmidiplayer \- A midi file player
.SH SYNOPSIS
qmidiplayer [Options] [Midi Files]
.SH DESCRIPTION
QMidiPlayer is a cross-platform midi file player based on libfluidsynth and Qt.
.SH OPTIONS
Possible options are:
- -l, --load-all-files Load all files from the same folder.
- --help Show this help and exit.
- --version Show this version information and exit.
+ -h, --help Displays this help.
+ -v, --version Displays version information.
+ --plugin <plugin library> Load a plugin from <plugin library>.
+ -l, --load-all-files Load all files from the same folder.
+
.SH AUTHOR
Chris Xiong (chirs241097@gmail.com)
diff --git a/doc/troubleshooting.html b/doc/troubleshooting.html
index 34b50b2..7caf8be 100644
--- a/doc/troubleshooting.html
+++ b/doc/troubleshooting.html
@@ -159,7 +159,7 @@ The data at memory address 0x000001d8 could not be read.
0x69bf6fd4 from [unknown module] in BaseThreadInitThunk (No symbols)
0x6b97cf31 from [unknown module] in RtlUserThreadStart (No symbols)
</pre>
- Append that to your issue report (make sure it doesn't contain any personal stuff first).
+ Append that to your issue report (make sure it doesn't contain any personal data first).
For Linux users, you usually already have a coredump for the crash. Please refer to the
documentation of your distribution for how to take a back trace from that coredump.
</p>
diff --git a/doc/visualization.html b/doc/visualization.html
index 3507985..6ad44dd 100644
--- a/doc/visualization.html
+++ b/doc/visualization.html
@@ -30,18 +30,18 @@
To use the visualization, click the Visualization button in the main window.<br>
The visualization plugin adds two new option tabs.
<h3>Controls</h3>
-<pre>
- forward
- | ↱Hold left mouse button and drag:
- up | down ┌──┬──┐ Adjust viewport.
- ↓ ↓ ↓ │ │ │
- Q W E R←reset viewport ├──┴──┤
- A S D │ │
- ↑ ↑ ↑ │ │
-left | right ← → │ │
- | Seek left/right └─────┘
- backward (Hold shift to seek 5% instead of 1%)
-</pre>
+ <ul>
+ <li>W: move camera forward</li>
+ <li>A: move camera left</li>
+ <li>S: move camera backward</li>
+ <li>D: move camera right</li>
+ <li>Q: move camera up</li>
+ <li>E: move camera down</li>
+ <li>Left arrow key: seek backward 1%</li>
+ <li>Right arrow key: seek forward 1%</li>
+ <li>Shift: seed 5% instead of 1%</li>
+ <li>Left mouse button: hold and drag to orient the camera</li>
+ </ul>
<h3>Options</h3>
The options listed here are applied after closing and reopening the visualization.
<ul>
@@ -70,8 +70,8 @@ left | right ← → │ │
<li>Save Viewport: Restore last camera configuration when the visualization is started.</li>
<li>Window Width/Height: Change the window size. If the size equals to your screen size, the visualization will start in fullscreen mode.</li>
<li>FPS: FPS limit of the visualization.</li>
- <li>Supersampling: Supersample anti-aliasing. 1 means no SSAA.</li>
- <li>Multisampling: Multisample anti-aliasing. 0 means no MSAA.</li>
+ <li>Supersampling: Supersample anti-aliasing for the 3D visualization scene. 1 means no SSAA.</li>
+ <li>Multisampling: Multisample anti-aliasing for the 3D visualization scene. 0 means no MSAA.</li>
<li>FOV: Field of view.</li>
<li>OSD Position: Change position of the on screen display, or simply disable it.</li>
<li>Font size: Change font size used by the visualization. Useful for HiDPI screens.</li>
diff --git a/qmidiplayer-desktop/qmpplugin.cpp b/qmidiplayer-desktop/qmpplugin.cpp
index 774f0da..8f16573 100644
--- a/qmidiplayer-desktop/qmpplugin.cpp
+++ b/qmidiplayer-desktop/qmpplugin.cpp
@@ -65,12 +65,12 @@ void qmpPluginManager::scanPlugins(const std::vector<std::string> &pp)
}
delete dir;
#endif
- dir=new QDirIterator("./");
+ dir=new QDirIterator(QCoreApplication::applicationDirPath()+"/plugins/");
while(dir->hasNext())
{
dir->next();
if(dir->fileInfo().suffix()=="so")
- cpluginpaths.push_back(std::string("./")+dir->fileName().toStdString());
+ cpluginpaths.push_back(QCoreApplication::applicationDirPath().toStdString()+std::string("/plugins/")+dir->fileName().toStdString());
}
delete dir;
for(unsigned i=0;i<cpluginpaths.size();++i)
@@ -114,7 +114,7 @@ void qmpPluginManager::initPlugins()
for(unsigned i=0;i<plugins.size();++i)
{
if(!plugins[i].enabled)continue;
- printf("Loaded plugin: %s\n",plugins[i].path.c_str());
+ fprintf(stderr,"Loaded plugin: %s\n",plugins[i].path.c_str());
plugins[i].pinterface->init();plugins[i].initialized=true;
}
}
diff --git a/visualization/qmpvisualization.cpp b/visualization/qmpvisualization.cpp
index c72cbf5..a3f9554 100644
--- a/visualization/qmpvisualization.cpp
+++ b/visualization/qmpvisualization.cpp
@@ -115,18 +115,18 @@ void qmpVisualization::showThread()
if(!font.loadTTF("/usr/share/fonts/truetype/freefont/FreeMono.ttf",fontsize))
if(!font.loadTTF("/usr/share/fonts/gnu-free/FreeMono.otf",fontsize))
if(!font.loadTTF((std::string(getenv("windir")?getenv("windir"):"")+"/Fonts/cour.ttf").c_str(),fontsize))
- printf("W: Font load failed.\n");
+ fprintf(stderr,"W: Font load failed.\n");
if(!api->getOptionString("Visualization/font2").length()||!fonthdpi.loadTTF(api->getOptionString("Visualization/font2").c_str(),180))
if(!fonthdpi.loadTTF("/usr/share/fonts/truetype/freefont/FreeMono.ttf",180))
if(!fonthdpi.loadTTF("/usr/share/fonts/gnu-free/FreeMono.otf",180))
if(!fonthdpi.loadTTF((std::string(getenv("windir")?getenv("windir"):"")+"/Fonts/cour.ttf").c_str(),180))
- printf("W: Font load failed.\n");
+ fprintf(stderr,"W: Font load failed.\n");
if(!api->getOptionString("Visualization/font1").length()||!font2.loadTTF(api->getOptionString("Visualization/font1").c_str(),fontsize))
if(!font2.loadTTF("/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",fontsize))
if(!font2.loadTTF("/usr/share/fonts/wenquanyi/wqy-microhei/wqy-microhei.ttc",fontsize))
if(!font2.loadTTF((std::string(getenv("windir")?getenv("windir"):"")+"/Fonts/msyh.ttc").c_str(),fontsize))
if(!font2.loadTTF((std::string(getenv("windir")?getenv("windir"):"")+"/Fonts/segoeui.ttf").c_str(),fontsize))
- printf("W: Font load failed.\n");
+ fprintf(stderr,"W: Font load failed.\n");
if(horizontal)
{
pos[0]=-20;pos[1]=45;pos[2]=0;