multi-cue, nuevo campo en cuetrack para lanzar la siguiente cue de forma

inmediata, sin esperar a los tiempos de la cue actual.
Cambiado el visor de cue a QWidgetList, ahora muestra la última cue
reproducida en cada capa.
This commit is contained in:
snt 2024-07-01 18:31:47 +02:00
parent 307d9c4d43
commit 14a51c88e9
18 changed files with 1244 additions and 390 deletions

View file

@ -2,8 +2,7 @@ TEMPLATE = app
TARGET = libremediaserver-audio TARGET = libremediaserver-audio
QT += webkitwidgets widgets QT += webkitwidgets widgets
HEADERS += src/libremediaserver-audio.h \ HEADERS += src/libremediaserver-audio.h \
cuetrackwidget.h \ src/cuetrackwidget.h \
src/dialgroup.h \
src/editcuetrackwidget.h \ src/editcuetrackwidget.h \
src/cuetracklistwidget.h \ src/cuetracklistwidget.h \
src/showplayer.h \ src/showplayer.h \
@ -25,10 +24,10 @@ HEADERS += src/libremediaserver-audio.h \
src/audiowidget.h \ src/audiowidget.h \
src/defines.h \ src/defines.h \
src/settings.h \ src/settings.h \
src/slidergroup.h src/slidergroup.h \
src/dialgroup.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
cuetrackwidget.cpp \ src/cuetrackwidget.cpp \
src/dialgroup.cpp \
src/editcuetrackwidget.cpp \ src/editcuetrackwidget.cpp \
src/cuetracklistwidget.cpp \ src/cuetracklistwidget.cpp \
src/showplayer.cpp \ src/showplayer.cpp \
@ -47,9 +46,10 @@ SOURCES += src/main.cpp \
src/audiolayerwidget.cpp \ src/audiolayerwidget.cpp \
src/audiowidget.cpp \ src/audiowidget.cpp \
src/settings.cpp \ src/settings.cpp \
src/slidergroup.cpp src/slidergroup.cpp \
src/dialgroup.cpp
FORMS += \ FORMS += \
cuetrackwidget.ui \ src/cuetrackwidget.ui \
src/showplayer.ui \ src/showplayer.ui \
src/libremediaserver-audio-ui.ui src/libremediaserver-audio-ui.ui
CCFLAG += -msse2 -mavx2 CCFLAG += -msse2 -mavx2
@ -63,6 +63,5 @@ OTHER_FILES += \
docs/changelog.txt \ docs/changelog.txt \
docs/lms-audio.xlm \ docs/lms-audio.xlm \
docs/roadmap.txt docs/roadmap.txt
RESOURCES += \ RESOURCES += \
lms-resources.qrc lms-resources.qrc

View file

