Compare commits

...

7 commits

Author SHA1 Message Date
snt
d35b166ce5 quita de la lista las cues en stop o paused cuando acaben su ejeución. 2024-07-02 00:30:03 +02:00
snt
14a51c88e9 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.
2024-07-01 18:31:47 +02:00
snt
307d9c4d43 wip cuetrackwidget 2024-06-27 15:25:07 +02:00
snt
e39d885f6f fade in time 2024-06-26 20:14:51 +02:00
snt
6056778856 active indicator working 2024-06-22 00:57:19 +02:00
snt
0795157d5f wip en active, hacer lista con las cues activas? 2024-06-21 20:39:07 +02:00
snt
86e866c996 iconos de botones en fichero de recursos 2024-06-21 18:56:02 +02:00
30 changed files with 1487 additions and 253 deletions

View file

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

15
lms-resources.qrc Normal file
View file

@ -0,0 +1,15 @@
<RCC>
<qresource prefix="/buttons">
<file>resources/copy_button.png</file>
<file>resources/cut_button.png</file>
<file>resources/delete_button.png</file>
<file>resources/edit_button.png</file>
<file>resources/load_button.png</file>
<file>resources/new_button.png</file>
<file>resources/paste_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>
</RCC>

BIN
resources/copy_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

BIN
resources/cut_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
resources/delete_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
resources/edit_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

BIN
resources/load_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
resources/new_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
resources/paste_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

