aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2016-04-09 21:52:04 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2016-04-09 21:52:04 +0800
commite0e4f9f84bb8eed6cde71ff4d67286c2e26e4693 (patch)
tree3317c3ea2b67025fbf25c8a79ae6828b2a640220
parent2b46ba471830d4e6e22be5afc720adc2489efcfe (diff)
downloadQMidiPlayer-e0e4f9f84bb8eed6cde71ff4d67286c2e26e4693.tar.xz
Blocked thread!
-rw-r--r--ChangeLog4
-rw-r--r--qmidiplayer-desktop/qmpchannelswindow.cpp27
-rw-r--r--qmidiplayer-desktop/qmpchannelswindow.hpp2
3 files changed, 31 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index d737748..a8b8ead 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2016-04-09 0.7.1 beta
+Add the fuse mechanism to avoid black midi blocking the
+main thread.
+
2016-04-08 0.7.1 beta
Add MIDI activity indicator.
Substract time taken by sending midi data from sleep time.
diff --git a/qmidiplayer-desktop/qmpchannelswindow.cpp b/qmidiplayer-desktop/qmpchannelswindow.cpp
index 3e43c3d..17c0893 100644
--- a/qmidiplayer-desktop/qmpchannelswindow.cpp
+++ b/qmidiplayer-desktop/qmpchannelswindow.cpp
@@ -1,3 +1,4 @@
+#include <cstdio>
#include <QCheckBox>
#include <QPushButton>
#include <QComboBox>
@@ -15,7 +16,7 @@ qmpChannelsWindow::qmpChannelsWindow(QWidget *parent) :
connect(this,SIGNAL(dialogClosing()),parent,SLOT(dialogClosed()));
mapper=qmpMainWindow::getInstance()->getPlayer()->getMidiMapper();
cha=new QPixmap(":/img/ledon.png");chi=new QPixmap(":/img/ledoff.png");
- cb=new qmpCWNoteOnCB();
+ cb=new qmpCWNoteOnCB();fused=callbacksc=cbcnt=0;
qmpMainWindow::getInstance()->getPlayer()->setNoteOnCallBack(cb,NULL);
connect(cb,SIGNAL(onNoteOn()),this,SLOT(updateChannelActivity()));
int devc=mapper->enumDevices();
@@ -78,6 +79,7 @@ void qmpChannelsWindow::moveEvent(QMoveEvent *event)
void qmpChannelsWindow::updateChannelActivity()
{
+ ++callbacksc;
for(int i=0;i<16;++i)
ui->twChannels->item(i,0)->setIcon(
qmpMainWindow::getInstance()->getPlayer()->getChstates()[i]?*cha:*chi);
@@ -89,7 +91,19 @@ void qmpChannelsWindow::channelWindowsUpdate()
{
for(int i=0;i<16;++i)
((QLabel*)ui->twChannels->cellWidget(i,4))->setText("");
- return;
+ connect(cb,SIGNAL(onNoteOn()),this,SLOT(updateChannelActivity()));
+ fused=0;return;
+ }
+ ++cbcnt;
+ if(cbcnt>15)
+ {
+ if(callbacksc>8192)
+ {
+ disconnect(cb,SIGNAL(onNoteOn()),this,SLOT(updateChannelActivity()));
+ fprintf(stderr,"Fuse!\n");fused=1;
+ }
+ cbcnt=0;
+ callbacksc=0;
}
for(int i=0;i<16;++i)
{
@@ -97,6 +111,15 @@ void qmpChannelsWindow::channelWindowsUpdate()
int b,p;
qmpMainWindow::getInstance()->getPlayer()->getChannelPreset(i,&b,&p,nm);
sprintf(data,"%d:%d %s",b,p,nm);
+ if(fused)
+ {
+ if(strcmp(((QLabel*)ui->twChannels->cellWidget(i,4))->
+ text().toStdString().c_str(),data))
+ {
+ connect(cb,SIGNAL(onNoteOn()),this,SLOT(updateChannelActivity()));
+ fused=0;
+ }
+ }
((QLabel*)ui->twChannels->cellWidget(i,4))->setText(data);
ui->twChannels->item(i,0)->setIcon(
qmpMainWindow::getInstance()->getPlayer()->getChstates()[i]?*cha:*chi);
diff --git a/qmidiplayer-desktop/qmpchannelswindow.hpp b/qmidiplayer-desktop/qmpchannelswindow.hpp
index 80f427a..25c897a 100644
--- a/qmidiplayer-desktop/qmpchannelswindow.hpp
+++ b/qmidiplayer-desktop/qmpchannelswindow.hpp
@@ -97,6 +97,8 @@ class qmpChannelsWindow:public QDialog
qmpMidiMapperRtMidi *mapper;
QPixmap *cha,*chi;
qmpCWNoteOnCB *cb;
+ //callback fuse... (avoid black midi blocking the main thread)
+ int callbacksc,cbcnt,fused;
};
#endif // QMPCHANNELSWINDOW_H