aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--debian/changelog6
-rw-r--r--doc/channeldialog.html43
-rw-r--r--doc/index.html4
-rw-r--r--doc/mainwindow.html2
-rw-r--r--doc/version.html2
-rw-r--r--img/chanw.pngbin0 -> 58092 bytes
-rw-r--r--img/chparaw.pngbin0 -> 34388 bytes
-rw-r--r--img/mainw.pngbin32886 -> 35328 bytes
-rw-r--r--qmpmainwindow.cpp17
-rw-r--r--qmpmidiplay.cpp41
-rw-r--r--qmpmidiplay.hpp10
-rw-r--r--qmpsettingswindow.cpp5
-rw-r--r--qmpsettingswindow.ui209
-rw-r--r--resources.qrc4
15 files changed, 247 insertions, 101 deletions
diff --git a/ChangeLog b/ChangeLog
index 117910e..c352ce8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
2016-02-28 0.7.0 beta
+RPN pitch bend range handling.
+Added an option to disable waiting for remaining voices before stopping.
+Documentation...
+
+2016-02-28 0.7.0 beta
Significant sleep precision improvments for Windows.
Also save master volume in configuration file.
diff --git a/debian/changelog b/debian/changelog
index 5b25b81..6437ab1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+qmidiplayer (0.7.0-2) UNRELEASED; urgency=low
+
+ * New upstream release.
+
+ -- chrisoft <chirs241097@gmail.com> Sun, 28 Feb 2016 20:50:36 +0800
+
qmidiplayer (0.7.0-1) UNRELEASED; urgency=low
* New upstream release.
diff --git a/doc/channeldialog.html b/doc/channeldialog.html
new file mode 100644
index 0000000..8ddf246
--- /dev/null
+++ b/doc/channeldialog.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>QMidiPlayer Help</title>
+</head>
+<body>
+ <table>
+ <tr>
+ <td style="vertical-align:top;">
+ <ul>
+ <li><a href="index.html">Overview</a></li>
+ <li><a href="mainwindow.html">Main Window</a></li>
+ <li>Channels Dialog</li>
+ <li>Channel Editor</li>
+ <li>Playlist</li>
+ <li>Effects</li>
+ <li>Settings</li>
+ <li><a href="version.html">Version Info.</a></li>
+ <li><a href="license.html">License</a></li>
+ </ul>
+ </td>
+ <td>
+ <h1>Channel Dialog</h1>
+ <img src="../img/chanw.png"><br>
+ <h2>Columns in the channel table</h2>
+ <ul>
+ <li>M(Mute): Tick this to mute the corresponding channel.</li>
+ <li>S(Solo): Tick this to solo the corresponding channel.</li>
+ <li>Device: The player sends midi messages from this channel to the selected device.</li>
+ <li>Preset: Displays the current preset of the corresponding channel.<br>
+ Preset can be changed by double clicking the cells from this column.</li>
+ <li>...: Brings up the channel parameter editor dialog.</li>
+ </ul>
+ <h2>Buttons</h2>
+ <ul>
+ <li>Save/Load: not yet implemented.</li>
+ <li>Unmute All: Remove tick mark from all mute checkboxes.</li>
+ <li>Unsolo All: Remove tick mark from all solo checkboxes.</li>
+ </ul>
+ <br><a href="index.html">Return</a>
+ </td>
+</body>
+</html>
diff --git a/doc/index.html b/doc/index.html
index a36d7cf..a9135bd 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -10,7 +10,7 @@
<ul>
<li>Overview</li>
<li><a href="mainwindow.html">Main Window</a></li>
- <li>Channels Dialog</li>
+ <li><a href="channeldialog.html">Channels Dialog</a></li>
<li>Channel Editor</li>
<li>Playlist</li>
<li>Effects</li>
@@ -34,7 +34,7 @@
<h1>Using QMidiPlayer</h1>
<ul>
<li><a href="mainwindow.html">The main window</a></li>
- <li>The channels dialog</li>
+ <li><a href="channeldialog.html">The channels dialog</a></li>
<li>The channels parameters editor</li>
<li>The playlist dialog</li>
<li>The effects dialog</li>
diff --git a/doc/mainwindow.html b/doc/mainwindow.html
index c82fa67..c3e2ac8 100644
--- a/doc/mainwindow.html
+++ b/doc/mainwindow.html
@@ -10,7 +10,7 @@
<ul>
<li><a href="index.html">Overview</a></li>
<li>Main Window</li>
- <li>Channels Dialog</li>
+ <li><a href="channeldialog.html">Channels Dialog</a></li>
<li>Channel Editor</li>
<li>Playlist</li>
<li>Effects</li>
diff --git a/doc/version.html b/doc/version.html
index 5428ef7..a830a0e 100644
--- a/doc/version.html
+++ b/doc/version.html
@@ -10,7 +10,7 @@
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="mainwindow.html">Main Window</a></li>
- <li>Channels Dialog</li>
+ <li><a href="channeldialog.html">Channels Dialog</a></li>
<li>Channel Editor</li>
<li>Playlist</li>
<li>Effects</li>
diff --git a/img/chanw.png b/img/chanw.png
new file mode 100644
index 0000000..670244f
--- /dev/null
+++ b/img/chanw.png
Binary files differ
diff --git a/img/chparaw.png b/img/chparaw.png
new file mode 100644
index 0000000..f36a8ca
--- /dev/null
+++ b/img/chparaw.png
Binary files differ
diff --git a/img/mainw.png b/img/mainw.png
index c15f17d..f197d5d 100644
--- a/img/mainw.png
+++ b/img/mainw.png
Binary files differ
diff --git a/qmpmainwindow.cpp b/qmpmainwindow.cpp
index 73b9b73..35dd3ee 100644
--- a/qmpmainwindow.cpp
+++ b/qmpmainwindow.cpp
@@ -155,7 +155,7 @@ void qmpMainWindow::updateWidgets()
fnA2->setEnabled(stopped);
player->playerDeinit();playerTh->join();
delete playerTh;playerTh=NULL;
- if(singleFS)player->playerPanic();
+ if(singleFS)player->playerPanic(true);
chnlw->on_pbUnmute_clicked();chnlw->on_pbUnsolo_clicked();
ui->pbPlayPause->setIcon(QIcon(":/img/play.png"));
ui->hsTimer->setValue(0);
@@ -167,7 +167,7 @@ void qmpMainWindow::updateWidgets()
timer->stop();player->playerDeinit();playerTh->join();
delete playerTh;playerTh=NULL;
ui->hsTimer->setValue(0);
- if(singleFS)player->playerPanic();
+ if(singleFS)player->playerPanic(true);
chnlw->on_pbUnmute_clicked();chnlw->on_pbUnsolo_clicked();
QString fns=plistw->getNextItem();
ui->lbFileName->setText(QUrl(fns).fileName());
@@ -179,6 +179,7 @@ void qmpMainWindow::updateWidgets()
for(int i=settingsw->getSFWidget()->count()-1;i>=0;--i)
player->pushSoundFont(settingsw->getSFWidget()->item(i)->text().toStdString().c_str());}
player->setGain(ui->vsMasterVol->value()/250.);efxw->sendEfxChange();
+ player->setWaitVoice(qmpSettingsWindow::getSettingsIntf()->value("Midi/WaitVoice",1).toInt());
playerTh=new std::thread(&CMidiPlayer::playerThread,player);
st=std::chrono::steady_clock::now();offset=0;
timer->start(100);
@@ -268,6 +269,7 @@ void qmpMainWindow::on_pbPlayPause_clicked()
for(int i=settingsw->getSFWidget()->count()-1;i>=0;--i)
player->pushSoundFont(settingsw->getSFWidget()->item(i)->text().toStdString().c_str());}
player->setGain(ui->vsMasterVol->value()/250.);efxw->sendEfxChange();
+ player->setWaitVoice(qmpSettingsWindow::getSettingsIntf()->value("Midi/WaitVoice",1).toInt());
playerTh=new std::thread(&CMidiPlayer::playerThread,player);
st=std::chrono::steady_clock::now();offset=0;
timer->start(100);
@@ -328,7 +330,7 @@ void qmpMainWindow::on_pbStop_clicked()
{
timer->stop();stopped=true;playing=false;
player->playerDeinit();fnA2->setEnabled(stopped);
- if(singleFS)player->playerPanic();
+ if(singleFS)player->playerPanic(true);
if(playerTh){playerTh->join();delete playerTh;playerTh=NULL;}
chnlw->on_pbUnmute_clicked();chnlw->on_pbUnsolo_clicked();
ui->pbPlayPause->setIcon(QIcon(":/img/play.png"));
@@ -376,7 +378,7 @@ void qmpMainWindow::on_pbPrev_clicked()
{
timer->stop();player->playerDeinit();
if(playerTh){playerTh->join();delete playerTh;playerTh=NULL;}
- if(singleFS)player->playerPanic();
+ if(singleFS)player->playerPanic(true);
ui->hsTimer->setValue(0);chnlw->on_pbUnmute_clicked();chnlw->on_pbUnsolo_clicked();
QString fns=plistw->getPrevItem();if(fns.length()==0)return on_pbStop_clicked();
ui->lbFileName->setText(QUrl(fns).fileName());
@@ -388,6 +390,7 @@ void qmpMainWindow::on_pbPrev_clicked()
for(int i=settingsw->getSFWidget()->count()-1;i>=0;--i)
player->pushSoundFont(settingsw->getSFWidget()->item(i)->text().toStdString().c_str());}
player->setGain(ui->vsMasterVol->value()/250.);efxw->sendEfxChange();
+ player->setWaitVoice(qmpSettingsWindow::getSettingsIntf()->value("Midi/WaitVoice",1).toInt());
playerTh=new std::thread(&CMidiPlayer::playerThread,player);
st=std::chrono::steady_clock::now();offset=0;
timer->start(100);
@@ -397,7 +400,7 @@ void qmpMainWindow::on_pbNext_clicked()
{
timer->stop();player->playerDeinit();
if(playerTh){playerTh->join();delete playerTh;playerTh=NULL;}
- if(singleFS)player->playerPanic();
+ if(singleFS)player->playerPanic(true);
ui->hsTimer->setValue(0);chnlw->on_pbUnmute_clicked();chnlw->on_pbUnsolo_clicked();
QString fns=plistw->getNextItem();if(fns.length()==0)return on_pbStop_clicked();
ui->lbFileName->setText(QUrl(fns).fileName());
@@ -409,6 +412,7 @@ void qmpMainWindow::on_pbNext_clicked()
for(int i=settingsw->getSFWidget()->count()-1;i>=0;--i)
player->pushSoundFont(settingsw->getSFWidget()->item(i)->text().toStdString().c_str());}
player->setGain(ui->vsMasterVol->value()/250.);efxw->sendEfxChange();
+ player->setWaitVoice(qmpSettingsWindow::getSettingsIntf()->value("Midi/WaitVoice",1).toInt());
playerTh=new std::thread(&CMidiPlayer::playerThread,player);
st=std::chrono::steady_clock::now();offset=0;
timer->start(100);
@@ -420,7 +424,7 @@ void qmpMainWindow::selectionChanged()
ui->pbPlayPause->setIcon(QIcon(":/img/pause.png"));
timer->stop();player->playerDeinit();
if(playerTh){playerTh->join();delete playerTh;playerTh=NULL;}
- if(singleFS)player->playerPanic();
+ if(singleFS)player->playerPanic(true);
ui->hsTimer->setValue(0);
chnlw->on_pbUnmute_clicked();chnlw->on_pbUnsolo_clicked();
QString fns=plistw->getSelectedItem();
@@ -433,6 +437,7 @@ void qmpMainWindow::selectionChanged()
for(int i=settingsw->getSFWidget()->count()-1;i>=0;--i)
player->pushSoundFont(settingsw->getSFWidget()->item(i)->text().toStdString().c_str());}
player->setGain(ui->vsMasterVol->value()/250.);efxw->sendEfxChange();
+ player->setWaitVoice(qmpSettingsWindow::getSettingsIntf()->value("Midi/WaitVoice",1).toInt());
playerTh=new std::thread(&CMidiPlayer::playerThread,player);
st=std::chrono::steady_clock::now();offset=0;
timer->start(100);
diff --git a/qmpmidiplay.cpp b/qmpmidiplay.cpp
index b93b0d1..ebbf36e 100644
--- a/qmpmidiplay.cpp
+++ b/qmpmidiplay.cpp
@@ -53,6 +53,13 @@ void CMidiPlayer::processEvent(const SEvent *e)
fluid_synth_noteon(synth,e->type&0x0F,e->p1,e->p2);
break;
case 0xB0://CC
+ if(e->p1==100)rpnid=e->p2;
+ if(e->p1==6)rpnval=e->p2;
+ if(~rpnid&&~rpnval)
+ {
+ if(rpnid==0)fluid_synth_pitch_wheel_sens(synth,e->type&0x0F,rpnval);
+ rpnid=rpnval=-1;
+ }
fluid_synth_cc(synth,e->type&0x0F,e->p1,e->p2);
break;
case 0xC0://PC
@@ -96,6 +103,13 @@ void CMidiPlayer::processEventStub(const SEvent *e)
switch(e->type&0xF0)
{
case 0xB0://CC
+ if(e->p1==100)rpnid=e->p2;
+ if(e->p1==6)rpnval=e->p2;
+ if(~rpnid&&~rpnval)
+ {
+ if(rpnid==0)ccc[e->type&0x0F][134]=rpnval;
+ rpnid=rpnval=-1;
+ }
ccc[e->type&0x0F][e->p1]=e->p2;
break;
case 0xC0://PC
@@ -159,7 +173,7 @@ void CMidiPlayer::playEvents()
if(tcstop||!midiFile)break;
ct=midiFile->getEvent(tceptr)->time;
}
- while(!tcstop&&synth&&fluid_synth_get_active_voice_count(synth)>0)std::this_thread::sleep_for(std::chrono::microseconds(100));
+ while(!tcstop&&synth&&(waitvoice&&fluid_synth_get_active_voice_count(synth)>0))std::this_thread::sleep_for(std::chrono::milliseconds(2));
finished=1;
}
void CMidiPlayer::fileTimer1Pass()
@@ -178,16 +192,16 @@ void CMidiPlayer::fileTimer2Pass()
{
double ctime=.0;uint32_t c=1;ctempo=0x7A120;dpt=ctempo*1000/divs;
memset(stamps,0,sizeof(stamps));memset(ccstamps,0,sizeof(ccstamps));
- memset(ccc,0,sizeof(ccc));for(int i=0;i<16;++i)
+ memset(ccc,0,sizeof(ccc));rpnid=rpnval=-1;for(int i=0;i<16;++i)
{
ccc[i][7]=100;ccc[i][10]=64;ccc[i][11]=127;
ccc[i][11]=127;ccc[i][71]=64;ccc[i][72]=64;
ccc[i][73]=64;ccc[i][74]=64;ccc[i][75]=64;
ccc[i][76]=64;ccc[i][77]=64;ccc[i][78]=64;
ccc[0][131]=dpt;ccc[0][132]=0x04021808;
- ccc[0][133]=0;
+ ccc[0][133]=0;ccc[0][134]=2;
}if(midiFile->getStandard()!=4)ccc[9][0]=128;
- for(int i=0;i<16;++i)for(int j=0;j<134;++j)
+ for(int i=0;i<16;++i)for(int j=0;j<135;++j)
ccstamps[0][i][j]=ccc[i][j];
for(uint32_t eptr=0,ct=midiFile->getEvent(0)->time;eptr<midiFile->getEventCount();)
{
@@ -197,7 +211,7 @@ void CMidiPlayer::fileTimer2Pass()
ctime+=(midiFile->getEvent(eptr)->time-ct)*dpt/1e9;
while(ctime>ftime*c/100.)
{
- for(int i=0;i<16;++i)for(int j=0;j<134;++j)
+ for(int i=0;i<16;++i)for(int j=0;j<135;++j)
ccstamps[c][i][j]=ccc[i][j];
stamps[c++]=eptr;
if(c>100)break;
@@ -206,7 +220,7 @@ void CMidiPlayer::fileTimer2Pass()
}
while(c<101)
{
- for(int i=0;i<16;++i)for(int j=0;j<132;++j)
+ for(int i=0;i<16;++i)for(int j=0;j<135;++j)
ccstamps[c][i][j]=ccc[i][j];
stamps[c++]=midiFile->getEventCount();
}
@@ -214,13 +228,19 @@ void CMidiPlayer::fileTimer2Pass()
CMidiPlayer::CMidiPlayer(bool singleInst)
{
midiFile=NULL;resumed=false;singleInstance=singleInst;
- settings=NULL;synth=NULL;adriver=NULL;
+ settings=NULL;synth=NULL;adriver=NULL;waitvoice=true;
}
CMidiPlayer::~CMidiPlayer(){if(singleInstance)fluidDeinitialize();}
-void CMidiPlayer::playerPanic()
+void CMidiPlayer::playerPanic(bool reset)
{
+ if(reset)for(int i=0;i<16;++i)
+ {
+ fluid_synth_pitch_bend(synth,i,8192);
+ fluid_synth_cc(synth,i,7,100);
+ fluid_synth_cc(synth,i,10,64);
+ fluid_synth_cc(synth,i,11,127);
+ }
for(int i=0;i<16;++i)fluid_synth_all_notes_off(synth,i);
- //for(int i=0;i<16;++i)for(int j=0;j<128;++j)fluid_synth_noteoff(synth,i,j);
}
bool CMidiPlayer::playerLoadFile(const char* fn)
{
@@ -235,7 +255,7 @@ void CMidiPlayer::playerInit()
{
ctempo=0x7A120;ctsn=4;ctsd=4;cks=0;dpt=ctempo*1000/divs;
tceptr=0;tcstop=0;tcpaused=0;finished=0;mute=solo=0;
- sendSysEx=true;
+ sendSysEx=true;rpnid=rpnval=-1;
if(!singleInstance)fluidPreInitialize();
}
void CMidiPlayer::playerDeinit()
@@ -307,6 +327,7 @@ uint32_t CMidiPlayer::getTCpaused(){return tcpaused;}
void CMidiPlayer::setTCpaused(uint32_t ps){tcpaused=ps;}
uint32_t CMidiPlayer::isFinished(){return finished;}
void CMidiPlayer::setResumed(){resumed=true;}
+void CMidiPlayer::setWaitVoice(bool wv){waitvoice=wv;}
void CMidiPlayer::setGain(double gain){if(settings)fluid_settings_setnum(settings,"synth.gain",gain);}
int CMidiPlayer::getPolyphone(){return synth?fluid_synth_get_active_voice_count(synth):0;}
int CMidiPlayer::getMaxPolyphone(){return synth?fluid_synth_get_polyphony(synth):0;}
diff --git a/qmpmidiplay.hpp b/qmpmidiplay.hpp
index 6525c87..fafd677 100644
--- a/qmpmidiplay.hpp
+++ b/qmpmidiplay.hpp
@@ -54,11 +54,12 @@ class CMidiPlayer
private:
CMidiFile *midiFile;
uint32_t stamps[101];
- uint32_t ccstamps[101][16][134],ccc[16][134];
- //0..127:cc 128:pc 129:cp 130:pb 131:tempo 132:ts 133:ks
+ uint32_t ccstamps[101][16][135],ccc[16][135];
+ //0..127:cc 128:pc 129:cp 130:pb 131:tempo 132:ts 133:ks 134:pbr
+ int32_t rpnid,rpnval;
uint16_t mute,solo;
double ftime;
- bool sendSysEx,singleInstance;
+ bool sendSysEx,singleInstance,waitvoice;
fluid_settings_t* settings;
fluid_synth_t* synth;
fluid_audio_driver_t* adriver;
@@ -85,7 +86,7 @@ class CMidiPlayer
void fluidDeinitialize();
void playerDeinit();
void playerThread();
- void playerPanic();
+ void playerPanic(bool reset=false);
void rendererLoadFile(const char* ofn);
void rendererInit(const char *fn);
@@ -100,6 +101,7 @@ class CMidiPlayer
void setTCpaused(uint32_t ps);
uint32_t isFinished();
void setResumed();
+ void setWaitVoice(bool wv);
double getFtime();
void getCurrentTimeSignature(int *n,int *d);
diff --git a/qmpsettingswindow.cpp b/qmpsettingswindow.cpp
index b1f620c..c2e31a2 100644
--- a/qmpsettingswindow.cpp
+++ b/qmpsettingswindow.cpp
@@ -63,6 +63,9 @@ void qmpSettingsWindow::settingsInit()
settings->setValue("Midi/SendSysEx",settings->value("Midi/SendSysEx",1));
ui->cbSendSysx->setChecked(settings->value("Midi/SendSysEx",1).toInt());
+ settings->setValue("Midi/WaitVoice",settings->value("Midi/WaitVoice",1));
+ ui->cbWaitVoice->setChecked(settings->value("Midi/WaitVoice",1).toInt());
+
int selected=-1;
for(int i=0;i<ui->cbEncoding->count();++i)
if(ui->cbEncoding->itemText(i)==settings->value("Midi/TextEncoding","Unicode").toString())
@@ -171,6 +174,8 @@ void qmpSettingsWindow::settingsUpdate()
settings->setValue("Midi/SendSysEx",ui->cbSendSysx->isChecked()?1:0);
+ settings->setValue("Midi/WaitVoice",ui->cbWaitVoice->isChecked()?1:0);
+
settings->setValue("Midi/TextEncoding",ui->cbEncoding->currentText());
settings->setValue("Audio/Driver",ui->cbAudioDrv->currentText());
diff --git a/qmpsettingswindow.ui b/qmpsettingswindow.ui
index 4fdb6f1..330afa2 100644
--- a/qmpsettingswindow.ui
+++ b/qmpsettingswindow.ui
@@ -29,102 +29,159 @@
<attribute name="title">
<string>Midi</string>
</attribute>
- <layout class="QGridLayout" name="gridLayout">
- <item row="1" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QLabel" name="lbOutputDevice">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Default Output Device</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="cbOutputDevice">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text">
+ <string>Internal FluidSynth</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
<widget class="QCheckBox" name="cbDisableMapping">
- <property name="text">
- <string>Disable Midi Mapping</string>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="lbOutputDevice">
<property name="text">
- <string>Default Output Device</string>
+ <string>Disable Midi Mapping</string>
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QComboBox" name="cbOutputDevice">
- <item>
- <property name="text">
- <string>Internal FluidSynth</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="2" column="0">
+ <item>
<widget class="QCheckBox" name="cbSendSysx">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
<string>Send SysEx</string>
</property>
</widget>
</item>
- <item row="3" column="0">
- <widget class="QLabel" name="lbEncoding">
+ <item>
+ <widget class="QCheckBox" name="cbWaitVoice">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
- <string>Text Encoding</string>
+ <string>Wait for remaining voices before stopping</string>
</property>
</widget>
</item>
- <item row="3" column="1">
- <widget class="QComboBox" name="cbEncoding">
- <item>
- <property name="text">
- <string>Unicode</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Big5</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Big5-HKSCS</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>CP949</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>EUC-JP</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>EUC-KR</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>GB18030</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>KOI8-R</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>KOI8-U</string>
- </property>
- </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
- <property name="text">
- <string>Macintosh</string>
- </property>
+ <widget class="QLabel" name="lbEncoding">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Text Encoding</string>
+ </property>
+ </widget>
</item>
<item>
- <property name="text">
- <string>Shift-JIS</string>
- </property>
+ <widget class="QComboBox" name="cbEncoding">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text">
+ <string>Unicode</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Big5</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Big5-HKSCS</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>CP949</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>EUC-JP</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>EUC-KR</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>GB18030</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>KOI8-R</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>KOI8-U</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Macintosh</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Shift-JIS</string>
+ </property>
+ </item>
+ </widget>
</item>
- </widget>
+ </layout>
</item>
</layout>
</widget>
diff --git a/resources.qrc b/resources.qrc
index 03997c5..2eb232c 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -25,10 +25,12 @@
<file>img/stop.png</file>
<file>img/up.png</file>
<file>img/visualization.png</file>
+ <file>img/mainw.png</file>
+ <file>img/chanw.png</file>
<file>doc/index.html</file>
<file>doc/version.html</file>
<file>doc/license.html</file>
<file>doc/mainwindow.html</file>
- <file>img/mainw.png</file>
+ <file>doc/channeldialog.html</file>
</qresource>
</RCC>