BIN
resources/save_button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -1,4 +1,7 @@
#include <algorithm>
#include <iostream>
#include <string>
#include <fstream>
#include <QWidget>
#include <QScrollArea>
#include <QEvent>
@ -7,6 +10,8 @@
#include <QVBoxLayout>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QFile>
#include <QXmlStreamReader>
#include "cuetracklistwidget.h"
CueTrackListWidget::CueTrackListWidget(QWidget *parent)
@ -42,9 +47,10 @@ CueTrack* CueTrackListWidget::getTrackAtIndex(int index) {
return nullptr;
}
CueTrack* CueTrackListWidget::getSelectedTrack() {
CueTrack* CueTrackListWidget::getSelectedTrack(bool advance) {
CueTrack* track = getTrackAtIndex(selectedIndex);
key_down();
if (advance)
key_down();
return track;
}
@ -121,23 +127,25 @@ void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) {
void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t)
{
t->active = false;
t->audioLayer = -1;
t->bus1 = 80;
t->bus2 = 80;
t->audioLayer = 0;
t->bus1 = 100;
t->bus2 = 100;
t->entryPoint = 0;
t->exitPoint = 255;
t->fadeIn = 3;
t->fadeOut = 3;
t->fadeIn = 2;
t->fadeOut = 2;
t->waitIn = 0;
t->waitOut = 0;
t->pan = 0;
t->pitch = 1;
t->status = Status::PlayingOnce;
lastUserCueNumber += 10;
t->userNumber = lastUserCueNumber;
lastUserCueNumber++;
t->volume = 80;
t->stopAtEnd = true;
t->filePath = "";
t->duration = 0;
t->multi = false;
}
void CueTrackListWidget::createNewCueTrack()
@ -145,15 +153,20 @@ void CueTrackListWidget::createNewCueTrack()
CueTrack *t = new CueTrack;
cueTrackLoadDefaults(t);
EditCueTrackWidget dialog(t, this);
if (dialog.exec() == QDialog::Accepted)
if (dialog.exec() == QDialog::Accepted) {
t->active = false;
addCueTrack(t);
if (m_size == 1)
{
updateSelectedCueTrack(true);
emit changeSelectedIndex(0);
if (m_size == 1)
{
updateSelectedCueTrack(true);
emit changeSelectedIndex(0);
} else
redrawCueTrackList();
if (lastUserCueNumber < t->userNumber)
lastUserCueNumber = t->userNumber;
} else
redrawCueTrackList();
}
delete (t);
}
void CueTrackListWidget::editCueTrack()
{
@ -164,6 +177,8 @@ void CueTrackListWidget::editCueTrack()
redrawCueTrackList();
emit changeSelectedIndex(selectedIndex);
}
if (lastUserCueNumber < current->userNumber)
lastUserCueNumber = current->userNumber;
}
void CueTrackListWidget::deleteCueTrack()
@ -198,6 +213,8 @@ void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst)
dst->name = src->name;
dst->description = src->description;
dst->filePath = src->filePath;
dst->duration = src->duration;
dst->multi = src->multi;
}
QString *CueTrackListWidget::getFileName(std::string s)
@ -223,7 +240,7 @@ void CueTrackListWidget::redrawCueTrackList()
int selected = cueTracks.at(selectedIndex)->userNumber;
clearTableWidget();
tableWidget->setColumnCount(7);
QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"};
QStringList headers = {"Active", "Number","Channel", "Name", "Volume", "Status", "File"};
tableWidget->setHorizontalHeaderLabels(headers);
sortCueTrackList();
selectedIndex = 0;
@ -241,13 +258,9 @@ void CueTrackListWidget::redrawCueTrackList()
tableWidget->resizeRowsToContents();
tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0));
tableWidget->blockSignals(false);
emit changeSelectedIndex(selectedIndex);
}
#include <QFile>
#include <QXmlStreamReader>
#include <iostream>
#include <string>
void CueTrackListWidget::loadCueTrackList(std::string filename)
{
QFile file(QString::fromStdString(filename));
@ -258,6 +271,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
}
QXmlStreamReader xmlReader(&file);
clearCueTrackList();
lastUserCueNumber = 0;
while (!xmlReader.atEnd() && !xmlReader.hasError())
{
QXmlStreamReader::TokenType token = xmlReader.readNext();
@ -309,7 +323,12 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
t->waitOut = xmlReader.text().toInt();
}
else if (elementName == "stopAtEnd") {
t->stopAtEnd = xmlReader.text().toString().toLower() == "true";
QString tmp = xmlReader.text().toString().toLower();
if (tmp.compare("false"))
t->stopAtEnd = true;
else {
t->stopAtEnd = false;
}
}
else if (elementName == "name") {
t->name = xmlReader.text().toString().toStdString();
@ -319,6 +338,10 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
}
else if (elementName == "userNumber") {
t->userNumber = xmlReader.text().toInt();
if (t->userNumber > lastUserCueNumber)
{
lastUserCueNumber = t->userNumber;
}
}
else if (elementName == "entryPoint") {
t->entryPoint = xmlReader.text().toInt();
@ -329,9 +352,18 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
else if (elementName == "audioLayer") {
t->audioLayer = xmlReader.text().toInt();
}
else if (elementName == "active") {
t->active = xmlReader.text().toString().toLower() == "true";
}
else if (elementName == "duration") {
t->duration = xmlReader.text().toInt();
}
else if (elementName == "multi") {
QString tmp = xmlReader.text().toString().toLower();
if (tmp.compare("false"))
t->multi = true;
else {
t->multi = false;
}
}
t->active = false;
}
}
xmlReader.readNext();
@ -348,9 +380,6 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
redrawCueTrackList();
}
#include <fstream>
#include <string>
void CueTrackListWidget::saveCueTrackList(std::string filename)
{
std::ofstream file(filename);
@ -393,10 +422,11 @@ std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack)
xml += " <entryPoint>" + std::to_string(cueTrack.entryPoint) + "</entryPoint>\n";
xml += " <exitPoint>" + std::to_string(cueTrack.exitPoint) + "</exitPoint>\n";
xml += " <audioLayer>" + std::to_string(cueTrack.audioLayer) + "</audioLayer>\n";
xml += " <active>";
xml += (cueTrack.active ? "true" : "false");
xml += "</active>\n";
xml += " </CueTrack>\n";
xml += " <duration>" + std::to_string(cueTrack.duration) + "</duration>\n";
xml += " <multi>";
xml += (cueTrack.multi ? "true" : "false");
xml += "</multi>\n";
xml += " </CueTrack>\n";
return xml;
}
@ -444,7 +474,6 @@ void saveCueTrackToXml(const CueTrack& cueTrack, const QString& filename) {
xmlWriter.writeTextElement("entryPoint", QString::number(cueTrack.entryPoint));
xmlWriter.writeTextElement("exitPoint", QString::number(cueTrack.exitPoint));
xmlWriter.writeTextElement("audioLayer", QString::number(cueTrack.audioLayer));
xmlWriter.writeTextElement("active", cueTrack.active ? "true" : "false");
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
@ -507,9 +536,9 @@ CueTrack loadCueTrackFromXml(const QString& filename) {
cueTrack.exitPoint = xmlReader.readElementText().toInt();
} else if (elementName == "audioLayer") {
cueTrack.audioLayer = xmlReader.readElementText().toInt();
} else if (elementName == "active") {
cueTrack.active = xmlReader.readElementText() == "true";
}
} else if (elementName == "duration") {
cueTrack.duration = xmlReader.readElementText().toInt();
}
}
}
if (xmlReader.hasError()) {
@ -528,3 +557,39 @@ void CueTrackListWidget::clearTableWidget()
tableWidget->clear();
tableWidget->setRowCount(0);
}
void CueTrackListWidget::cueTrackAtEnd(int layer)
{
for (int i = 0; i < m_size; i++)
{
CueTrack * cur = cueTracks.at(i);
if (cur->audioLayer == layer)
{
cur->active = false;
}
}
redrawCueTrackList();
}
void CueTrackListWidget::copyCueTrack() {
if (selectedIndex >= 0 && selectedIndex < m_size) {
delete copiedCue;
copiedCue = new CueTrack(*cueTracks.at(selectedIndex));
}
}
void CueTrackListWidget::cutCueTrack() {
if (selectedIndex >= 0 && selectedIndex < m_size) {
delete copiedCue;
copiedCue = new CueTrack(*cueTracks.at(selectedIndex));
removeCueTrack(selectedIndex);
}
}
void CueTrackListWidget::pasteCueTrack() {
if (copiedCue != nullptr) {
CueTrack* newCue = new CueTrack(*copiedCue);
addCueTrack(newCue);
}
}

