From 14a51c88e94309976cc44107269895ba7c098bc9 Mon Sep 17 00:00:00 2001 From: snt Date: Mon, 1 Jul 2024 18:31:47 +0200 Subject: [PATCH] =?UTF-8?q?multi-cue,=20nuevo=20campo=20en=20cuetrack=20pa?= =?UTF-8?q?ra=20lanzar=20la=20siguiente=20cue=20de=20forma=20inmediata,=20?= =?UTF-8?q?sin=20esperar=20a=20los=20tiempos=20de=20la=20cue=20actual.=20C?= =?UTF-8?q?ambiado=20el=20visor=20de=20cue=20a=20QWidgetList,=20ahora=20mu?= =?UTF-8?q?estra=20la=20=C3=BAltima=20cue=20reproducida=20en=20cada=20capa?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libremediaserver-audio.pro | 15 +- lms-resources.qrc | 3 + src/cuetracklistwidget.cpp | 87 ++- src/cuetracklistwidget.h | 8 +- src/cuetrackwidget.cpp | 99 +++- src/cuetrackwidget.h | 33 +- src/cuetrackwidget.ui | 942 +++++++++++++++++++++++++----- src/defines.h | 4 +- src/dialgroup.cpp | 59 +- src/dialgroup.h | 10 +- src/editcuetrackwidget.cpp | 4 + src/editcuetrackwidget.h | 1 + src/libremediaserver-audio-ui.cpp | 2 +- src/libremediaserver-audio-ui.ui | 14 +- src/libremediaserver-audio.cpp | 6 +- src/showplayer.cpp | 95 ++- src/showplayer.h | 12 +- src/showplayer.ui | 240 ++++---- 18 files changed, 1244 insertions(+), 390 deletions(-) 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 @@ -32,7 +32,7 @@ 0 0 - 400 + 640 21 @@ -56,6 +56,8 @@ - + + + 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