@ -8,5 +8,8 @@
<file>resources/new_button.png</file> <file>resources/new_button.png</file>
<file>resources/paste_button.png</file> <file>resources/paste_button.png</file>
<file>resources/save_button.png</file> <file>resources/save_button.png</file>
<file>resources/icon.png</file>
<file>resources/panic_button.jpg</file>
<file>resources/go_button.jpeg</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -1,4 +1,7 @@
#include <algorithm> #include <algorithm>
#include <iostream>
#include <string>
#include <fstream>
#include <QWidget> #include <QWidget>
#include <QScrollArea> #include <QScrollArea>
#include <QEvent> #include <QEvent>
@ -7,6 +10,8 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QTableWidget> #include <QTableWidget>
#include <QTableWidgetItem> #include <QTableWidgetItem>
#include <QFile>
#include <QXmlStreamReader>
#include "cuetracklistwidget.h" #include "cuetracklistwidget.h"
CueTrackListWidget::CueTrackListWidget(QWidget *parent) CueTrackListWidget::CueTrackListWidget(QWidget *parent)
@ -42,8 +47,9 @@ CueTrack* CueTrackListWidget::getTrackAtIndex(int index) {
return nullptr; return nullptr;
} }
CueTrack* CueTrackListWidget::getSelectedTrack() { CueTrack* CueTrackListWidget::getSelectedTrack(bool advance) {
CueTrack* track = getTrackAtIndex(selectedIndex); CueTrack* track = getTrackAtIndex(selectedIndex);
if (advance)
key_down(); key_down();
return track; return track;
} }
@ -121,23 +127,25 @@ void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) {
void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t) void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t)
{ {
t->active = false; t->active = false;
t->audioLayer = -1; t->audioLayer = 0;
t->bus1 = 80; t->bus1 = 100;
t->bus2 = 80; t->bus2 = 100;
t->entryPoint = 0; t->entryPoint = 0;
t->exitPoint = 255; t->exitPoint = 255;
t->fadeIn = 3; t->fadeIn = 2;
t->fadeOut = 3; t->fadeOut = 2;
t->waitIn = 0; t->waitIn = 0;
t->waitOut = 0; t->waitOut = 0;
t->pan = 0; t->pan = 0;
t->pitch = 1; t->pitch = 1;
t->status = Status::PlayingOnce; t->status = Status::PlayingOnce;
lastUserCueNumber += 10;
t->userNumber = lastUserCueNumber; t->userNumber = lastUserCueNumber;
lastUserCueNumber++;
t->volume = 80; t->volume = 80;
t->stopAtEnd = true; t->stopAtEnd = true;
t->filePath = ""; t->filePath = "";
t->duration = 0;
t->multi = false;
} }
void CueTrackListWidget::createNewCueTrack() void CueTrackListWidget::createNewCueTrack()
@ -155,7 +163,7 @@ void CueTrackListWidget::createNewCueTrack()
} else } else
redrawCueTrackList(); redrawCueTrackList();
if (lastUserCueNumber < t->userNumber) if (lastUserCueNumber < t->userNumber)
lastUserCueNumber = t->userNumber + 10; lastUserCueNumber = t->userNumber;
} else } else
delete (t); delete (t);
} }
@ -170,7 +178,7 @@ void CueTrackListWidget::editCueTrack()
emit changeSelectedIndex(selectedIndex); emit changeSelectedIndex(selectedIndex);
} }
if (lastUserCueNumber < current->userNumber) if (lastUserCueNumber < current->userNumber)
lastUserCueNumber = current->userNumber + 10; lastUserCueNumber = current->userNumber;
} }
void CueTrackListWidget::deleteCueTrack() void CueTrackListWidget::deleteCueTrack()
@ -205,6 +213,8 @@ void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst)
dst->name = src->name; dst->name = src->name;
dst->description = src->description; dst->description = src->description;
dst->filePath = src->filePath; dst->filePath = src->filePath;
dst->duration = src->duration;
dst->multi = src->multi;
} }
QString *CueTrackListWidget::getFileName(std::string s) QString *CueTrackListWidget::getFileName(std::string s)
@ -251,11 +261,6 @@ void CueTrackListWidget::redrawCueTrackList()
emit changeSelectedIndex(selectedIndex); emit changeSelectedIndex(selectedIndex);
} }
#include <QFile>
#include <QXmlStreamReader>
#include <iostream>
#include <string>
void CueTrackListWidget::loadCueTrackList(std::string filename) void CueTrackListWidget::loadCueTrackList(std::string filename)
{ {
QFile file(QString::fromStdString(filename)); QFile file(QString::fromStdString(filename));
@ -266,6 +271,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
} }
QXmlStreamReader xmlReader(&file); QXmlStreamReader xmlReader(&file);
clearCueTrackList(); clearCueTrackList();
lastUserCueNumber = 0;
while (!xmlReader.atEnd() && !xmlReader.hasError()) while (!xmlReader.atEnd() && !xmlReader.hasError())
{ {
QXmlStreamReader::TokenType token = xmlReader.readNext(); QXmlStreamReader::TokenType token = xmlReader.readNext();
@ -318,7 +324,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
} }
else if (elementName == "stopAtEnd") { else if (elementName == "stopAtEnd") {
QString tmp = xmlReader.text().toString().toLower(); QString tmp = xmlReader.text().toString().toLower();
if (tmp.compare("true")) if (tmp.compare("false"))
t->stopAtEnd = true; t->stopAtEnd = true;
else { else {
t->stopAtEnd = false; t->stopAtEnd = false;
@ -332,6 +338,10 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
} }
else if (elementName == "userNumber") { else if (elementName == "userNumber") {
t->userNumber = xmlReader.text().toInt(); t->userNumber = xmlReader.text().toInt();
if (t->userNumber > lastUserCueNumber)
{
lastUserCueNumber = t->userNumber;
}
} }
else if (elementName == "entryPoint") { else if (elementName == "entryPoint") {
t->entryPoint = xmlReader.text().toInt(); t->entryPoint = xmlReader.text().toInt();
@ -342,6 +352,17 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
else if (elementName == "audioLayer") { else if (elementName == "audioLayer") {
t->audioLayer = xmlReader.text().toInt(); 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; t->active = false;
} }
} }
@ -359,9 +380,6 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
redrawCueTrackList(); redrawCueTrackList();
} }
#include <fstream>
#include <string>
void CueTrackListWidget::saveCueTrackList(std::string filename) void CueTrackListWidget::saveCueTrackList(std::string filename)
{ {
std::ofstream file(filename); std::ofstream file(filename);
@ -404,6 +422,10 @@ std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack)
xml += " <entryPoint>" + std::to_string(cueTrack.entryPoint) + "</entryPoint>\n"; xml += " <entryPoint>" + std::to_string(cueTrack.entryPoint) + "</entryPoint>\n";
xml += " <exitPoint>" + std::to_string(cueTrack.exitPoint) + "</exitPoint>\n"; xml += " <exitPoint>" + std::to_string(cueTrack.exitPoint) + "</exitPoint>\n";
xml += " <audioLayer>" + std::to_string(cueTrack.audioLayer) + "</audioLayer>\n"; xml += " <audioLayer>" + std::to_string(cueTrack.audioLayer) + "</audioLayer>\n";
xml += " <duration>" + std::to_string(cueTrack.duration) + "</duration>\n";
xml += " <multi>";
xml += (cueTrack.multi ? "true" : "false");
xml += "</multi>\n";
xml += " </CueTrack>\n"; xml += " </CueTrack>\n";
return xml; return xml;
} }
@ -514,6 +536,8 @@ CueTrack loadCueTrackFromXml(const QString& filename) {
cueTrack.exitPoint = xmlReader.readElementText().toInt(); cueTrack.exitPoint = xmlReader.readElementText().toInt();
} else if (elementName == "audioLayer") { } else if (elementName == "audioLayer") {
cueTrack.audioLayer = xmlReader.readElementText().toInt(); cueTrack.audioLayer = xmlReader.readElementText().toInt();
} else if (elementName == "duration") {
cueTrack.duration = xmlReader.readElementText().toInt();
} }
} }
} }
@ -546,3 +570,26 @@ void CueTrackListWidget::cueTrackAtEnd(int layer)
} }
redrawCueTrackList(); 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);
}
}