View file

@ -19,7 +19,7 @@ public:
explicit CueTrackListWidget(QWidget *parent = nullptr);
public slots:
CueTrack* getSelectedTrack();
CueTrack* getSelectedTrack(bool advance);
void createNewCueTrack();
void editCueTrack();
void deleteCueTrack();
@ -31,6 +31,8 @@ public slots:
void clearCueTrackList();
void setLastUserCueNumber(size_t n) { lastUserCueNumber = n; }
size_t getLastUserCueNumber() { return lastUserCueNumber; }
void cueTrackAtEnd(int layer);
void redrawCueTrackList();
private:
std::vector<CueTrack *> cueTracks;
@ -39,7 +41,8 @@ private:
int m_size = 0;
int size() { return m_size; }
int selectedIndex = 0;
size_t lastUserCueNumber = 0;
int lastUserCueNumber = 0;
CueTrack* copiedCue = nullptr;
private slots:
void addCueTrack(CueTrack* cue);
@ -52,12 +55,14 @@ private slots:
void cueTrackLoadDefaults(CueTrack * t);
void copyCueTrack(CueTrack *src, CueTrack *dst);
void sortCueTrackList();
void redrawCueTrackList();
void clearTableWidget();
std::string cueTrackToXml(const CueTrack& cueTrack);
void copyCueTrack();
void pasteCueTrack();
void cutCueTrack();
signals:
void changeSelectedIndex(int index);
void goAction(int channel);
};
#endif

94
src/cuetrackwidget.cpp Normal file
View file

@ -0,0 +1,94 @@
#include <QFileInfo>
#include "cuetrackwidget.h"
#include "ui_cuetrackwidget.h"
CueTrackWidget::CueTrackWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::CueTrackWidget)
{
ui->setupUi(this);
tlFade.setFrameRange(0, 100);
tlWaitIn.setFrameRange(0, 100);
tlWaitOut.setFrameRange(0, 100);
connect(&tlFade, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue);
connect(&tlWaitIn, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue);
connect(&tlWaitOut, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue);
connect(&tlFade, SIGNAL(finished()), this, SLOT(fadeSlot()));
connect(&tlWaitIn, SIGNAL(finished()), this, SLOT(waitInSlot()));
connect(&tlWaitOut, SIGNAL(finished()), this, SLOT(waitOutSlot()));
}
CueTrackWidget::~CueTrackWidget()
{
delete ui;
}
void CueTrackWidget::loadCueTrack(CueTrack* track)
{
ui->cueName->setText(track->name.data());
ui->cueNumber->display(track->userNumber);
ui->vol->display(track->volume);
ui->pan->display(track->pan);
ui->pitch->display(track->pitch);
ui->bus1->display(track->bus1);
ui->bus2->display(track->bus2);
ui->fade->setValue(track->fadeIn);
ui->waitIn->setValue(track->waitIn);
ui->waitOut->setValue(track->waitOut);
ui->halt->setChecked(track->stopAtEnd);
QFileInfo fileInfo(track->filePath.data());
fileInfo.fileName().truncate(64);
ui->mediaFileName->setText(fileInfo.fileName());
ui->status->setText(statusToString(track->status));
ui->audioLayer->display(track->audioLayer);
ui->multi->setChecked(track->multi);
}
void CueTrackWidget::go()
{
tlFade.stop();
tlWaitIn.stop();
tlWaitOut.stop();
ui->cueProgressBar->setValue(0);
if (ui->waitIn->value() > 0)
{
tlWaitIn.setDuration(ui->waitIn->value() * 1000);
tlWaitIn.start();
ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }");
} else {
waitInSlot();
}
}
void CueTrackWidget::waitInSlot()
{
emit goAction(ui->audioLayer->intValue());
tlFade.setDuration(ui->fade->value() * 1000);
tlFade.start();
ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #00FF00; }");
}
void CueTrackWidget::fadeSlot()
{
if (ui->waitOut->value() > 0) {
tlWaitOut.setDuration(ui->waitOut->value() * 1000);
tlWaitOut.start();
ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }");
} else {
waitOutSlot();
}
}
void CueTrackWidget::waitOutSlot()
{
ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #0000FF; }");
emit cueFinished(ui->audioLayer->intValue());
}
void CueTrackWidget::setNextCue()
{
ui->cueProgressBar->setDisabled(true);
ui->cueProgressBar->hide();
}

