diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro
index 011aa46..48f0af8 100644
--- a/libremediaserver-audio.pro
+++ b/libremediaserver-audio.pro
@@ -2,8 +2,7 @@ TEMPLATE = app
TARGET = libremediaserver-audio
QT += webkitwidgets widgets
HEADERS += src/libremediaserver-audio.h \
- cuetrackwidget.h \
- src/dialgroup.h \
+ src/cuetrackwidget.h \
src/editcuetrackwidget.h \
src/cuetracklistwidget.h \
src/showplayer.h \
@@ -25,10 +24,10 @@ HEADERS += src/libremediaserver-audio.h \
src/audiowidget.h \
src/defines.h \
src/settings.h \
- src/slidergroup.h
+ src/slidergroup.h \
+ src/dialgroup.h
SOURCES += src/main.cpp \
- cuetrackwidget.cpp \
- src/dialgroup.cpp \
+ src/cuetrackwidget.cpp \
src/editcuetrackwidget.cpp \
src/cuetracklistwidget.cpp \
src/showplayer.cpp \
@@ -47,9 +46,10 @@ SOURCES += src/main.cpp \
src/audiolayerwidget.cpp \
src/audiowidget.cpp \
src/settings.cpp \
- src/slidergroup.cpp
+ src/slidergroup.cpp \
+ src/dialgroup.cpp
FORMS += \
- cuetrackwidget.ui \
+ src/cuetrackwidget.ui \
src/showplayer.ui \
src/libremediaserver-audio-ui.ui
CCFLAG += -msse2 -mavx2
@@ -63,6 +63,5 @@ OTHER_FILES += \
docs/changelog.txt \
docs/lms-audio.xlm \
docs/roadmap.txt
-
RESOURCES += \
lms-resources.qrc
diff --git a/lms-resources.qrc b/lms-resources.qrc
index b4ba770..21a0629 100644
--- a/lms-resources.qrc
+++ b/lms-resources.qrc
@@ -8,5 +8,8 @@
resources/new_button.png
resources/paste_button.png
resources/save_button.png
+ resources/icon.png
+ resources/panic_button.jpg
+ resources/go_button.jpeg
diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp
index f714278..22f9062 100644
--- a/src/cuetracklistwidget.cpp
+++ b/src/cuetracklistwidget.cpp
@@ -1,4 +1,7 @@
#include
+#include
+#include
+#include
#include
#include
#include
@@ -7,6 +10,8 @@
#include
#include
#include
+#include
+#include
#include "cuetracklistwidget.h"
CueTrackListWidget::CueTrackListWidget(QWidget *parent)
@@ -42,9 +47,10 @@ CueTrack* CueTrackListWidget::getTrackAtIndex(int index) {
return nullptr;
}
-CueTrack* CueTrackListWidget::getSelectedTrack() {
+CueTrack* CueTrackListWidget::getSelectedTrack(bool advance) {
CueTrack* track = getTrackAtIndex(selectedIndex);
- key_down();
+ if (advance)
+ key_down();
return track;
}
@@ -121,23 +127,25 @@ void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) {
void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t)
{
t->active = false;
- t->audioLayer = -1;
- t->bus1 = 80;
- t->bus2 = 80;
+ t->audioLayer = 0;
+ t->bus1 = 100;
+ t->bus2 = 100;
t->entryPoint = 0;
t->exitPoint = 255;
- t->fadeIn = 3;
- t->fadeOut = 3;
+ t->fadeIn = 2;
+ t->fadeOut = 2;
t->waitIn = 0;
t->waitOut = 0;
t->pan = 0;
t->pitch = 1;
t->status = Status::PlayingOnce;
+ lastUserCueNumber += 10;
t->userNumber = lastUserCueNumber;
- lastUserCueNumber++;
t->volume = 80;
t->stopAtEnd = true;
t->filePath = "";
+ t->duration = 0;
+ t->multi = false;
}
void CueTrackListWidget::createNewCueTrack()
@@ -155,7 +163,7 @@ void CueTrackListWidget::createNewCueTrack()
} else
redrawCueTrackList();
if (lastUserCueNumber < t->userNumber)
- lastUserCueNumber = t->userNumber + 10;
+ lastUserCueNumber = t->userNumber;
} else
delete (t);
}
@@ -170,7 +178,7 @@ void CueTrackListWidget::editCueTrack()
emit changeSelectedIndex(selectedIndex);
}
if (lastUserCueNumber < current->userNumber)
- lastUserCueNumber = current->userNumber + 10;
+ lastUserCueNumber = current->userNumber;
}
void CueTrackListWidget::deleteCueTrack()
@@ -205,6 +213,8 @@ void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst)
dst->name = src->name;
dst->description = src->description;
dst->filePath = src->filePath;
+ dst->duration = src->duration;
+ dst->multi = src->multi;
}
QString *CueTrackListWidget::getFileName(std::string s)
@@ -251,11 +261,6 @@ void CueTrackListWidget::redrawCueTrackList()
emit changeSelectedIndex(selectedIndex);
}
-#include
-#include
-#include
-#include
-
void CueTrackListWidget::loadCueTrackList(std::string filename)
{
QFile file(QString::fromStdString(filename));
@@ -266,6 +271,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
}
QXmlStreamReader xmlReader(&file);
clearCueTrackList();
+ lastUserCueNumber = 0;
while (!xmlReader.atEnd() && !xmlReader.hasError())
{
QXmlStreamReader::TokenType token = xmlReader.readNext();
@@ -318,7 +324,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
}
else if (elementName == "stopAtEnd") {
QString tmp = xmlReader.text().toString().toLower();
- if (tmp.compare("true"))
+ if (tmp.compare("false"))
t->stopAtEnd = true;
else {
t->stopAtEnd = false;
@@ -332,6 +338,10 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
}
else if (elementName == "userNumber") {
t->userNumber = xmlReader.text().toInt();
+ if (t->userNumber > lastUserCueNumber)
+ {
+ lastUserCueNumber = t->userNumber;
+ }
}
else if (elementName == "entryPoint") {
t->entryPoint = xmlReader.text().toInt();
@@ -342,6 +352,17 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
else if (elementName == "audioLayer") {
t->audioLayer = xmlReader.text().toInt();
}
+ else if (elementName == "duration") {
+ t->duration = xmlReader.text().toInt();
+ }
+ else if (elementName == "multi") {
+ QString tmp = xmlReader.text().toString().toLower();
+ if (tmp.compare("false"))
+ t->multi = true;
+ else {
+ t->multi = false;
+ }
+ }
t->active = false;
}
}
@@ -359,9 +380,6 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
redrawCueTrackList();
}
-#include
-#include
-
void CueTrackListWidget::saveCueTrackList(std::string filename)
{
std::ofstream file(filename);
@@ -404,7 +422,11 @@ std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack)
xml += " " + std::to_string(cueTrack.entryPoint) + "\n";
xml += " " + std::to_string(cueTrack.exitPoint) + "\n";
xml += " " + std::to_string(cueTrack.audioLayer) + "\n";
- xml += " \n";
+ xml += " " + std::to_string(cueTrack.duration) + "\n";
+ xml += " ";
+ xml += (cueTrack.multi ? "true" : "false");
+ xml += "\n";
+ xml += " \n";
return xml;
}
@@ -514,6 +536,8 @@ CueTrack loadCueTrackFromXml(const QString& filename) {
cueTrack.exitPoint = xmlReader.readElementText().toInt();
} else if (elementName == "audioLayer") {
cueTrack.audioLayer = xmlReader.readElementText().toInt();
+ } else if (elementName == "duration") {
+ cueTrack.duration = xmlReader.readElementText().toInt();
}
}
}
@@ -546,3 +570,26 @@ void CueTrackListWidget::cueTrackAtEnd(int layer)
}
redrawCueTrackList();
}
+
+void CueTrackListWidget::copyCueTrack() {
+ if (selectedIndex >= 0 && selectedIndex < m_size) {
+ delete copiedCue;
+ copiedCue = new CueTrack(*cueTracks.at(selectedIndex));
+ }
+}
+
+void CueTrackListWidget::cutCueTrack() {
+ if (selectedIndex >= 0 && selectedIndex < m_size) {
+ delete copiedCue;
+ copiedCue = new CueTrack(*cueTracks.at(selectedIndex));
+ removeCueTrack(selectedIndex);
+ }
+}
+
+void CueTrackListWidget::pasteCueTrack() {
+ if (copiedCue != nullptr) {
+ CueTrack* newCue = new CueTrack(*copiedCue);
+ addCueTrack(newCue);
+ }
+}
+
diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h
index b8e2527..518b4ef 100644
--- a/src/cuetracklistwidget.h
+++ b/src/cuetracklistwidget.h
@@ -19,7 +19,7 @@ public:
explicit CueTrackListWidget(QWidget *parent = nullptr);
public slots:
- CueTrack* getSelectedTrack();
+ CueTrack* getSelectedTrack(bool advance);
void createNewCueTrack();
void editCueTrack();
void deleteCueTrack();
@@ -42,6 +42,7 @@ private:
int size() { return m_size; }
int selectedIndex = 0;
int lastUserCueNumber = 0;
+ CueTrack* copiedCue = nullptr;
private slots:
void addCueTrack(CueTrack* cue);
@@ -56,9 +57,12 @@ private slots:
void sortCueTrackList();
void clearTableWidget();
std::string cueTrackToXml(const CueTrack& cueTrack);
-
+ void copyCueTrack();
+ void pasteCueTrack();
+ void cutCueTrack();
signals:
void changeSelectedIndex(int index);
+ void goAction(int channel);
};
#endif
diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp
index 659a7fe..f747a36 100644
--- a/src/cuetrackwidget.cpp
+++ b/src/cuetrackwidget.cpp
@@ -1,14 +1,107 @@
+#include
+
#include "cuetrackwidget.h"
#include "ui_cuetrackwidget.h"
-CuetrackWidget::CuetrackWidget(QWidget *parent) :
+CueTrackWidget::CueTrackWidget(QWidget *parent) :
QWidget(parent),
- ui(new Ui::CuetrackWidget)
+ ui(new Ui::CueTrackWidget)
{
ui->setupUi(this);
+ tlFade.setFrameRange(0, 100);
+ tlWaitIn.setFrameRange(0, 100);
+ tlWaitOut.setFrameRange(0, 100);
+ connect(&tlFade, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue);
+ connect(&tlWaitIn, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue);
+ connect(&tlWaitOut, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue);
+ connect(&tlFade, SIGNAL(finished()), this, SLOT(fadeSlot()));
+ connect(&tlWaitIn, SIGNAL(finished()), this, SLOT(waitInSlot()));
+ connect(&tlWaitOut, SIGNAL(finished()), this, SLOT(waitOutSlot()));
}
-CuetrackWidget::~CuetrackWidget()
+
+CueTrackWidget::~CueTrackWidget()
{
delete ui;
}
+
+void CueTrackWidget::loadCueTrack(CueTrack* track)
+{
+ ui->cueName->setText(track->name.data());
+ ui->cueNumber->display(track->userNumber);
+ ui->vol->display(track->volume);
+ ui->pan->display(track->pan);
+ ui->pitch->display(track->pitch);
+ ui->bus1->display(track->bus1);
+ ui->bus2->display(track->bus2);
+ ui->fade->setValue(track->fadeOut);
+ ui->waitIn->setValue(track->waitIn);
+ ui->waitOut->setValue(track->waitOut);
+ ui->halt->setChecked(track->stopAtEnd);
+ QFileInfo fileInfo(track->filePath.data());
+ fileInfo.fileName().truncate(64);
+ ui->mediaFileName->setText(fileInfo.fileName());
+ ui->mediaEndTimeEdit->setTime(QTime::fromMSecsSinceStartOfDay(track->duration));
+ ui->status->setText(statusToString(track->status));
+ ui->audioLayer->display(track->audioLayer);
+ ui->multi->setChecked(track->multi);
+}
+
+void CueTrackWidget::go()
+{
+ tlFade.stop();
+ tlWaitIn.stop();
+ tlWaitOut.stop();
+ ui->cueProgressBar->setValue(0);
+ if (ui->waitIn->value() > 0)
+ {
+ tlWaitIn.setDuration(ui->waitIn->value() * 1000);
+ tlWaitIn.start();
+ ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }");
+ } else {
+ waitInSlot();
+ }
+}
+
+void CueTrackWidget::waitInSlot()
+{
+ emit goAction(ui->audioLayer->intValue());
+ tlFade.setDuration(ui->fade->value() * 1000);
+ tlFade.start();
+ ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #00FF00; }");
+}
+
+void CueTrackWidget::fadeSlot()
+{
+ if (ui->waitOut->value() > 0) {
+ tlWaitOut.setDuration(ui->waitOut->value() * 1000);
+ tlWaitOut.start();
+ ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }");
+ } else {
+ waitOutSlot();
+ }
+}
+
+void CueTrackWidget::waitOutSlot()
+{
+ ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #0000FF; }");
+ emit cueFinished(ui->audioLayer->intValue());
+}
+
+void CueTrackWidget::refreshCurrentTime(int time)
+{
+ QTime t;
+ t.fromMSecsSinceStartOfDay(time);
+ ui->mediaCurrentTimeEdit->setTime(t);
+ ui->mediaProgressBar->setValue(time);
+}
+
+void CueTrackWidget::setNextCue()
+{
+ ui->cueProgressBar->setDisabled(true);
+ ui->cueProgressBar->hide();
+ ui->mediaProgressBar->setDisabled(true);
+ ui->mediaProgressBar->hide();
+ ui->mediaCurrentTimeEdit->setDisabled(true);
+ ui->mediaCurrentTimeEdit->hide();
+}
diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h
index d28f076..453c0b8 100644
--- a/src/cuetrackwidget.h
+++ b/src/cuetrackwidget.h
@@ -2,22 +2,43 @@
#define CUETRACKWIDGET_H
#include
-#include
+#include
+
+#include "defines.h"
+#include "dialgroup.h"
namespace Ui {
-class CuetrackWidget;
+class CueTrackWidget;
}
-class CuetrackWidget : public QWidget
+class CueTrackWidget : public QWidget
{
Q_OBJECT
public:
- explicit CuetrackWidget(QWidget *parent = nullptr);
- ~CuetrackWidget();
+ explicit CueTrackWidget(QWidget *parent = nullptr);
+ ~CueTrackWidget();
private:
- Ui::CuetrackWidget *ui;
+ Ui::CueTrackWidget *ui;
+ QTimeLine tlFade;
+ QTimeLine tlWaitIn;
+ QTimeLine tlWaitOut;
+
+public slots:
+ void loadCueTrack(CueTrack* track);
+ void go();
+ void setNextCue();
+
+private slots:
+ void refreshCurrentTime(int time);
+ void fadeSlot();
+ void waitInSlot();
+ void waitOutSlot();
+
+signals:
+ void cueFinished(int layer);
+ void goAction(int layer);
};
#endif // CUETRACKWIDGET_H
diff --git a/src/cuetrackwidget.ui b/src/cuetrackwidget.ui
index 8915532..001d56e 100644
--- a/src/cuetrackwidget.ui
+++ b/src/cuetrackwidget.ui
@@ -1,157 +1,825 @@
- CuetrackWidget
-
+ CueTrackWidget
+
0
0
- 640
- 193
+ 502
+ 329
-
- Form
+
+
+ 0
+ 0
+
-
-
-
- 10
- 40
- 238
- 85
-
+
+
+ 0
+ 0
+
+
+
+ Qt::ClickFocus
+
+
+ Cue Track
+
+
+
+ :/buttons/resources/icon.png:/buttons/resources/icon.png
+
+
+
+ 0
-
-
+
+ 0
-
- -
-
-
- Fade time in seconds
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ QFrame::StyledPanel
+
+
+ Qt::Vertical
+
+
+ false
+
+
+ 8
+
+
+
+
+ 0
+ 0
+
-
- Fade In
+
+
+ 0
+ 0
+
-
- Fade In Time in seconds
-
-
- true
-
-
- QAbstractSpinBox::PlusMinus
-
-
-
-
-
- false
-
-
-
-
-
-
-
-
- 99990000.000000000000000
-
-
- QAbstractSpinBox::AdaptiveDecimalStepType
+
+ Qt::Horizontal
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+ Cue Progress
+
+
+ Cue Progress
+
+
+ 24
+
+
+
+
+
+ 1
+ 0
+
+
+
+
+ 48
+ 48
+
+
+
+
+ 14
+ 75
+ true
+
+
+
+ Cue Number
+
+
+ Cue Number
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Plain
+
+
+ 1
+
+
+ false
+
+
+ 4
+
+
+ QLCDNumber::Flat
+
+
+
+
+
+ 2
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 13
+ 75
+ true
+
+
+
+ Cue Name
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Plain
+
+
+ Cue Name
+
+
+ Qt::PlainText
+
+
+ true
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ true
+
+
+ 3
+
+
-
- -
-
-
- CheckBox
+
+
+
+ 0
+ 0
+
+
+ Qt::Horizontal
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 100
+ 0
+
+
+
+ Cue Progress
+
+
+ Media Progress
+
+
+ 24
+
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Media current time
+
+
+ true
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Media Edn Time
+
+
+ true
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+
+
+ 7
+ 0
+
+
+
+ Media FIle Name
+
+
+ QFrame::StyledPanel
+
+
+ Media file name
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ true
+
+
+ 3
+
+
-
- -
-
-
- -
-
-
-
-
-
-
-
- 260
- 40
- 341
- 121
-
-
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
-
-
- 0
- 10
- 631
- 25
-
-
-
- Qt::Horizontal
-
-
-
-
- 0
- 0
-
-
-
-
- 100
- 0
-
-
-
- 24
-
-
-
-
-
- 100
- 0
-
-
-
-
-
-
- 400
- 0
-
-
-
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ Qt::Horizontal
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+
+
+
+
+ QLayout::SetDefaultConstraint
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Wait in time in seconds
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Wait out time in secods
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Fade time in seconds
+
+
+ Fade In
+
+
+ Fade In Time in seconds
+
+
+ true
+
+
+ true
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+ 99990000.000000000000000
+
+
+ QAbstractSpinBox::AdaptiveDecimalStepType
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Exit Point
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 13
+
+
+
+ Playback Status
+
+
+ QFrame::StyledPanel
+
+
+ Playback Status
+
+
+ Qt::PlainText
+
+
+ true
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::NoFocus
+
+
+ Entry Point
+
+
+ QAbstractSpinBox::NoButtons
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 24
+
+
+
+ Audio Channel
+
+
+ false
+
+
+ 1
+
+
+ QLCDNumber::Flat
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 24
+ 0
+
+
+
+
+ 13
+ 75
+ true
+
+
+
+ Qt::NoFocus
+
+
+ Do not play next cue if checked
+
+
+ If checked, do not play next cue. If checked, Go next cue when this cue has finished.
+
+
+ Halt
+
+
+ true
+
+
+ Halt
+
+
+
+ :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png
+
+
+
+ 32
+ 32
+
+
+
+ true
+
+
+
+
+
+
+
+
+ QLayout::SetDefaultConstraint
+
+
+ 0
+
+ -
+
+
+ 3
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 10
+
+
+
+ Bus 1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 3
+
+
+ QLCDNumber::Flat
+
+
+
+ -
+
+
+
+ 10
+
+
+
+ Volume
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 10
+
+
+
+ Bus 2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ <html><head/><body><p>Volume</p></body></html>
+
+
+ 3
+
+
+
+ -
+
+
+ <html><head/><body><p>Bus 2 Volume</p></body></html>
+
+
+ 3
+
+
+
+ -
+
+
+ <html><head/><body><p>Bus 1 Volume</p></body></html>
+
+
+ 3
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 10
+
+
+
+ Pan
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 10
+
+
+
+ Pitch
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 50
+ false
+ true
+
+
+
+ <html><head/><body><p>PLay next cue at same time this cue, do not wait to finish the cue.</p></body></html>
+
+
+ Qt::RightToLeft
+
+
+
+
+
+
+ :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+ 10
+
+
+
+ MultiCue
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+
+
-
+
+ mediaCurrentTimeEdit
+ waitOut
+ waitIn
+ entryPoint
+ exitPoint
+ fade
+ mediaEndTimeEdit
+
+
+
+
diff --git a/src/defines.h b/src/defines.h
index e59f28f..f6a083c 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -113,7 +113,9 @@ struct CueTrack {
int entryPoint; // 0 - 255
int exitPoint; // 0 - 255
int audioLayer; // internal audio layer used when cue is loaded
- bool active;
+ bool active; // the cue is playing
+ int duration; // media duration in milliseconds
+ bool multi; // launch next cue at same time, not waiting for this to finish.
};
#endif // __cplusplus
diff --git a/src/dialgroup.cpp b/src/dialgroup.cpp
index b5bf768..ef29b88 100644
--- a/src/dialgroup.cpp
+++ b/src/dialgroup.cpp
@@ -1,7 +1,7 @@
-#include "dialgroup.h"
#include
#include
#include
+#include "dialgroup.h"
DialGroup::DialGroup(QString name,
int min,
@@ -10,18 +10,18 @@ DialGroup::DialGroup(QString name,
QWidget *parent)
: QWidget(parent)
{
- layout = new QVBoxLayout;
+ QVBoxLayout *layout = new QVBoxLayout;
layout->setAlignment(Qt::AlignHCenter);
layout->setContentsMargins(0, 0, 0, 0);
- slider.setFocusPolicy(Qt::StrongFocus);
- slider.setTickPosition(QSlider::TicksBothSides);
- slider.setTickInterval((max - min) / 11);
+ slider.setFocusPolicy(Qt::NoFocus);
+ slider.setRange(min, max);
+ slider.setValue(min + max / 2);
+ slider.setToolTip(name);
+ slider.setContentsMargins(0, 0, 0, 0);
+/*
slider.setMinimumHeight(0);
slider.setSingleStep(1);
- slider.setRange(min, max);
- slider.setValue(0);
slider.setMinimumWidth(50);
- slider.setToolTip(name);
slider.setStyleSheet("QDial {"
"border: 1px solid #aa8895;"
"background: #20182d;"
@@ -33,62 +33,35 @@ DialGroup::DialGroup(QString name,
"background-color: black;"
"background: red;"
"color: white;}"
- slider.setContentsMargins(0, 0, 0, 0);
+*/
valueBox.setFocusPolicy(Qt::NoFocus);
valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons);
valueBox.setMinimumWidth(50);
- if (decimals) {
- valueBox.setRange(-84.0f, 0.0f);
- valueBox.setSpecialValueText("-inf");
- } else
- valueBox.setRange(min, max);
+ valueBox.setRange(min, max);
valueBox.setValue(0);
valueBox.setDecimals(decimals);
valueBox.setObjectName(name);
valueBox.setToolTip(name);
valueBox.setAlignment(Qt::AlignHCenter);
valueBox.setContentsMargins(0, 0, 0, 0);
- connect(&slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int)));
layout->addWidget(&slider);
layout->addWidget(&valueBox);
- this->setStyleSheet("border: 1px solid #aa8895;"
+/* this->setStyleSheet("border: 1px solid #998090;"
"background-color: black;"
"margin: 1px;"
- );
+ );*/
layout->setSpacing(0);
layout->setContentsMargins(0, 0, 0, 0);
this->setLayout(layout);
+ slider.setObjectName(name);
}
-void SliderGroup::sliderValueChanged(int value)
+void DialGroup::setValue(float value)
{
- valueBox.blockSignals(true);
- if (valueBox.decimals()) {
- float db = ((float)value / 771.0f) - 85.0f;
- if (db <= -84.5f) {
- valueBox.setSpecialValueText("-inf");
- } else
- valueBox.setValue(db);
- } else {
- valueBox.setValue(value);
- }
- valueBox.blockSignals(false);
- emit valueChanged(value);
-};
-
-void SliderGroup::setValue(float value)
-{
- float db;
-
slider.blockSignals(true);
valueBox.blockSignals(true);
- if (int(value) != slider.value())
- slider.setValue(value);
- if (valueBox.decimals()) {
- db = (float)(value / 771.0f) - 85.0f;
- valueBox.setValue(db);
- } else
- valueBox.setValue(value);
+ slider.setValue(value);
+ valueBox.setValue(value);
slider.blockSignals(false);
valueBox.blockSignals(false);
}
diff --git a/src/dialgroup.h b/src/dialgroup.h
index 3866c1c..d795821 100644
--- a/src/dialgroup.h
+++ b/src/dialgroup.h
@@ -1,5 +1,5 @@
-#ifndef SLIDERGROUP_H
-#define SLIDERGROUP_H
+#ifndef DIALGROUP_H
+#define DIALGROUP_H
#include
#include
@@ -12,18 +12,14 @@ class DialGroup : public QWidget
{
Q_OBJECT
public:
- DialGroup(QString name,
+ explicit DialGroup(QString name,
int min,
int max,
int decimals,
QWidget *parent = nullptr);
-signals:
- void valueChanged(int value);
-
public slots:
void setValue(float value);
- void sliderValueChanged(int value);
private:
QDial slider;
diff --git a/src/editcuetrackwidget.cpp b/src/editcuetrackwidget.cpp
index f0f6046..cb38701 100644
--- a/src/editcuetrackwidget.cpp
+++ b/src/editcuetrackwidget.cpp
@@ -58,6 +58,8 @@ void EditCueTrackWidget::setupUi() {
layout->addRow("Entry Point", entryPointSpin);
exitPointSpin = new QSpinBox(this);
layout->addRow("Exit Point", exitPointSpin);
+ multiCheck = new QCheckBox(this);
+ layout->addRow("Multi Cue", multiCheck);
statusCombo->addItem(statusToString(Status::Stopped));
statusCombo->addItem(statusToString(Status::Paused));
statusCombo->addItem(statusToString(Status::PlayingOnce));
@@ -92,6 +94,7 @@ void EditCueTrackWidget::loadCueTrack(CueTrack cueTrack) {
audioLayerSpin->setValue(cueTrack.audioLayer);
QString tmp = statusToString(cueTrack.status);
statusCombo->setCurrentIndex(statusCombo->findText(tmp));
+ multiCheck->setChecked(cueTrack.multi);
}
CueTrack EditCueTrackWidget::saveCueTrack() {
@@ -114,6 +117,7 @@ CueTrack EditCueTrackWidget::saveCueTrack() {
cueTrack.pan = panSpin->value();
cueTrack.pitch = pitchSpin->value();
cueTrack.description.append(descriptionEdit->text().toUtf8().constData());
+ cueTrack.multi = multiCheck->isChecked();
return cueTrack;
}
diff --git a/src/editcuetrackwidget.h b/src/editcuetrackwidget.h
index 080561e..8afb0d1 100644
--- a/src/editcuetrackwidget.h
+++ b/src/editcuetrackwidget.h
@@ -46,6 +46,7 @@ private:
QSpinBox *exitPointSpin;
QComboBox *statusCombo;
QSpinBox *audioLayerSpin;
+ QCheckBox *multiCheck;
QPushButton *browseButton;
QPushButton *saveButton;
QPushButton *cancelButton;
diff --git a/src/libremediaserver-audio-ui.cpp b/src/libremediaserver-audio-ui.cpp
index 0227f16..e1f8533 100644
--- a/src/libremediaserver-audio-ui.cpp
+++ b/src/libremediaserver-audio-ui.cpp
@@ -60,6 +60,6 @@ void libreMediaServerAudioUi::olasetup()
void libreMediaServerAudioUi::launchShowPlayerWindow()
{
- qDebug() << "launch show player";
+ //m_showPlayer->showMaximized();
m_showPlayer->show();
}
diff --git a/src/libremediaserver-audio-ui.ui b/src/libremediaserver-audio-ui.ui
index 2f1feae..7de7324 100644
--- a/src/libremediaserver-audio-ui.ui
+++ b/src/libremediaserver-audio-ui.ui
@@ -7,8 +7,8 @@
0
0
- 400
- 400
+ 640
+ 800
@@ -23,8 +23,8 @@
LibreMediaServer
-
- ../../../../criptomart/artwork/logo_v2_criptomart.net.png../../../../criptomart/artwork/logo_v2_criptomart.net.png
+
+ :/buttons/resources/icon.png:/buttons/resources/icon.png
-
+
+
+
diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp
index b28219f..a440561 100644
--- a/src/libremediaserver-audio.cpp
+++ b/src/libremediaserver-audio.cpp
@@ -170,7 +170,7 @@ void libreMediaServerAudio::refreshUi() {
}
m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i));
if (m_mae.getAtEnd(i)) {
- if (m_currentStatus[i] == Status::PlayingOnce) {
+ if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) {
m_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
m_lmsUi->m_showPlayer->cueTrackAtEnd(i);
@@ -246,8 +246,8 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value)
{
switch (s){
case Slider::Volume:
- //m_mae.volChanged(layer, value);
- //m_updateUi[layer][0] = value;
+ m_mae.volChanged(layer, value);
+ m_updateUi[layer][0] = value;
break;
case Slider::Pan:
m_mae.panChanged(layer, value);
diff --git a/src/showplayer.cpp b/src/showplayer.cpp
index 4d3998e..3b1edd6 100644
--- a/src/showplayer.cpp
+++ b/src/showplayer.cpp
@@ -12,11 +12,11 @@ ShowPlayer::ShowPlayer(QWidget *parent) :
connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList()));
connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList()));
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
- filesLoaded = 0;
currentStatus = Status::Iddle;
- for(int i = 0; i < MAX_LAYERS; i++)
+ for(int i = 0; i < MAX_LAYERS; i++) {
layersUsed[i] = -1;
- connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(changeSelectedIndex(int)));
+ cueTrackWidgetPlaying[i] = nullptr;
+ }
}
ShowPlayer::~ShowPlayer() {}
@@ -27,32 +27,36 @@ void ShowPlayer::onAddTrack() {
void ShowPlayer::go()
{
- ui->activeCueNumber->display(lastIndex);
- CueTrack* current = ui->cueListWidget->getSelectedTrack();
- if (!current)
+ CueTrack *goCue = ui->cueListWidget->getSelectedTrack(true);
+ if (!goCue)
return;
- if (current->audioLayer < 0)
- return;
- ui->activeCueLabel->setText(current->name.data());
- if (!current->filePath.empty())
- emit uiLoadMedia(current->audioLayer, current->filePath.data());
- updateTrackStateInEngine(current);
- emit uiPlaybackChanged(current->audioLayer, current->status);
- ui->cueListWidget->cueTrackAtEnd(current->audioLayer);
- switch (current->status) {
+ current[goCue->audioLayer] = goCue;
+ playCueTrack(goCue);
+ if (goCue->multi)
+ go();
+}
+
+void ShowPlayer::goAction(int c)
+{
+ if (!current[c]->filePath.empty()) {
+ emit uiLoadMedia(current[c]->audioLayer, current[c]->filePath.data());
+ ui->cueListWidget->cueTrackAtEnd(c);
+ }
+ updateTrackStateInEngine(current[c]);
+ emit uiPlaybackChanged(current[c]->audioLayer, current[c]->status);
+ switch (current[c]->status) {
case Status::PlayingOnce:
case Status::PlayingLoop:
case Status::PlayingFolder:
case Status::PlayingFolderLoop:
case Status::PlayingFolderRandom:
- current->active = true;
- layersUsed[current->audioLayer] = current->userNumber;
+ current[c]->active = true;
+ layersUsed[current[c]->audioLayer] = current[c]->userNumber;
break;
default:
- current->active = false;
+ current[c]->active = false;
}
ui->cueListWidget->redrawCueTrackList();
- filesLoaded++;
}
void ShowPlayer::updateTrackStateInEngine(CueTrack *track) {
@@ -63,20 +67,12 @@ void ShowPlayer::updateTrackStateInEngine(CueTrack *track) {
emit uiSliderChanged(track->audioLayer, Slider::Bus2, track->bus2 * 255 * 2.55);
}
-void ShowPlayer::changeSelectedIndex(int i)
-{
- CueTrack *t = ui->cueListWidget->getTrackAtIndex(i);
- ui->nextCueNumber->display(t->userNumber);
- ui->nextCueLabel->setText(t->name.data());
- lastIndex = t->userNumber;
-}
-
void ShowPlayer::loadCueTrackList()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("XML Files (*.xml)"));
if (fileName.isEmpty())
return;
- ui->cueListWidget->loadCueTrackList(fileName.toStdString());
+ ui->cueListWidget->loadCueTrackList(fileName.toStdString());
}
void ShowPlayer::saveCueTrackList()
@@ -89,5 +85,48 @@ void ShowPlayer::saveCueTrackList()
void ShowPlayer::cueTrackAtEnd(int layer)
{
+ current[layer]->active = false;
ui->cueListWidget->cueTrackAtEnd(layer);
+ removeCueTrackWidget(layer);
+}
+
+void ShowPlayer::cueFinished(int c)
+{
+ if (current[c] && !current[c]->stopAtEnd)
+ this->go();
+}
+
+CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) {
+ QListWidgetItem* item = new QListWidgetItem(ui->activeCueList);
+ CueTrackWidget* widget = new CueTrackWidget();
+ widget->loadCueTrack(track);
+ connect(widget, SIGNAL(goAction(int)), this, SLOT(goAction(int)));
+ connect(widget, SIGNAL(cueFinished(int)), this, SLOT(cueFinished(int)));
+ cueTrackWidgetPlaying[track->audioLayer] = widget;
+ item->setSizeHint(widget->sizeHint());
+ ui->activeCueList->setItemWidget(item, widget);
+ return (widget);
+}
+
+void ShowPlayer::playCueTrack(CueTrack* track) {
+ removeCueTrackWidget(track->audioLayer);
+ CueTrackWidget *widget = addCueTrackWidget(track);
+ widget->go();
+}
+
+void ShowPlayer::removeCueTrackWidget(int audioLayer) {
+ CueTrackWidget* widgetToRemove = cueTrackWidgetPlaying[audioLayer];
+ if (widgetToRemove != NULL && ui->activeCueList->count() > 0) {
+ for (int i = 0; i < ui->activeCueList->count(); ++i) {
+ QListWidgetItem* item = ui->activeCueList->item(i);
+ QWidget* widget = ui->activeCueList->itemWidget(item);
+ if (widget == widgetToRemove) {
+ ui->activeCueList->removeItemWidget(item);
+ delete item;
+ delete widgetToRemove;
+ break;
+ }
+ }
+ cueTrackWidgetPlaying[audioLayer] = nullptr;
+ }
}
diff --git a/src/showplayer.h b/src/showplayer.h
index 0dd4f08..07a05fa 100644
--- a/src/showplayer.h
+++ b/src/showplayer.h
@@ -9,6 +9,8 @@
#include "defines.h"
#include "cuetracklistwidget.h"
+#include "cuetrackwidget.h"
+#include "dialgroup.h"
#include "settings.h"
#include "ui_showplayer.h"
@@ -30,17 +32,21 @@ public slots:
private:
Ui::ShowPlayer *ui;
Status currentStatus = Status::Iddle;
- size_t filesLoaded = 0;
int layersUsed[MAX_LAYERS];
- int lastIndex = 0;
+ CueTrack *current[MAX_LAYERS];
+ CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS];
+ CueTrackWidget *addCueTrackWidget(CueTrack *track);
private slots:
void updateTrackStateInEngine(CueTrack *track);
void onAddTrack();
void go();
- void changeSelectedIndex(int i);
void loadCueTrackList();
void saveCueTrackList();
+ void cueFinished(int channel);
+ void removeCueTrackWidget(int index);
+ void playCueTrack(CueTrack *track);
+ void goAction(int channel);
signals:
void uiPlaybackChanged(int layer, Status s);
diff --git a/src/showplayer.ui b/src/showplayer.ui
index 6b07d30..b246be4 100644
--- a/src/showplayer.ui
+++ b/src/showplayer.ui
@@ -6,8 +6,8 @@
0
0
- 743
- 671
+ 800
+ 802
@@ -19,117 +19,30 @@
Show Player
+
+
+ :/buttons/resources/icon.png:/buttons/resources/icon.png
+
+
+ true
+
+
+ false
+
+
+ false
+
-
-
-
-
- 0
- 0
-
-
-
-
- 400
- 400
-
-
+
- QFrame::StyledPanel
-
-
- QFrame::Sunken
+ QFrame::Box
Qt::Vertical
-
- 8
-
-
-
- QFrame::Box
-
-
- QFrame::Raised
-
-
- Qt::Horizontal
-
-
- 8
-
-
-
-
- 0
- 0
-
-
-
- Qt::ClickFocus
-
-
- GO
-
-
- Space
-
-
-
-
-
- QLayout::SetMinimumSize
-
-
- 0
-
-
-
-
-
- -
-
-
- Active Cue
-
-
-
- -
-
-
- true
-
-
-
- -
-
-
- Next Cue
-
-
-
-
-
-
-
-
- 0
- 0
-
-
-
- Qt::ClickFocus
-
-
- ...
-
-
- P
-
-
-
-
+
0
@@ -137,10 +50,10 @@
QLayout::SetDefaultConstraint
- 100
+ 0
- 100
+ 0
-
@@ -328,25 +241,109 @@
-
-
- true
+
+
+ QFrame::StyledPanel
-
-
- 0
- 0
-
+
+ QFrame::Plain
-
- Qt::StrongFocus
+
+ Qt::Horizontal
-
- true
+
+ 8
-
- Qt::ImhPreferLowercase
+
+
+
+ 0
+ 0
+
+
+
+ Qt::ClickFocus
+
+
+
+
+
+
+ :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg
+
+
+
+ 120
+ 120
+
+
+
+ Space
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::ClickFocus
+
+
+ ...
+
+
+
+ :/buttons/resources/panic_button.jpg:/buttons/resources/panic_button.jpg
+
+
+
+ 96
+ 120
+
+
+
+ P
+
+
+
+
+
+ Qt::Horizontal
+
+
+ <html><head/><body><p>Cue List</p></body></html>
+
+
+
+
+
+ 0
+ 0
+
+
+
+ <html><head/><body><p>Cues active</p></body></html>
+
+
+ QFrame::Plain
+
+
+ QListView::Adjust
+
+
+ QListView::SinglePass
+
+
@@ -361,7 +358,6 @@
- cueListWidget
NewCue
EditCue
RemoveCue