View file

@ -19,7 +19,7 @@ public:
explicit CueTrackListWidget(QWidget *parent = nullptr); explicit CueTrackListWidget(QWidget *parent = nullptr);
public slots: public slots:
CueTrack* getSelectedTrack(); CueTrack* getSelectedTrack(bool advance);
void createNewCueTrack(); void createNewCueTrack();
void editCueTrack(); void editCueTrack();
void deleteCueTrack(); void deleteCueTrack();
@ -42,6 +42,7 @@ private:
int size() { return m_size; } int size() { return m_size; }
int selectedIndex = 0; int selectedIndex = 0;
int lastUserCueNumber = 0; int lastUserCueNumber = 0;
CueTrack* copiedCue = nullptr;
private slots: private slots:
void addCueTrack(CueTrack* cue); void addCueTrack(CueTrack* cue);
@ -56,9 +57,12 @@ private slots:
void sortCueTrackList(); void sortCueTrackList();
void clearTableWidget(); void clearTableWidget();
std::string cueTrackToXml(const CueTrack& cueTrack); std::string cueTrackToXml(const CueTrack& cueTrack);
void copyCueTrack();
void pasteCueTrack();
void cutCueTrack();
signals: signals:
void changeSelectedIndex(int index); void changeSelectedIndex(int index);
void goAction(int channel);
}; };
#endif #endif

View file