43
src/cuetrackwidget.h Normal file
View file

@ -0,0 +1,43 @@
#ifndef CUETRACKWIDGET_H
#define CUETRACKWIDGET_H
#include <QWidget>
#include <QTimeLine>
#include "defines.h"
#include "dialgroup.h"
namespace Ui {
class CueTrackWidget;
}
class CueTrackWidget : public QWidget
{
Q_OBJECT
public:
explicit CueTrackWidget(QWidget *parent = nullptr);
~CueTrackWidget();
private:
Ui::CueTrackWidget *ui;
QTimeLine tlFade;
QTimeLine tlWaitIn;
QTimeLine tlWaitOut;
public slots:
void loadCueTrack(CueTrack* track);
void go();
void setNextCue();
private slots:
void fadeSlot();
void waitInSlot();
void waitOutSlot();
signals:
void cueFinished(int layer);
void goAction(int layer);
};
#endif // CUETRACKWIDGET_H

780
src/cuetrackwidget.ui Normal file
View file

@ -0,0 +1,780 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CueTrackWidget</class>
<widget class="QWidget" name="CueTrackWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>502</width>
<height>329</height>
</rect>
</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">
<string>Cue Track</string>
</property>
<property name="windowIcon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/icon.png</normaloff>:/buttons/resources/icon.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</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="QLabel" name="mediaFileName">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>24</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>24</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</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 name="title">
<string notr="true"/>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint">
<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="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">
<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="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>Fade time in seconds</string>
</property>
<property name="accessibleName">
<string>Fade In </string>
</property>
<property name="accessibleDescription">
<string>Fade In Time in seconds</string>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="wrapping">
<bool>true</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="specialValueText">
<string/>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>false</bool>
</property>
<property name="prefix">
<string/>
</property>
<property name="suffix">
<string/>
</property>
<property name="maximum">
<double>99990000.000000000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::AdaptiveDecimalStepType</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<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">
<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>
</widget>
</item>
<item row="2" column="0">
<widget class="QTimeEdit" name="entryPoint">
<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>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>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<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>
</widget>
</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">
<size>
<width>24</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<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>
<width>32</width>
<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>
</property>
</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>
</item>
</layout>
</widget>
<tabstops>
<tabstop>waitOut</tabstop>
<tabstop>fade</tabstop>
<tabstop>entryPoint</tabstop>
<tabstop>exitPoint</tabstop>
<tabstop>waitIn</tabstop>
</tabstops>
<resources>
<include location="../lms-resources.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -65,7 +65,7 @@ constexpr const char* statusToString(Status e) noexcept
#include <QString>
static Status stringToStatus(QString *statusStr) {
if (!statusStr->compare("Stopped")) return Stopped;
if (!statusStr->compare("Stop")) return Stopped;
else if (!statusStr->compare("Paused") ) return Paused;
else if (!statusStr->compare("Play 1")) return PlayingOnce;
else if (!statusStr->compare("Play Loop")) return PlayingLoop;
@ -91,6 +91,7 @@ struct layerData {
int bus1Vol;
int bus2Vol;
float level;
int fade;
};
struct CueTrack {
@ -112,7 +113,9 @@ struct CueTrack {
int entryPoint; // 0 - 255
int exitPoint; // 0 - 255
int audioLayer; // internal audio layer used when cue is loaded
bool active;
bool active; // the cue is playing
int duration; // media duration in milliseconds
bool multi; // launch next cue at same time, not waiting for this to finish.
};
#endif // __cplusplus

67
src/dialgroup.cpp Normal file
View file

@ -0,0 +1,67 @@
#include <cmath>
#include <QWidget>
#include <QVBoxLayout>
#include "dialgroup.h"
DialGroup::DialGroup(QString name,
int min,
int max,
int decimals,
QWidget *parent)
: QWidget(parent)
{
QVBoxLayout *layout = new QVBoxLayout;
layout->setAlignment(Qt::AlignHCenter);
layout->setContentsMargins(0, 0, 0, 0);
slider.setFocusPolicy(Qt::NoFocus);
slider.setRange(min, max);
slider.setValue(min + max / 2);
slider.setToolTip(name);
slider.setContentsMargins(0, 0, 0, 0);
/*
slider.setMinimumHeight(0);
slider.setSingleStep(1);
slider.setMinimumWidth(50);
slider.setStyleSheet("QDial {"
"border: 1px solid #aa8895;"
"background: #20182d;"
"margin: 0px;}"
"QSlider::groove:vertical {"
"border: 1px solid #999999;"
"width: 25px;}"
"QDial::tickmarks:vertical {"
"background-color: black;"
"background: red;"
"color: white;}"
*/
valueBox.setFocusPolicy(Qt::NoFocus);
valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons);
valueBox.setMinimumWidth(50);
valueBox.setRange(min, max);
valueBox.setValue(0);
valueBox.setDecimals(decimals);
valueBox.setObjectName(name);
valueBox.setToolTip(name);
valueBox.setAlignment(Qt::AlignHCenter);
valueBox.setContentsMargins(0, 0, 0, 0);
layout->addWidget(&slider);
layout->addWidget(&valueBox);
/* this->setStyleSheet("border: 1px solid #998090;"
"background-color: black;"
"margin: 1px;"
);*/
layout->setSpacing(0);
layout->setContentsMargins(0, 0, 0, 0);
this->setLayout(layout);
slider.setObjectName(name);
}
void DialGroup::setValue(float value)
{
slider.blockSignals(true);
valueBox.blockSignals(true);
slider.setValue(value);
valueBox.setValue(value);
slider.blockSignals(false);
valueBox.blockSignals(false);
}

30
src/dialgroup.h Normal file
View file

@ -0,0 +1,30 @@
#ifndef DIALGROUP_H
#define DIALGROUP_H
#include <QObject>
#include <QWidget>
#include <QDebug>
#include <QDial>
#include "clickabledoublespinbox.h"
class DialGroup : public QWidget
{
Q_OBJECT
public:
explicit DialGroup(QString name,
int min,
int max,
int decimals,
QWidget *parent = nullptr);
public slots:
void setValue(float value);
private:
QDial slider;
ClickableDoubleSpinBox valueBox;
};
#endif

View file

@ -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;
}

