diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro
index db78795..48f0af8 100644
--- a/libremediaserver-audio.pro
+++ b/libremediaserver-audio.pro
@@ -2,6 +2,7 @@ TEMPLATE = app
TARGET = libremediaserver-audio
QT += webkitwidgets widgets
HEADERS += src/libremediaserver-audio.h \
+ src/cuetrackwidget.h \
src/editcuetrackwidget.h \
src/cuetracklistwidget.h \
src/showplayer.h \
@@ -23,8 +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 \
+ src/cuetrackwidget.cpp \
src/editcuetrackwidget.cpp \
src/cuetracklistwidget.cpp \
src/showplayer.cpp \
@@ -43,8 +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 += \
+ src/cuetrackwidget.ui \
src/showplayer.ui \
src/libremediaserver-audio-ui.ui
CCFLAG += -msse2 -mavx2
@@ -58,3 +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
new file mode 100644
index 0000000..21a0629
--- /dev/null
+++ b/lms-resources.qrc
@@ -0,0 +1,15 @@
+
+
+ resources/copy_button.png
+ resources/cut_button.png
+ resources/delete_button.png
+ resources/edit_button.png
+ resources/load_button.png
+ 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/resources/copy_button.png b/resources/copy_button.png
new file mode 100644
index 0000000..27fdef5
Binary files /dev/null and b/resources/copy_button.png differ
diff --git a/resources/cut_button.png b/resources/cut_button.png
new file mode 100644
index 0000000..4977b23
Binary files /dev/null and b/resources/cut_button.png differ
diff --git a/resources/delete_button.png b/resources/delete_button.png
new file mode 100644
index 0000000..0d44443
Binary files /dev/null and b/resources/delete_button.png differ
diff --git a/resources/edit_button.png b/resources/edit_button.png
new file mode 100644
index 0000000..37c3a34
Binary files /dev/null and b/resources/edit_button.png differ
diff --git a/resources/load_button.png b/resources/load_button.png
new file mode 100644
index 0000000..d0d1d3c
Binary files /dev/null and b/resources/load_button.png differ
diff --git a/resources/new_button.png b/resources/new_button.png
new file mode 100644
index 0000000..3ac34f9
Binary files /dev/null and b/resources/new_button.png differ
diff --git a/resources/paste_button.png b/resources/paste_button.png
new file mode 100644
index 0000000..ef34fac
Binary files /dev/null and b/resources/paste_button.png differ
diff --git a/resources/save_button.png b/resources/save_button.png
new file mode 100644
index 0000000..78d8ae0
Binary files /dev/null and b/resources/save_button.png differ
diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp
index 4397239..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()
@@ -145,15 +153,20 @@ void CueTrackListWidget::createNewCueTrack()
CueTrack *t = new CueTrack;
cueTrackLoadDefaults(t);
EditCueTrackWidget dialog(t, this);
- if (dialog.exec() == QDialog::Accepted)
+ if (dialog.exec() == QDialog::Accepted) {
+ t->active = false;
addCueTrack(t);
- if (m_size == 1)
- {
- updateSelectedCueTrack(true);
- emit changeSelectedIndex(0);
+ if (m_size == 1)
+ {
+ updateSelectedCueTrack(true);
+ emit changeSelectedIndex(0);
+ } else
+ redrawCueTrackList();
+ if (lastUserCueNumber < t->userNumber)
+ lastUserCueNumber = t->userNumber;
} else
- redrawCueTrackList();
- }
+ delete (t);
+}
void CueTrackListWidget::editCueTrack()
{
@@ -164,6 +177,8 @@ void CueTrackListWidget::editCueTrack()
redrawCueTrackList();
emit changeSelectedIndex(selectedIndex);
}
+ if (lastUserCueNumber < current->userNumber)
+ lastUserCueNumber = current->userNumber;
}
void CueTrackListWidget::deleteCueTrack()
@@ -198,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)
@@ -223,7 +240,7 @@ void CueTrackListWidget::redrawCueTrackList()
int selected = cueTracks.at(selectedIndex)->userNumber;
clearTableWidget();
tableWidget->setColumnCount(7);
- QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"};
+ QStringList headers = {"Active", "Number","Channel", "Name", "Volume", "Status", "File"};
tableWidget->setHorizontalHeaderLabels(headers);
sortCueTrackList();
selectedIndex = 0;
@@ -241,13 +258,9 @@ void CueTrackListWidget::redrawCueTrackList()
tableWidget->resizeRowsToContents();
tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0));
tableWidget->blockSignals(false);
+ emit changeSelectedIndex(selectedIndex);
}
-#include
-#include
-#include
-#include
-
void CueTrackListWidget::loadCueTrackList(std::string filename)
{
QFile file(QString::fromStdString(filename));
@@ -258,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();
@@ -309,7 +323,12 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
t->waitOut = xmlReader.text().toInt();
}
else if (elementName == "stopAtEnd") {
- t->stopAtEnd = xmlReader.text().toString().toLower() == "true";
+ QString tmp = xmlReader.text().toString().toLower();
+ if (tmp.compare("false"))
+ t->stopAtEnd = true;
+ else {
+ t->stopAtEnd = false;
+ }
}
else if (elementName == "name") {
t->name = xmlReader.text().toString().toStdString();
@@ -319,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();
@@ -329,9 +352,18 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
else if (elementName == "audioLayer") {
t->audioLayer = xmlReader.text().toInt();
}
- else if (elementName == "active") {
- t->active = xmlReader.text().toString().toLower() == "true";
- }
+ 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;
}
}
xmlReader.readNext();
@@ -348,9 +380,6 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
redrawCueTrackList();
}
-#include
-#include
-
void CueTrackListWidget::saveCueTrackList(std::string filename)
{
std::ofstream file(filename);
@@ -393,10 +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 += " ";
- xml += (cueTrack.active ? "true" : "false");
- xml += "\n";
- xml += " \n";
+ xml += " " + std::to_string(cueTrack.duration) + "\n";
+ xml += " ";
+ xml += (cueTrack.multi ? "true" : "false");
+ xml += "\n";
+ xml += " \n";
return xml;
}
@@ -444,7 +474,6 @@ void saveCueTrackToXml(const CueTrack& cueTrack, const QString& filename) {
xmlWriter.writeTextElement("entryPoint", QString::number(cueTrack.entryPoint));
xmlWriter.writeTextElement("exitPoint", QString::number(cueTrack.exitPoint));
xmlWriter.writeTextElement("audioLayer", QString::number(cueTrack.audioLayer));
- xmlWriter.writeTextElement("active", cueTrack.active ? "true" : "false");
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
@@ -507,9 +536,9 @@ CueTrack loadCueTrackFromXml(const QString& filename) {
cueTrack.exitPoint = xmlReader.readElementText().toInt();
} else if (elementName == "audioLayer") {
cueTrack.audioLayer = xmlReader.readElementText().toInt();
- } else if (elementName == "active") {
- cueTrack.active = xmlReader.readElementText() == "true";
- }
+ } else if (elementName == "duration") {
+ cueTrack.duration = xmlReader.readElementText().toInt();
+ }
}
}
if (xmlReader.hasError()) {
@@ -528,3 +557,39 @@ void CueTrackListWidget::clearTableWidget()
tableWidget->clear();
tableWidget->setRowCount(0);
}
+
+void CueTrackListWidget::cueTrackAtEnd(int layer)
+{
+ for (int i = 0; i < m_size; i++)
+ {
+ CueTrack * cur = cueTracks.at(i);
+ if (cur->audioLayer == layer)
+ {
+ cur->active = false;
+ }
+ }
+ 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 fa7b685..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();
@@ -31,6 +31,8 @@ public slots:
void clearCueTrackList();
void setLastUserCueNumber(size_t n) { lastUserCueNumber = n; }
size_t getLastUserCueNumber() { return lastUserCueNumber; }
+ void cueTrackAtEnd(int layer);
+ void redrawCueTrackList();
private:
std::vector cueTracks;
@@ -39,7 +41,8 @@ private:
int m_size = 0;
int size() { return m_size; }
int selectedIndex = 0;
- size_t lastUserCueNumber = 0;
+ int lastUserCueNumber = 0;
+ CueTrack* copiedCue = nullptr;
private slots:
void addCueTrack(CueTrack* cue);
@@ -52,12 +55,14 @@ private slots:
void cueTrackLoadDefaults(CueTrack * t);
void copyCueTrack(CueTrack *src, CueTrack *dst);
void sortCueTrackList();
- void redrawCueTrackList();
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
new file mode 100644
index 0000000..609cf4d
--- /dev/null
+++ b/src/cuetrackwidget.cpp
@@ -0,0 +1,94 @@
+#include
+
+#include "cuetrackwidget.h"
+#include "ui_cuetrackwidget.h"
+
+CueTrackWidget::CueTrackWidget(QWidget *parent) :
+ QWidget(parent),
+ 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()
+{
+ 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->fadeIn);
+ 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->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::setNextCue()
+{
+ ui->cueProgressBar->setDisabled(true);
+ ui->cueProgressBar->hide();
+}
diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h
new file mode 100644
index 0000000..6e7bd8b
--- /dev/null
+++ b/src/cuetrackwidget.h
@@ -0,0 +1,43 @@
+#ifndef CUETRACKWIDGET_H
+#define CUETRACKWIDGET_H
+
+#include
+#include
+
+#include "defines.h"
+#include "dialgroup.h"
+
+namespace Ui {
+class CueTrackWidget;
+}
+
+class CueTrackWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit CueTrackWidget(QWidget *parent = nullptr);
+ ~CueTrackWidget();
+
+private:
+ Ui::CueTrackWidget *ui;
+ QTimeLine tlFade;
+ QTimeLine tlWaitIn;
+ QTimeLine tlWaitOut;
+
+public slots:
+ void loadCueTrack(CueTrack* track);
+ void go();
+ void setNextCue();
+
+private slots:
+ 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
new file mode 100644
index 0000000..314782b
--- /dev/null
+++ b/src/cuetrackwidget.ui
@@ -0,0 +1,780 @@
+
+
+ CueTrackWidget
+
+
+
+ 0
+ 0
+ 502
+ 329
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::ClickFocus
+
+
+ Cue Track
+
+
+
+ :/buttons/resources/icon.png:/buttons/resources/icon.png
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ QFrame::StyledPanel
+
+
+ Qt::Vertical
+
+
+ false
+
+
+ 8
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+ 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
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 24
+
+
+
+
+ 16777215
+ 24
+
+
+
+
+ 10
+
+
+
+ Media FIle Name
+
+
+ QFrame::StyledPanel
+
+
+ Media file name
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ true
+
+
+ 3
+
+
+
+
+
+
+ 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
+
+
+ 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
+
+
+
+
+
+
+
+
+
+
+
+ waitOut
+ fade
+ entryPoint
+ exitPoint
+ waitIn
+
+
+
+
+
+
diff --git a/src/defines.h b/src/defines.h
index 59375fc..f6a083c 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -65,7 +65,7 @@ constexpr const char* statusToString(Status e) noexcept
#include
static Status stringToStatus(QString *statusStr) {
- if (!statusStr->compare("Stopped")) return Stopped;
+ if (!statusStr->compare("Stop")) return Stopped;
else if (!statusStr->compare("Paused") ) return Paused;
else if (!statusStr->compare("Play 1")) return PlayingOnce;
else if (!statusStr->compare("Play Loop")) return PlayingLoop;
@@ -91,6 +91,7 @@ struct layerData {
int bus1Vol;
int bus2Vol;
float level;
+ int fade;
};
struct CueTrack {
@@ -112,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
new file mode 100644
index 0000000..ef29b88
--- /dev/null
+++ b/src/dialgroup.cpp
@@ -0,0 +1,67 @@
+#include
+#include
+#include
+#include "dialgroup.h"
+
+DialGroup::DialGroup(QString name,
+ int min,
+ int max,
+ int decimals,
+ QWidget *parent)
+ : QWidget(parent)
+{
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->setAlignment(Qt::AlignHCenter);
+ layout->setContentsMargins(0, 0, 0, 0);
+ 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.setMinimumWidth(50);
+ slider.setStyleSheet("QDial {"
+ "border: 1px solid #aa8895;"
+ "background: #20182d;"
+ "margin: 0px;}"
+ "QSlider::groove:vertical {"
+ "border: 1px solid #999999;"
+ "width: 25px;}"
+ "QDial::tickmarks:vertical {"
+ "background-color: black;"
+ "background: red;"
+ "color: white;}"
+*/
+ valueBox.setFocusPolicy(Qt::NoFocus);
+ valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons);
+ valueBox.setMinimumWidth(50);
+ 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);
+ layout->addWidget(&slider);
+ layout->addWidget(&valueBox);
+/* 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 DialGroup::setValue(float value)
+{
+ slider.blockSignals(true);
+ valueBox.blockSignals(true);
+ slider.setValue(value);
+ valueBox.setValue(value);
+ slider.blockSignals(false);
+ valueBox.blockSignals(false);
+}
diff --git a/src/dialgroup.h b/src/dialgroup.h
new file mode 100644
index 0000000..d795821
--- /dev/null
+++ b/src/dialgroup.h
@@ -0,0 +1,30 @@
+#ifndef DIALGROUP_H
+#define DIALGROUP_H
+
+#include
+#include
+#include
+#include
+
+#include "clickabledoublespinbox.h"
+
+class DialGroup : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit DialGroup(QString name,
+ int min,
+ int max,
+ int decimals,
+ QWidget *parent = nullptr);
+
+public slots:
+ void setValue(float value);
+
+private:
+ QDial slider;
+ ClickableDoubleSpinBox valueBox;
+
+};
+
+#endif
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 1a1b6eb..a440561 100644
--- a/src/libremediaserver-audio.cpp
+++ b/src/libremediaserver-audio.cpp
@@ -139,8 +139,6 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
#ifndef NOGUI
if (m_ui) {
m_lmsUi->m_aw->filterParamChanged(layer, channel, value);
- m_played.clear();
- m_played.append(m_ola->getValue(layer, DMX_FILE));
}
#endif
}
@@ -172,14 +170,16 @@ 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);
}
if (m_currentStatus[i] == Status::PlayingFolder) {
- uint last = m_played.last();
+ uint last = 0;
+ if (!m_played.isEmpty())
+ last = m_played.last() + 1;
int folder = m_ola->getValue(i, DMX_FOLDER);
- last++;
if (last < m_mediaLibrary->getMediaFolderCount(folder)) {
this->loadMedia(i, folder, last);
m_mae.playbackChanged(i, Status::PlayingFolder);
@@ -187,6 +187,7 @@ void libreMediaServerAudio::refreshUi() {
else {
m_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
+ m_lmsUi->m_showPlayer->cueTrackAtEnd(i);
}
}
else if (m_currentStatus[i] == Status::PlayingFolderLoop) {
@@ -227,7 +228,8 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
connect(m_lmsUi->m_aw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status)));
connect(m_lmsUi->m_aw, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int)));
- connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status)));
+ connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int)));
+ connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString)));
m_refreshUi = new QTimer(this);
connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi()));
@@ -298,4 +300,14 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile)
qWarning() << "ui load media error" << result << "file" << mediaFile << "layer" << layer;
}
}
+
+void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int ms)
+{
+ switch (s){
+ case Slider::Volume:
+ m_mae.volChanged(layer, value, ms);
+ m_updateUi[layer][0] = value;
+ break;
+ }
+}
#endif
diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h
index 8db0c7e..65b5d11 100644
--- a/src/libremediaserver-audio.h
+++ b/src/libremediaserver-audio.h
@@ -66,6 +66,7 @@ private:
private slots:
void refreshUi();
void uiSliderChanged(int layer, Slider s, int value);
+ void uiSliderChangedFaded(int layer, Slider s, int value, int ms);
void uiPlaybackChanged(int layer, Status s);
void uiLoadMedia(int layer, QString s);
diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp
index 0e54927..9ab9f63 100644
--- a/src/miniaudioengine.cpp
+++ b/src/miniaudioengine.cpp
@@ -434,8 +434,15 @@ ma_result MiniAudioEngine::printFormatInfo(int layer)
// Expects between 0 and 65535 vol value
void MiniAudioEngine::volChanged(int layer, int vol)
+{
+ volChanged(layer, vol, FADE_TIME);
+}
+
+// Expects between 0 and 65535 vol value and fade time in milliseconds
+void MiniAudioEngine::volChanged(int layer, int vol, int ms)
{
m_mae.currentStatus[layer].vol = vol;
+ m_mae.currentStatus[layer].fade = ms;
if (m_mae.mediaLoaded[layer] != MA_TRUE)
return;
if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated)
@@ -445,9 +452,10 @@ void MiniAudioEngine::volChanged(int layer, int vol)
db = 0;
} else
db = ma_volume_db_to_linear(db);
- ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, FADE_TIME);
+ ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, ms);
}
+
void MiniAudioEngine::panChanged(int layer, float value)
{
float result;
@@ -507,7 +515,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status)
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0.000001f, 0.000000f, FADE_TIME);
if (m_mae.currentStatus[layer].cursor > 0)
usleep(FADE_TIME * 1500); // avoid glitch when seeking
- ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, FADE_TIME * 2);
+ ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fade);
default:
break;
}
diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h
index 5fde13e..0a1bca8 100644
--- a/src/miniaudioengine.h
+++ b/src/miniaudioengine.h
@@ -64,6 +64,7 @@ public:
bool startEngine(uint layersQty, uint* audioDevicesID, uint audioDevicesQty);
ma_result loadMedia(int layer, char *media);
void volChanged(int layer, int vol);
+ void volChanged(int layer, int vol, int ms);
void panChanged(int layer, float pan);
void pitchChanged(int layer, float pitch);
ma_result playbackChanged(int layer, Status status);
diff --git a/src/showplayer.cpp b/src/showplayer.cpp
index 3b877df..f3cbedc 100644
--- a/src/showplayer.cpp
+++ b/src/showplayer.cpp
@@ -12,11 +12,12 @@ 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;
+ connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(updateIndex(int)));
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,48 +28,52 @@ 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());
- for (int i = 0; i < MAX_LAYERS; i++) {
- if (layersUsed[i] == -1) {
- layersUsed[i] = current->userNumber;
- break;
- }
+ 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);
}
- if (!current->filePath.empty())
- emit uiLoadMedia(current->audioLayer, current->filePath.data());
- updateTrackStateInEngine(current);
- emit uiPlaybackChanged(current->audioLayer, current->status);
- filesLoaded++;
+ 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[c]->active = true;
+ layersUsed[current[c]->audioLayer] = current[c]->userNumber;
+ break;
+ default:
+ current[c]->active = false;
+ }
+ ui->cueListWidget->redrawCueTrackList();
}
void ShowPlayer::updateTrackStateInEngine(CueTrack *track) {
- emit uiSliderChanged(track->audioLayer, Slider::Volume, track->volume * 655.35);
+ emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000);
emit uiSliderChanged(track->audioLayer, Slider::Pan, (track->pan + 1) * 128);
emit uiSliderChanged(track->audioLayer, Slider::Pitch, track->pitch * 128);
emit uiSliderChanged(track->audioLayer, Slider::Bus1, track->bus1 * 255 * 2.55);
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()
@@ -78,3 +83,64 @@ void ShowPlayer::saveCueTrackList()
return;
ui->cueListWidget->saveCueTrackList(fileName.toStdString());
}
+
+void ShowPlayer::cueTrackAtEnd(int layer)
+{
+ current[layer]->active = false;
+ ui->cueListWidget->cueTrackAtEnd(layer);
+ removeCueTrackWidget(layer);
+}
+
+void ShowPlayer::cueFinished(int c)
+{
+ if (!current[c])
+ return;
+ if (!current[c]->stopAtEnd)
+ this->go();
+ if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused)
+ cueTrackAtEnd(c);
+}
+
+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;
+ }
+}
+
+void ShowPlayer::updateIndex(int index) {
+ if (index < 0)
+ return;
+ CueTrack *track = ui->cueListWidget->getSelectedTrack(false);
+ if (track) {
+ ui->nextCue->loadCueTrack(track);
+ }
+}
diff --git a/src/showplayer.h b/src/showplayer.h
index 7abec4c..cda63bc 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"
@@ -24,25 +26,33 @@ public:
explicit ShowPlayer(QWidget *parent = nullptr);
~ShowPlayer();
+public slots:
+ void cueTrackAtEnd(int layer);
+
private:
Ui::ShowPlayer *ui;
Status currentStatus = Status::Iddle;
- size_t filesLoaded = 0;
int layersUsed[MAX_LAYERS];
- int lastIndex = 0;
-
- void updateTrackStateInEngine(CueTrack *track);
+ 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);
+ void updateIndex(int index);
signals:
void uiPlaybackChanged(int layer, Status s);
void uiSliderChanged(int layer, Slider s, int vol);
+ void uiSliderChangedFaded(int layer, Slider s, int vol, int ms);
void uiLoadMedia(int layer, QString s);
};
diff --git a/src/showplayer.ui b/src/showplayer.ui
index 9f3cd82..42c4603 100644
--- a/src/showplayer.ui
+++ b/src/showplayer.ui
@@ -6,8 +6,8 @@
0
0
- 743
- 671
+ 800
+ 802
@@ -19,137 +19,50 @@
Show Player
+
+
+ :/buttons/resources/icon.png:/buttons/resources/icon.png
+
+
+ true
+
+
+ false
+
+
+ false
+
-
-
-
-
- 0
- 0
-
-
-
-
- 400
- 400
-
-
-
- QFrame::StyledPanel
-
-
- QFrame::Sunken
-
+
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
- QLayout::SetMinimumSize
+ QLayout::SetDefaultConstraint
- 100
+ 0
- 100
+ 0
-
+
+ Load Cue List
+
- ...
+ Load CueList
-
- ../resources/load_button.png../resources/load_button.png
+
+ :/buttons/resources/load_button.png:/buttons/resources/load_button.png
@@ -161,12 +74,15 @@
-
+
+ Save Cue List
+
- ...
+ Save CueList.
-
- ../resources/save_button.png../resources/save_button.png
+
+ :/buttons/resources/save_button.png:/buttons/resources/save_button.png
@@ -184,12 +100,21 @@
-
+
+
+ 32
+ 32
+
+
+
+ Copy Cue
+
- ...
+ Copy Cue
-
- ../resources/copy_button.png../resources/copy_button.png
+
+ :/buttons/resources/copy_button.png:/buttons/resources/copy_button.png
@@ -202,17 +127,17 @@
-
- Load Cue List
+ Cut Cue
Load Cue List
- ...
+ Cut Cue
-
- ../resources/cut_button.png../resources/cut_button.png
+
+ :/buttons/resources/cut_button.png:/buttons/resources/cut_button.png
@@ -224,12 +149,15 @@
-
+
+ Paste Cue
+
- ...
+ Paste Cue
-
- ../resources/paste_button.png../resources/paste_button.png
+
+ :/buttons/resources/paste_button.png:/buttons/resources/paste_button.png
@@ -244,12 +172,15 @@
Qt::NoFocus
+
+ New Cue
+
- ...
+ New Cue
-
- ../resources/new_button.png../resources/new_button.png
+
+ :/buttons/resources/new_button.png:/buttons/resources/new_button.png
@@ -264,12 +195,15 @@
Qt::NoFocus
+
+ Edit Cue
+
- ...
+ Edit Cue
-
- ../resources/edit_button.png../resources/edit_button.png
+
+ :/buttons/resources/edit_button.png:/buttons/resources/edit_button.png
@@ -284,12 +218,15 @@
Qt::NoFocus
+
+ Remove Cue
+
- ...
+ Delete Cue
-
- ../resources/remove_button.png../resources/remove_button.png
+
+ :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png
@@ -301,25 +238,101 @@
-
-
- true
+
+
+ Qt::Horizontal
-
-
- 0
- 0
-
-
-
- Qt::StrongFocus
-
-
- true
-
-
- 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
+
+
@@ -332,13 +345,20 @@
1
+
+ CueTrackWidget
+ QWidget
+
+ 1
+
- cueListWidget
NewCue
EditCue
RemoveCue
-
+
+
+
diff --git a/src/slidergroup.cpp b/src/slidergroup.cpp
index 481d554..8e9a3b6 100644
--- a/src/slidergroup.cpp
+++ b/src/slidergroup.cpp
@@ -38,16 +38,16 @@ SliderGroup::SliderGroup(QString name,
"margin: 0px;}"
"QSlider::groove:vertical {"
"border: 1px solid #999999;"
- "width: 25px;"
- "margin: -4px;}"
+ "width: 25px;}"
"QSlider::handle:vertical {"
"background: white;"
- "border: 1px solid #5c5c5c;"
+ "border: 2px solid #5c5c5c;"
"width: 29px;"
- "height: 7px;"
- "margin: -2px;"
+ "height: 10px;"
"border-radius: 2px;}"
- "Qslider::tickmarks:vertical {background: white;"
+ "Qslider::tickmarks:vertical {"
+ "background-color: black;"
+ "background: red;"
"color: white;}"
"QSlider::add-page:vertical {background: blue;}"
"QSlider::sub-page:vertical {background: #20182d;}");