@ -1,14 +1,107 @@
#include <QFileInfo>
#include "cuetrackwidget.h" #include "cuetrackwidget.h"
#include "ui_cuetrackwidget.h" #include "ui_cuetrackwidget.h"
CuetrackWidget::CuetrackWidget(QWidget *parent) : CueTrackWidget::CueTrackWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::CuetrackWidget) ui(new Ui::CueTrackWidget)
{ {
ui->setupUi(this); 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; 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();
}

View file

@ -2,22 +2,43 @@
#define CUETRACKWIDGET_H #define CUETRACKWIDGET_H
#include <QWidget> #include <QWidget>
#include <QCheckBox> #include <QTimeLine>
#include "defines.h"
#include "dialgroup.h"
namespace Ui { namespace Ui {
class CuetrackWidget; class CueTrackWidget;
} }
class CuetrackWidget : public QWidget class CueTrackWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit CuetrackWidget(QWidget *parent = nullptr); explicit CueTrackWidget(QWidget *parent = nullptr);
~CuetrackWidget(); ~CueTrackWidget();
private: 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 #endif // CUETRACKWIDGET_H

View file

@ -1,33 +1,418 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>CuetrackWidget</class> <class>CueTrackWidget</class>
<widget class="QWidget" name="CuetrackWidget"> <widget class="QWidget" name="CueTrackWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>640</width> <width>502</width>
<height>193</height> <height>329</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Cue Track</string>
</property> </property>
<widget class="QGroupBox" name="CueTimesGroupBox"> <property name="windowIcon">
<property name="geometry"> <iconset resource="../lms-resources.qrc">
<rect> <normaloff>:/buttons/resources/icon.png</normaloff>:/buttons/resources/icon.png</iconset>
<x>10</x> </property>
<y>40</y> <layout class="QVBoxLayout" name="verticalLayout">
<width>238</width> <property name="spacing">
<height>85</height> <number>0</number>
</rect> </property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="opaqueResize">
<bool>false</bool>
</property>
<property name="handleWidth">
<number>8</number>
</property>
<widget class="QSplitter" name="cueHeaderInfo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QProgressBar" name="cueProgressBar">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Cue Progress</string>
</property>
<property name="statusTip">
<string>Cue Progress</string>
</property>
<property name="value">
<number>24</number>
</property>
</widget>
<widget class="QLCDNumber" name="cueNumber">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>48</width>
<height>48</height>
</size>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Cue Number</string>
</property>
<property name="statusTip">
<string>Cue Number</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>1</number>
</property>
<property name="smallDecimalPoint">
<bool>false</bool>
</property>
<property name="digitCount">
<number>4</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::Flat</enum>
</property>
</widget>
<widget class="QLabel" name="cueName">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>2</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<pointsize>13</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Cue Name</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="text">
<string>Cue Name</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>3</number>
</property>
</widget>
</widget>
<widget class="QSplitter" name="mediaInfo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QProgressBar" name="mediaProgressBar">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Cue Progress</string>
</property>
<property name="statusTip">
<string>Media Progress</string>
</property>
<property name="value">
<number>24</number>
</property>
</widget>
<widget class="QTimeEdit" name="mediaCurrentTimeEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="statusTip">
<string>Media current time</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
<widget class="QTimeEdit" name="mediaEndTimeEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="statusTip">
<string>Media Edn Time</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
<widget class="QLabel" name="mediaFileName">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>7</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Media FIle Name</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="text">
<string>Media file name</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>3</number>
</property>
</widget>
</widget>
<widget class="QSplitter" name="cueValues">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QGroupBox" name="timesLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property> </property>
<property name="title"> <property name="title">
<string notr="true"/> <string notr="true"/>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <property name="sizeConstraint">
<widget class="QDoubleSpinBox" name="FadeBox"> <enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="waitIn">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Wait in time in seconds</string>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QDoubleSpinBox" name="waitOut">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Wait out time in secods</string>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="fade">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip"> <property name="toolTip">
<string>Fade time in seconds</string> <string>Fade time in seconds</string>
</property> </property>
@ -40,8 +425,11 @@
<property name="wrapping"> <property name="wrapping">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum> <enum>QAbstractSpinBox::NoButtons</enum>
</property> </property>
<property name="specialValueText"> <property name="specialValueText">
<string/> <string/>
@ -63,95 +451,375 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="haltBox"> <widget class="QTimeEdit" name="exitPoint">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Exit Point</string>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLabel" name="status">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>13</pointsize>
</font>
</property>
<property name="toolTip">
<string>Playback Status</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="text"> <property name="text">
<string>CheckBox</string> <string>Playback Status</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="waitIn"/>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_4"/>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="CueValuesGroupBox">
<property name="geometry">
<rect>
<x>260</x>
<y>40</y>
<width>341</width>
<height>121</height>
</rect>
</property>
<property name="title">
<string notr="true"/>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QSpinBox" name="volBox"/>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="panBox"/>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QSpinBox" name="spinBox"/> <widget class="QTimeEdit" name="entryPoint">
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="bus1Box"/>
</item>
</layout>
</widget>
<widget class="QSplitter" name="splitter">
<property name="geometry">
<rect>
<x>0</x>
<y>10</y>
<width>631</width>
<height>25</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QProgressBar" name="progressBar">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Entry Point</string>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLCDNumber" name="audioLayer">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>100</width> <width>0</width>
<height>0</height> <height>24</height>
</size> </size>
</property> </property>
<property name="value"> <property name="toolTip">
<number>24</number> <string>Audio Channel</string>
</property>
<property name="smallDecimalPoint">
<bool>false</bool>
</property>
<property name="digitCount">
<number>1</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::Flat</enum>
</property> </property>
</widget> </widget>
<widget class="QLCDNumber" name="cueName"> </item>
<item row="2" column="2">
<widget class="QRadioButton" name="halt">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>100</width> <width>24</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
</widget> <property name="font">
<widget class="QLCDNumber" name="cueNumber"> <font>
<property name="minimumSize"> <pointsize>13</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Do not play next cue if checked</string>
</property>
<property name="whatsThis">
<string>If checked, do not play next cue. If checked, Go next cue when this cue has finished.</string>
</property>
<property name="accessibleName">
<string>Halt</string>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="text">
<string> Halt </string>
</property>
<property name="icon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/delete_button.png</normaloff>:/buttons/resources/delete_button.png</iconset>
</property>
<property name="iconSize">
<size> <size>
<width>400</width> <width>32</width>
<height>0</height> <height>32</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="gridLayoutWidget">
<layout class="QGridLayout" name="audioLayout" rowminimumheight="0,0,0,0" columnminimumwidth="0,0,0">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="2" column="1">
<widget class="QLCDNumber" name="pitch">
<property name="digitCount">
<number>3</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="bus1Label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Bus 1</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLCDNumber" name="pan">
<property name="digitCount">
<number>3</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::Flat</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="volLabel">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Volume</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="bus2Label">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Bus 2</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLCDNumber" name="vol">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Volume&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="digitCount">
<number>3</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLCDNumber" name="bus2">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Bus 2 Volume&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="digitCount">
<number>3</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLCDNumber" name="bus1">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Bus 1 Volume&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="digitCount">
<number>3</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="panLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Pan</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="pitchLabel">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Pitch</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QCheckBox" name="multi">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
<underline>true</underline>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;PLay next cue at same time this cue, do not wait to finish the cue.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/go_button.jpeg</normaloff>:/buttons/resources/go_button.jpeg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size> </size>
</property> </property>
</widget> </widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="multiLabel">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>MultiCue</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget> </widget>
</widget> </widget>
<resources/> </widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>mediaCurrentTimeEdit</tabstop>
<tabstop>waitOut</tabstop>
<tabstop>waitIn</tabstop>
<tabstop>entryPoint</tabstop>
<tabstop>exitPoint</tabstop>
<tabstop>fade</tabstop>
<tabstop>mediaEndTimeEdit</tabstop>
</tabstops>
<resources>
<include location="../lms-resources.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

View file

@ -113,7 +113,9 @@ struct CueTrack {
int entryPoint; // 0 - 255 int entryPoint; // 0 - 255
int exitPoint; // 0 - 255 int exitPoint; // 0 - 255
int audioLayer; // internal audio layer used when cue is loaded 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 #endif // __cplusplus

View file

@ -1,7 +1,7 @@
#include "dialgroup.h"
#include <cmath> #include <cmath>
#include <QWidget> #include <QWidget>
#include <QVBoxLayout> #include <QVBoxLayout>
#include "dialgroup.h"
DialGroup::DialGroup(QString name, DialGroup::DialGroup(QString name,
int min, int min,
@ -10,18 +10,18 @@ DialGroup::DialGroup(QString name,
QWidget *parent) QWidget *parent)
: QWidget(parent) : QWidget(parent)
{ {
layout = new QVBoxLayout; QVBoxLayout *layout = new QVBoxLayout;
layout->setAlignment(Qt::AlignHCenter); layout->setAlignment(Qt::AlignHCenter);
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
slider.setFocusPolicy(Qt::StrongFocus); slider.setFocusPolicy(Qt::NoFocus);
slider.setTickPosition(QSlider::TicksBothSides); slider.setRange(min, max);
slider.setTickInterval((max - min) / 11); slider.setValue(min + max / 2);
slider.setToolTip(name);
slider.setContentsMargins(0, 0, 0, 0);
/*
slider.setMinimumHeight(0); slider.setMinimumHeight(0);
slider.setSingleStep(1); slider.setSingleStep(1);
slider.setRange(min, max);
slider.setValue(0);
slider.setMinimumWidth(50); slider.setMinimumWidth(50);
slider.setToolTip(name);
slider.setStyleSheet("QDial {" slider.setStyleSheet("QDial {"
"border: 1px solid #aa8895;" "border: 1px solid #aa8895;"
"background: #20182d;" "background: #20182d;"
@ -33,14 +33,10 @@ DialGroup::DialGroup(QString name,
"background-color: black;" "background-color: black;"
"background: red;" "background: red;"
"color: white;}" "color: white;}"
slider.setContentsMargins(0, 0, 0, 0); */
valueBox.setFocusPolicy(Qt::NoFocus); valueBox.setFocusPolicy(Qt::NoFocus);
valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons); valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons);
valueBox.setMinimumWidth(50); 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.setValue(0);
valueBox.setDecimals(decimals); valueBox.setDecimals(decimals);
@ -48,46 +44,23 @@ DialGroup::DialGroup(QString name,
valueBox.setToolTip(name); valueBox.setToolTip(name);
valueBox.setAlignment(Qt::AlignHCenter); valueBox.setAlignment(Qt::AlignHCenter);
valueBox.setContentsMargins(0, 0, 0, 0); valueBox.setContentsMargins(0, 0, 0, 0);
connect(&slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int)));
layout->addWidget(&slider); layout->addWidget(&slider);
layout->addWidget(&valueBox); layout->addWidget(&valueBox);
this->setStyleSheet("border: 1px solid #aa8895;" /* this->setStyleSheet("border: 1px solid #998090;"
"background-color: black;" "background-color: black;"
"margin: 1px;" "margin: 1px;"
); );*/
layout->setSpacing(0); layout->setSpacing(0);
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
this->setLayout(layout); 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); slider.blockSignals(true);
valueBox.blockSignals(true); valueBox.blockSignals(true);
if (int(value) != slider.value())
slider.setValue(value); slider.setValue(value);
if (valueBox.decimals()) {
db = (float)(value / 771.0f) - 85.0f;
valueBox.setValue(db);
} else
valueBox.setValue(value); valueBox.setValue(value);
slider.blockSignals(false); slider.blockSignals(false);
valueBox.blockSignals(false); valueBox.blockSignals(false);

View file

@ -1,5 +1,5 @@
#ifndef SLIDERGROUP_H #ifndef DIALGROUP_H
#define SLIDERGROUP_H #define DIALGROUP_H
#include <QObject> #include <QObject>
#include <QWidget> #include <QWidget>
@ -12,18 +12,14 @@ class DialGroup : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
DialGroup(QString name, explicit DialGroup(QString name,
int min, int min,
int max, int max,
int decimals, int decimals,
QWidget *parent = nullptr); QWidget *parent = nullptr);
signals:
void valueChanged(int value);
public slots: public slots:
void setValue(float value); void setValue(float value);
void sliderValueChanged(int value);
private: private:
QDial slider; QDial slider;

View file

@ -58,6 +58,8 @@ void EditCueTrackWidget::setupUi() {
layout->addRow("Entry Point", entryPointSpin); layout->addRow("Entry Point", entryPointSpin);
exitPointSpin = new QSpinBox(this); exitPointSpin = new QSpinBox(this);
layout->addRow("Exit Point", exitPointSpin); layout->addRow("Exit Point", exitPointSpin);
multiCheck = new QCheckBox(this);
layout->addRow("Multi Cue", multiCheck);
statusCombo->addItem(statusToString(Status::Stopped)); statusCombo->addItem(statusToString(Status::Stopped));
statusCombo->addItem(statusToString(Status::Paused)); statusCombo->addItem(statusToString(Status::Paused));
statusCombo->addItem(statusToString(Status::PlayingOnce)); statusCombo->addItem(statusToString(Status::PlayingOnce));
@ -92,6 +94,7 @@ void EditCueTrackWidget::loadCueTrack(CueTrack cueTrack) {
audioLayerSpin->setValue(cueTrack.audioLayer); audioLayerSpin->setValue(cueTrack.audioLayer);
QString tmp = statusToString(cueTrack.status); QString tmp = statusToString(cueTrack.status);
statusCombo->setCurrentIndex(statusCombo->findText(tmp)); statusCombo->setCurrentIndex(statusCombo->findText(tmp));
multiCheck->setChecked(cueTrack.multi);
} }
CueTrack EditCueTrackWidget::saveCueTrack() { CueTrack EditCueTrackWidget::saveCueTrack() {
@ -114,6 +117,7 @@ CueTrack EditCueTrackWidget::saveCueTrack() {
cueTrack.pan = panSpin->value(); cueTrack.pan = panSpin->value();
cueTrack.pitch = pitchSpin->value(); cueTrack.pitch = pitchSpin->value();
cueTrack.description.append(descriptionEdit->text().toUtf8().constData()); cueTrack.description.append(descriptionEdit->text().toUtf8().constData());
cueTrack.multi = multiCheck->isChecked();
return cueTrack; return cueTrack;
} }

View file

@ -46,6 +46,7 @@ private:
QSpinBox *exitPointSpin; QSpinBox *exitPointSpin;
QComboBox *statusCombo; QComboBox *statusCombo;
QSpinBox *audioLayerSpin; QSpinBox *audioLayerSpin;
QCheckBox *multiCheck;
QPushButton *browseButton; QPushButton *browseButton;
QPushButton *saveButton; QPushButton *saveButton;
QPushButton *cancelButton; QPushButton *cancelButton;

View file

@ -60,6 +60,6 @@ void libreMediaServerAudioUi::olasetup()
void libreMediaServerAudioUi::launchShowPlayerWindow() void libreMediaServerAudioUi::launchShowPlayerWindow()
{ {
qDebug() << "launch show player"; //m_showPlayer->showMaximized();
m_showPlayer->show(); m_showPlayer->show();
} }

View file

@ -7,8 +7,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>640</width>
<height>400</height> <height>800</height>
</rect> </rect>
</property> </property>
<property name="font"> <property name="font">
@ -23,8 +23,8 @@
<string>LibreMediaServer</string> <string>LibreMediaServer</string>
</property> </property>
<property name="windowIcon"> <property name="windowIcon">
<iconset> <iconset resource="../lms-resources.qrc">
<normaloff>../../../../criptomart/artwork/logo_v2_criptomart.net.png</normaloff>../../../../criptomart/artwork/logo_v2_criptomart.net.png</iconset> <normaloff>:/buttons/resources/icon.png</normaloff>:/buttons/resources/icon.png</iconset>
</property> </property>
<widget class="QWidget" name="centralwidget"/> <widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
@ -32,7 +32,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>640</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
@ -56,6 +56,8 @@
</property> </property>
</action> </action>
</widget> </widget>
<resources/> <resources>
<include location="../lms-resources.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

View file

@ -170,7 +170,7 @@ void libreMediaServerAudio::refreshUi() {
} }
m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i)); m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i));
if (m_mae.getAtEnd(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_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
m_lmsUi->m_showPlayer->cueTrackAtEnd(i); m_lmsUi->m_showPlayer->cueTrackAtEnd(i);
@ -246,8 +246,8 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value)
{ {
switch (s){ switch (s){
case Slider::Volume: case Slider::Volume:
//m_mae.volChanged(layer, value); m_mae.volChanged(layer, value);
//m_updateUi[layer][0] = value; m_updateUi[layer][0] = value;
break; break;
case Slider::Pan: case Slider::Pan:
m_mae.panChanged(layer, value); m_mae.panChanged(layer, value);

View file

@ -12,11 +12,11 @@ ShowPlayer::ShowPlayer(QWidget *parent) :
connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList())); connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList()));
connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList())); connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList()));
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go())); connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
filesLoaded = 0;
currentStatus = Status::Iddle; currentStatus = Status::Iddle;
for(int i = 0; i < MAX_LAYERS; i++) for(int i = 0; i < MAX_LAYERS; i++) {
layersUsed[i] = -1; layersUsed[i] = -1;
connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(changeSelectedIndex(int))); cueTrackWidgetPlaying[i] = nullptr;
}
} }
ShowPlayer::~ShowPlayer() {} ShowPlayer::~ShowPlayer() {}
@ -27,32 +27,36 @@ void ShowPlayer::onAddTrack() {
void ShowPlayer::go() void ShowPlayer::go()
{ {
ui->activeCueNumber->display(lastIndex); CueTrack *goCue = ui->cueListWidget->getSelectedTrack(true);
CueTrack* current = ui->cueListWidget->getSelectedTrack(); if (!goCue)
if (!current)
return; return;
if (current->audioLayer < 0) current[goCue->audioLayer] = goCue;
return; playCueTrack(goCue);
ui->activeCueLabel->setText(current->name.data()); if (goCue->multi)
if (!current->filePath.empty()) go();
emit uiLoadMedia(current->audioLayer, current->filePath.data()); }
updateTrackStateInEngine(current);
emit uiPlaybackChanged(current->audioLayer, current->status); void ShowPlayer::goAction(int c)
ui->cueListWidget->cueTrackAtEnd(current->audioLayer); {
switch (current->status) { 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::PlayingOnce:
case Status::PlayingLoop: case Status::PlayingLoop:
case Status::PlayingFolder: case Status::PlayingFolder:
case Status::PlayingFolderLoop: case Status::PlayingFolderLoop:
case Status::PlayingFolderRandom: case Status::PlayingFolderRandom:
current->active = true; current[c]->active = true;
layersUsed[current->audioLayer] = current->userNumber; layersUsed[current[c]->audioLayer] = current[c]->userNumber;
break; break;
default: default:
current->active = false; current[c]->active = false;
} }
ui->cueListWidget->redrawCueTrackList(); ui->cueListWidget->redrawCueTrackList();
filesLoaded++;
} }
void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { void ShowPlayer::updateTrackStateInEngine(CueTrack *track) {
@ -63,14 +67,6 @@ void ShowPlayer::updateTrackStateInEngine(CueTrack *track) {
emit uiSliderChanged(track->audioLayer, Slider::Bus2, track->bus2 * 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() void ShowPlayer::loadCueTrackList()
{ {
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("XML Files (*.xml)")); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("XML Files (*.xml)"));
@ -89,5 +85,48 @@ void ShowPlayer::saveCueTrackList()
void ShowPlayer::cueTrackAtEnd(int layer) void ShowPlayer::cueTrackAtEnd(int layer)
{ {
current[layer]->active = false;
ui->cueListWidget->cueTrackAtEnd(layer); 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;
}
} }

View file

@ -9,6 +9,8 @@
#include "defines.h" #include "defines.h"
#include "cuetracklistwidget.h" #include "cuetracklistwidget.h"
#include "cuetrackwidget.h"
#include "dialgroup.h"
#include "settings.h" #include "settings.h"
#include "ui_showplayer.h" #include "ui_showplayer.h"
@ -30,17 +32,21 @@ public slots:
private: private:
Ui::ShowPlayer *ui; Ui::ShowPlayer *ui;
Status currentStatus = Status::Iddle; Status currentStatus = Status::Iddle;
size_t filesLoaded = 0;
int layersUsed[MAX_LAYERS]; int layersUsed[MAX_LAYERS];
int lastIndex = 0; CueTrack *current[MAX_LAYERS];
CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS];
CueTrackWidget *addCueTrackWidget(CueTrack *track);
private slots: private slots:
void updateTrackStateInEngine(CueTrack *track); void updateTrackStateInEngine(CueTrack *track);
void onAddTrack(); void onAddTrack();
void go(); void go();
void changeSelectedIndex(int i);
void loadCueTrackList(); void loadCueTrackList();
void saveCueTrackList(); void saveCueTrackList();
void cueFinished(int channel);
void removeCueTrackWidget(int index);
void playCueTrack(CueTrack *track);
void goAction(int channel);
signals: signals:
void uiPlaybackChanged(int layer, Status s); void uiPlaybackChanged(int layer, Status s);

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>743</width> <width>800</width>
<height>671</height> <height>802</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -19,117 +19,30 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Show Player</string> <string>Show Player</string>
</property> </property>
<property name="windowIcon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/icon.png</normaloff>:/buttons/resources/icon.png</iconset>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="sizeGripEnabled">
<bool>false</bool>
</property>
<property name="modal">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QSplitter" name="splitter"> <widget class="QSplitter" name="splitter_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>400</height>
</size>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property> </property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="handleWidth">
<number>8</number>
</property>
<widget class="QSplitter" name="masterSplitter">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>8</number>
</property>
<widget class="QPushButton" name="goButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="text">
<string>GO</string>
</property>
<property name="shortcut">
<string>Space</string>
</property>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QGridLayout" name="statusLayout">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLCDNumber" name="activeCueNumber"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="activeCueLabel">
<property name="text">
<string>Active Cue</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLCDNumber" name="nextCueNumber">
<property name="enabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="nextCueLabel">
<property name="text">
<string>Next Cue</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QToolButton" name="panicButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="text">
<string>...</string>
</property>
<property name="shortcut">
<string>P</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="horizontalLayoutWidget"> <widget class="QWidget" name="horizontalLayoutWidget">
<layout class="QHBoxLayout" name="ButtonToolBarLayout"> <layout class="QHBoxLayout" name="ButtonToolBarLayout" stretch="0,0,0,0,0,0,0,0">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
@ -137,10 +50,10 @@
<enum>QLayout::SetDefaultConstraint</enum> <enum>QLayout::SetDefaultConstraint</enum>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>100</number> <number>0</number>
</property> </property>
<property name="rightMargin"> <property name="rightMargin">
<number>100</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QToolButton" name="LoadCueList"> <widget class="QToolButton" name="LoadCueList">
@ -328,10 +241,20 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="CueTrackListWidget" name="cueListWidget" native="true"> <widget class="QSplitter" name="masterSplitter">
<property name="enabled"> <property name="frameShape">
<bool>true</bool> <enum>QFrame::StyledPanel</enum>
</property> </property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>8</number>
</property>
<widget class="QPushButton" name="goButton">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -339,15 +262,89 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::StrongFocus</enum> <enum>Qt::ClickFocus</enum>
</property> </property>
<property name="autoFillBackground"> <property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/go_button.jpeg</normaloff>:/buttons/resources/go_button.jpeg</iconset>
</property>
<property name="iconSize">
<size>
<width>120</width>
<height>120</height>
</size>
</property>
<property name="shortcut">
<string>Space</string>
</property>
<property name="autoDefault">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="inputMethodHints"> <property name="flat">
<set>Qt::ImhPreferLowercase</set> <bool>false</bool>
</property> </property>
</widget> </widget>
<widget class="QToolButton" name="panicButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/panic_button.jpg</normaloff>:/buttons/resources/panic_button.jpg</iconset>
</property>
<property name="iconSize">
<size>
<width>96</width>
<height>120</height>
</size>
</property>
<property name="shortcut">
<string>P</string>
</property>
</widget>
</widget>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="CueTrackListWidget" name="cueListWidget" native="true">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cue List&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QListWidget" name="activeCueList">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cues active&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="layoutMode">
<enum>QListView::SinglePass</enum>
</property>
</widget>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -361,7 +358,6 @@
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<tabstops> <tabstops>
<tabstop>cueListWidget</tabstop>
<tabstop>NewCue</tabstop> <tabstop>NewCue</tabstop>
<tabstop>EditCue</tabstop> <tabstop>EditCue</tabstop>
<tabstop>RemoveCue</tabstop> <tabstop>RemoveCue</tabstop>