View file

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

View file

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

View file

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

View file

@ -139,8 +139,6 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
#ifndef NOGUI
if (m_ui) {
m_lmsUi->m_aw->filterParamChanged(layer, channel, value);
m_played.clear();
m_played.append(m_ola->getValue(layer, DMX_FILE));
}
#endif
}
@ -172,14 +170,16 @@ void libreMediaServerAudio::refreshUi() {
}
m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i));
if (m_mae.getAtEnd(i)) {
if (m_currentStatus[i] == Status::PlayingOnce) {
if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) {
m_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
m_lmsUi->m_showPlayer->cueTrackAtEnd(i);
}
if (m_currentStatus[i] == Status::PlayingFolder) {
uint last = m_played.last();
uint last = 0;
if (!m_played.isEmpty())
last = m_played.last() + 1;
int folder = m_ola->getValue(i, DMX_FOLDER);
last++;
if (last < m_mediaLibrary->getMediaFolderCount(folder)) {
this->loadMedia(i, folder, last);
m_mae.playbackChanged(i, Status::PlayingFolder);
@ -187,6 +187,7 @@ void libreMediaServerAudio::refreshUi() {
else {
m_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
m_lmsUi->m_showPlayer->cueTrackAtEnd(i);
}
}
else if (m_currentStatus[i] == Status::PlayingFolderLoop) {
@ -227,7 +228,8 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
connect(m_lmsUi->m_aw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status)));
connect(m_lmsUi->m_aw, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status)));
connect(m_lmsUi->m_showPlayer, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString)));
m_refreshUi = new QTimer(this);
connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi()));
@ -298,4 +300,14 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile)
qWarning() << "ui load media error" << result << "file" << mediaFile << "layer" << layer;
}
}
void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int ms)
{
switch (s){
case Slider::Volume:
m_mae.volChanged(layer, value, ms);
m_updateUi[layer][0] = value;
break;
}
}
#endif

View file

@ -66,6 +66,7 @@ private:
private slots:
void refreshUi();
void uiSliderChanged(int layer, Slider s, int value);
void uiSliderChangedFaded(int layer, Slider s, int value, int ms);
void uiPlaybackChanged(int layer, Status s);
void uiLoadMedia(int layer, QString s);

View file

@ -434,8 +434,15 @@ ma_result MiniAudioEngine::printFormatInfo(int layer)
// Expects between 0 and 65535 vol value
void MiniAudioEngine::volChanged(int layer, int vol)
{
volChanged(layer, vol, FADE_TIME);
}
// Expects between 0 and 65535 vol value and fade time in milliseconds
void MiniAudioEngine::volChanged(int layer, int vol, int ms)
{
m_mae.currentStatus[layer].vol = vol;
m_mae.currentStatus[layer].fade = ms;
if (m_mae.mediaLoaded[layer] != MA_TRUE)
return;
if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated)
@ -445,9 +452,10 @@ void MiniAudioEngine::volChanged(int layer, int vol)
db = 0;
} else
db = ma_volume_db_to_linear(db);
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, FADE_TIME);
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, ms);
}
void MiniAudioEngine::panChanged(int layer, float value)
{
float result;
@ -507,7 +515,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status)
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0.000001f, 0.000000f, FADE_TIME);
if (m_mae.currentStatus[layer].cursor > 0)
usleep(FADE_TIME * 1500); // avoid glitch when seeking
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, FADE_TIME * 2);
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fade);
default:
break;
}

View file

@ -64,6 +64,7 @@ public:
bool startEngine(uint layersQty, uint* audioDevicesID, uint audioDevicesQty);
ma_result loadMedia(int layer, char *media);
void volChanged(int layer, int vol);
void volChanged(int layer, int vol, int ms);
void panChanged(int layer, float pan);
void pitchChanged(int layer, float pitch);
ma_result playbackChanged(int layer, Status status);

View file

@ -12,11 +12,12 @@ ShowPlayer::ShowPlayer(QWidget *parent) :
connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList()));
connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList()));
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
filesLoaded = 0;
connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(updateIndex(int)));
currentStatus = Status::Iddle;
for(int i = 0; i < MAX_LAYERS; i++)
for(int i = 0; i < MAX_LAYERS; i++) {
layersUsed[i] = -1;
connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(changeSelectedIndex(int)));
cueTrackWidgetPlaying[i] = nullptr;
}
}
ShowPlayer::~ShowPlayer() {}
@ -27,48 +28,52 @@ void ShowPlayer::onAddTrack() {
void ShowPlayer::go()
{
ui->activeCueNumber->display(lastIndex);
CueTrack* current = ui->cueListWidget->getSelectedTrack();
if (!current)
CueTrack *goCue = ui->cueListWidget->getSelectedTrack(true);
if (!goCue)
return;
if (current->audioLayer < 0)
return;
ui->activeCueLabel->setText(current->name.data());
for (int i = 0; i < MAX_LAYERS; i++) {
if (layersUsed[i] == -1) {
layersUsed[i] = current->userNumber;
break;
}
current[goCue->audioLayer] = goCue;
playCueTrack(goCue);
if (goCue->multi)
go();
}
void ShowPlayer::goAction(int c)
{
if (!current[c]->filePath.empty()) {
emit uiLoadMedia(current[c]->audioLayer, current[c]->filePath.data());
ui->cueListWidget->cueTrackAtEnd(c);
}
if (!current->filePath.empty())
emit uiLoadMedia(current->audioLayer, current->filePath.data());
updateTrackStateInEngine(current);
emit uiPlaybackChanged(current->audioLayer, current->status);
filesLoaded++;
updateTrackStateInEngine(current[c]);
emit uiPlaybackChanged(current[c]->audioLayer, current[c]->status);
switch (current[c]->status) {
case Status::PlayingOnce:
case Status::PlayingLoop:
case Status::PlayingFolder:
case Status::PlayingFolderLoop:
case Status::PlayingFolderRandom:
current[c]->active = true;
layersUsed[current[c]->audioLayer] = current[c]->userNumber;
break;
default:
current[c]->active = false;
}
ui->cueListWidget->redrawCueTrackList();
}
void ShowPlayer::updateTrackStateInEngine(CueTrack *track) {
emit uiSliderChanged(track->audioLayer, Slider::Volume, track->volume * 655.35);
emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000);
emit uiSliderChanged(track->audioLayer, Slider::Pan, (track->pan + 1) * 128);
emit uiSliderChanged(track->audioLayer, Slider::Pitch, track->pitch * 128);
emit uiSliderChanged(track->audioLayer, Slider::Bus1, track->bus1 * 255 * 2.55);
emit uiSliderChanged(track->audioLayer, Slider::Bus2, track->bus2 * 255 * 2.55);
}
void ShowPlayer::changeSelectedIndex(int i)
{
CueTrack *t = ui->cueListWidget->getTrackAtIndex(i);
ui->nextCueNumber->display(t->userNumber);
ui->nextCueLabel->setText(t->name.data());
lastIndex = t->userNumber;
}
void ShowPlayer::loadCueTrackList()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("XML Files (*.xml)"));
if (fileName.isEmpty())
return;
ui->cueListWidget->loadCueTrackList(fileName.toStdString());
ui->cueListWidget->loadCueTrackList(fileName.toStdString());
}
void ShowPlayer::saveCueTrackList()
@ -78,3 +83,64 @@ void ShowPlayer::saveCueTrackList()
return;
ui->cueListWidget->saveCueTrackList(fileName.toStdString());
}
void ShowPlayer::cueTrackAtEnd(int layer)
{
current[layer]->active = false;
ui->cueListWidget->cueTrackAtEnd(layer);
removeCueTrackWidget(layer);
}
void ShowPlayer::cueFinished(int c)
{
if (!current[c])
return;
if (!current[c]->stopAtEnd)
this->go();
if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused)
cueTrackAtEnd(c);
}
CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) {
QListWidgetItem* item = new QListWidgetItem(ui->activeCueList);
CueTrackWidget* widget = new CueTrackWidget();
widget->loadCueTrack(track);
connect(widget, SIGNAL(goAction(int)), this, SLOT(goAction(int)));
connect(widget, SIGNAL(cueFinished(int)), this, SLOT(cueFinished(int)));
cueTrackWidgetPlaying[track->audioLayer] = widget;
item->setSizeHint(widget->sizeHint());
ui->activeCueList->setItemWidget(item, widget);
return (widget);
}
void ShowPlayer::playCueTrack(CueTrack* track) {
removeCueTrackWidget(track->audioLayer);
CueTrackWidget *widget = addCueTrackWidget(track);
widget->go();
}
void ShowPlayer::removeCueTrackWidget(int audioLayer) {
CueTrackWidget* widgetToRemove = cueTrackWidgetPlaying[audioLayer];
if (widgetToRemove != NULL && ui->activeCueList->count() > 0) {
for (int i = 0; i < ui->activeCueList->count(); ++i) {
QListWidgetItem* item = ui->activeCueList->item(i);
QWidget* widget = ui->activeCueList->itemWidget(item);
if (widget == widgetToRemove) {
ui->activeCueList->removeItemWidget(item);
delete item;
delete widgetToRemove;
break;
}
}
cueTrackWidgetPlaying[audioLayer] = nullptr;
}
}
void ShowPlayer::updateIndex(int index) {
if (index < 0)
return;
CueTrack *track = ui->cueListWidget->getSelectedTrack(false);
if (track) {
ui->nextCue->loadCueTrack(track);
}
}

View file

@ -9,6 +9,8 @@
#include "defines.h"
#include "cuetracklistwidget.h"
#include "cuetrackwidget.h"
#include "dialgroup.h"
#include "settings.h"
#include "ui_showplayer.h"
@ -24,25 +26,33 @@ public:
explicit ShowPlayer(QWidget *parent = nullptr);
~ShowPlayer();
public slots:
void cueTrackAtEnd(int layer);
private:
Ui::ShowPlayer *ui;
Status currentStatus = Status::Iddle;
size_t filesLoaded = 0;
int layersUsed[MAX_LAYERS];
int lastIndex = 0;
void updateTrackStateInEngine(CueTrack *track);
CueTrack *current[MAX_LAYERS];
CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS];
CueTrackWidget *addCueTrackWidget(CueTrack *track);
private slots:
void updateTrackStateInEngine(CueTrack *track);
void onAddTrack();
void go();
void changeSelectedIndex(int i);
void loadCueTrackList();
void saveCueTrackList();
void cueFinished(int channel);
void removeCueTrackWidget(int index);
void playCueTrack(CueTrack *track);
void goAction(int channel);
void updateIndex(int index);
signals:
void uiPlaybackChanged(int layer, Status s);
void uiSliderChanged(int layer, Slider s, int vol);
void uiSliderChangedFaded(int layer, Slider s, int vol, int ms);
void uiLoadMedia(int layer, QString s);
};

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>743</width>
<height>671</height>
<width>800</width>
<height>802</height>
</rect>
</property>
<property name="sizePolicy">
@ -19,137 +19,50 @@
<property name="windowTitle">
<string>Show Player</string>
</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">
<item>
<widget class="QSplitter" name="splitter">
<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">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<widget class="QSplitter" name="splitter_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</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">
<layout class="QHBoxLayout" name="ButtonToolBarLayout">
<layout class="QHBoxLayout" name="ButtonToolBarLayout" stretch="0,0,0,0,0,0,0,0">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="leftMargin">
<number>100</number>
<number>0</number>
</property>
<property name="rightMargin">
<number>100</number>
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="LoadCueList">
<property name="toolTip">
<string>Load Cue List</string>
</property>
<property name="text">
<string>...</string>
<string>Load CueList</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/load_button.png</normaloff>../resources/load_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/load_button.png</normaloff>:/buttons/resources/load_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -161,12 +74,15 @@
</item>
<item>
<widget class="QToolButton" name="SaveCueList">
<property name="toolTip">
<string>Save Cue List</string>
</property>
<property name="text">
<string>...</string>
<string>Save CueList.</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/save_button.png</normaloff>../resources/save_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/save_button.png</normaloff>:/buttons/resources/save_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -184,12 +100,21 @@
</item>
<item>
<widget class="QToolButton" name="CopyCue">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>32</horstretch>
<verstretch>32</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Copy Cue</string>
</property>
<property name="text">
<string>...</string>
<string>Copy Cue</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/copy_button.png</normaloff>../resources/copy_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/copy_button.png</normaloff>:/buttons/resources/copy_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -202,17 +127,17 @@
<item>
<widget class="QToolButton" name="CutCue">
<property name="toolTip">
<string>Load Cue List</string>
<string>Cut Cue</string>
</property>
<property name="accessibleName">
<string>Load Cue List</string>
</property>
<property name="text">
<string>...</string>
<string>Cut Cue</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/cut_button.png</normaloff>../resources/cut_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/cut_button.png</normaloff>:/buttons/resources/cut_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -224,12 +149,15 @@
</item>
<item>
<widget class="QToolButton" name="PasteCue">
<property name="toolTip">
<string>Paste Cue</string>
</property>
<property name="text">
<string>...</string>
<string>Paste Cue</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/paste_button.png</normaloff>../resources/paste_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/paste_button.png</normaloff>:/buttons/resources/paste_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -244,12 +172,15 @@
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>New Cue</string>
</property>
<property name="text">
<string>...</string>
<string>New Cue</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/new_button.png</normaloff>../resources/new_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/new_button.png</normaloff>:/buttons/resources/new_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -264,12 +195,15 @@
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Edit Cue</string>
</property>
<property name="text">
<string>...</string>
<string>Edit Cue</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/edit_button.png</normaloff>../resources/edit_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/edit_button.png</normaloff>:/buttons/resources/edit_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -284,12 +218,15 @@
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Remove Cue</string>
</property>
<property name="text">
<string>...</string>
<string>Delete Cue</string>
</property>
<property name="icon">
<iconset>
<normaloff>../resources/remove_button.png</normaloff>../resources/remove_button.png</iconset>
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/delete_button.png</normaloff>:/buttons/resources/delete_button.png</iconset>
</property>
<property name="iconSize">
<size>
@ -301,25 +238,101 @@
</item>
</layout>
</widget>
<widget class="CueTrackListWidget" name="cueListWidget" native="true">
<property name="enabled">
<bool>true</bool>
<widget class="QSplitter" name="splitter_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="inputMethodHints">
<set>Qt::ImhPreferLowercase</set>
<widget class="QPushButton" name="goButton">
<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/>
</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>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
<widget class="CueTrackWidget" name="nextCue" native="true"/>
<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>
</item>
@ -332,13 +345,20 @@
<header>src/cuetracklistwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>CueTrackWidget</class>
<extends>QWidget</extends>
<header>src/cuetrackwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>cueListWidget</tabstop>
<tabstop>NewCue</tabstop>
<tabstop>EditCue</tabstop>
<tabstop>RemoveCue</tabstop>
</tabstops>
<resources/>
<resources>
<include location="../lms-resources.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -38,16 +38,16 @@ SliderGroup::SliderGroup(QString name,
"margin: 0px;}"
"QSlider::groove:vertical {"
"border: 1px solid #999999;"
"width: 25px;"
"margin: -4px;}"
"width: 25px;}"
"QSlider::handle:vertical {"
"background: white;"
"border: 1px solid #5c5c5c;"
"border: 2px solid #5c5c5c;"
"width: 29px;"
"height: 7px;"
"margin: -2px;"
"height: 10px;"
"border-radius: 2px;}"
"Qslider::tickmarks:vertical {background: white;"
"Qslider::tickmarks:vertical {"
"background-color: black;"
"background: red;"
"color: white;}"
"QSlider::add-page:vertical {background: blue;}"
"QSlider::sub-page:vertical {background: #20182d;}");