Compare commits

...

3 commits

Author SHA1 Message Date
snt
52b44a4d7c wip cue list básica en una capa. 2024-06-17 19:12:05 +02:00
snt
647b75f168 mend 2024-06-16 18:17:47 +02:00
snt
9c97f20470 wip show player 2024-06-16 18:15:27 +02:00
21 changed files with 89715 additions and 21 deletions

2
.gitignore vendored
View file

@ -44,3 +44,5 @@ log/**
*~
*.autosave
*.vscode*

View file

@ -2,12 +2,15 @@ TEMPLATE = app
TARGET = libremediaserver-audio
QT += webkitwidgets widgets
HEADERS += src/libremediaserver-audio.h \
src/cuetracklistwidget.h \
src/cuetrackwidget.h \
src/showplayer.h \
src/clickabledoublespinbox.h \
src/clickablelabel.h \
src/clickableslider.h \
src/dmxwidget.h \
src/filterbankwidget.h \
src/libremediaserver-audio-gui.h \
src/libremediaserver-audio-ui.h \
src/ma_writer_node.h \
src/main.h \
src/medialibrary.h \
@ -20,14 +23,17 @@ HEADERS += src/libremediaserver-audio.h \
src/audiowidget.h \
src/defines.h \
src/settings.h \
src/slidergroup.h
src/slidergroup.h \
src/trackdialog.h
SOURCES += src/main.cpp \
src/cuetrackwidget.cpp \
src/showplayer.cpp \
src/clickabledoublespinbox.cpp \
src/clickablelabel.cpp \
src/clickableslider.cpp \
src/dmxwidget.cpp \
src/filterbankwidget.cpp \
src/libremediaserver-audio-gui.cpp \
src/libremediaserver-audio-ui.cpp \
src/libremediaserver-audio.cpp \
src/medialibrary.cpp \
src/miniaudio.c \
@ -37,14 +43,16 @@ SOURCES += src/main.cpp \
src/audiolayerwidget.cpp \
src/audiowidget.cpp \
src/settings.cpp \
src/slidergroup.cpp
FORMS += src/libremediaserver-audio-gui.ui
src/slidergroup.cpp \
src/trackdialog.cpp
FORMS += \
src/showplayer.ui \
src/libremediaserver-audio-ui.ui
CCFLAG += -msse2 -mavx2
QMAKE_CXXFLAGS += $$(CXXFLAG)
QMAKE_CFLAGS += $$(CCFLAG)
QMAKE_LFLAGS += $$(LDFLAG)
LIBS += -lola -lolacommon -ldl -lpthread -lm
# -lcitp
OTHER_FILES += \
LICENSE.txt \
docs/compiling.txt \

23
src/.qmake.stash Normal file
View file

@ -0,0 +1,23 @@
QMAKE_CXX.QT_COMPILER_STDCXX = 201703L
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 11
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 4
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_GCC_MAJOR_VERSION \
QMAKE_GCC_MINOR_VERSION \
QMAKE_GCC_PATCH_VERSION
QMAKE_CXX.INCDIRS = \
/usr/include/c++/11 \
/usr/include/x86_64-linux-gnu/c++/11 \
/usr/include/c++/11/backward \
/usr/lib/gcc/x86_64-linux-gnu/11/include \
/usr/local/include \
/usr/include/x86_64-linux-gnu \
/usr/include
QMAKE_CXX.LIBDIRS = \
/usr/lib/gcc/x86_64-linux-gnu/11 \
/usr/lib/x86_64-linux-gnu \
/usr/lib \
/lib/x86_64-linux-gnu \
/lib

View file

@ -19,7 +19,6 @@ public:
explicit AudioLayerWidget(QWidget *parent = 0, int layer = 0);
~AudioLayerWidget();
// From OLA -> LibreMediaServer -> AudioWidget
void setMediaFile(QString file);
void setDuration(float dur);
void setCurrentTime(float progress);

94
src/cuetracklistwidget.h Normal file
View file

@ -0,0 +1,94 @@
#ifndef CUETRACKLISTWIDGET_H
#define CUETRACKLISTWIDGET_H
#include <QWidget>
#include <QScrollArea>
#include <QEvent>
#include <QKeyEvent>
#include <QShortcut>
#include "cuetrackwidget.h"
class CueTrackListWidget : public QWidget {
Q_OBJECT
public:
size_t m_size = 0;
size_t size() const { return m_size; }
size_t selectedIndex = 0;
explicit CueTrackListWidget(QWidget *parent = nullptr) : QWidget(parent) {
layout = new QVBoxLayout();
containerWidget = new QWidget();
containerWidget->setLayout(layout);
scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(containerWidget);
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(scrollArea);
layout->setAlignment(Qt::AlignTop);
setLayout(mainLayout);
QShortcut *shortcut_up = new QShortcut(QKeySequence("Up"), parent);
QObject::connect(shortcut_up, SIGNAL(activated()), this, SLOT(key_up()));
QShortcut *shortcut_down = new QShortcut(QKeySequence("Down"), parent);
QObject::connect(shortcut_down, SIGNAL(activated()), this, SLOT(key_down()));
}
void addCueTrackWidget(CueTrackWidget* widget) {
widget->setParent(containerWidget);
layout->addWidget(widget);
widget->show();
m_size++;
containerWidget->update();
containerWidget->adjustSize();
}
void removeCueTrackWidget(size_t index) {
if (index >= m_size) return;
QLayoutItem* item = layout->takeAt(index);
if (item) {
delete item->widget();
delete item;
m_size--;
}
}
CueTrackWidget* getTrackAtIndex(size_t index) {
if (index < m_size) {
return qobject_cast<CueTrackWidget*>(layout->itemAt(index)->widget());
}
return nullptr;
}
CueTrackWidget* getSelectedTrack() {
CueTrackWidget* track = getTrackAtIndex(selectedIndex);
key_down();
return track;
}
private:
QScrollArea* scrollArea;
QWidget* containerWidget;
QVBoxLayout* layout;
private slots:
void key_up() {
if (m_size > 0 && selectedIndex > 0) {
getTrackAtIndex(selectedIndex)->highlight(false);
selectedIndex--;
getTrackAtIndex(selectedIndex)->highlight(true);
}
}
void key_down() {
if (selectedIndex < m_size - 1 && m_size > 0) {
getTrackAtIndex(selectedIndex)->highlight(false);
selectedIndex++;
getTrackAtIndex(selectedIndex)->highlight(true);
}
}
};
#endif

178
src/cuetrackwidget.cpp Normal file
View file

@ -0,0 +1,178 @@
#include "cuetrackwidget.h"
#include <QSplitter>
CueTrackWidget::CueTrackWidget(QWidget *parent) : QWidget(parent) {
setupUi();
}
void CueTrackWidget::setupUi() {
QVBoxLayout *layout = new QVBoxLayout(this);
QSplitter *row = new QSplitter(Qt::Horizontal);
active = new QCheckBox(this);
row->addWidget(active);
userNumberSpin = new QSpinBox(this);
userNumberSpin->setRange(0, 1000);
userNumberSpin->setToolTip("Cue user number");
row->addWidget(userNumberSpin);
nameEdit = new QLineEdit(this);
nameEdit->setToolTip("Cue Name");
row->addWidget(nameEdit);
descriptionEdit = new QLineEdit(this);
descriptionEdit->setToolTip("Cue Notes");
row->addWidget(descriptionEdit);
filePathEdit = new QLineEdit(this);
filePathEdit->setToolTip("File name");
row->addWidget(filePathEdit);
layout->addWidget(row);
row = new QSplitter(Qt::Horizontal);
volumeSpin = new QSpinBox(this);
volumeSpin->setRange(0, 65535);
volumeSpin->setToolTip("Volume");
volumeSpin->setValue(100);
row->addWidget(volumeSpin);
bus1Spin = new QSpinBox(this);
bus1Spin->setRange(0, 255);
bus1Spin->setToolTip("Bus 1");
bus1Spin->setValue(255);
row->addWidget(bus1Spin);
bus2Spin = new QSpinBox(this);
bus2Spin->setRange(0, 255);
bus2Spin->setToolTip("Bus 2");
bus2Spin->setValue(255);
row->addWidget(bus2Spin);
panSpin = new QSpinBox(this);
panSpin->setRange(0, 255);
panSpin->setToolTip("Pan");
panSpin->setValue(128);
row->addWidget(panSpin);
pitchSpin = new QSpinBox(this);
pitchSpin->setRange(0, 255);
pitchSpin->setToolTip("Pitch");
pitchSpin->setValue(128);
row->addWidget(pitchSpin);
entryPointSpin = new QSpinBox(this);
entryPointSpin->setRange(0, 255);
entryPointSpin->setToolTip("Entry Point");
row->addWidget(entryPointSpin);
exitPointSpin = new QSpinBox(this);
exitPointSpin->setRange(0, 255);
exitPointSpin->setToolTip("Exit Point");
exitPointSpin->setValue(255);
row->addWidget(exitPointSpin);
layout->addWidget(row);
row = new QSplitter(Qt::Horizontal);
setupStatusCombo();
statusCombo->setToolTip("Playback Status");
row->addWidget(statusCombo);
fadeInSpin = new QSpinBox(this);
fadeInSpin->setRange(0, 10000);
fadeInSpin->setToolTip("Fade In Time");
fadeInSpin->setValue(3);
row->addWidget(fadeInSpin);
fadeOutSpin = new QSpinBox(this);
fadeOutSpin->setRange(0, 10000);
fadeOutSpin->setToolTip("Fade Out Time");
fadeOutSpin->setValue(3);
row->addWidget(fadeOutSpin);
waitInSpin = new QSpinBox(this);
waitInSpin->setRange(0, 10000);
waitInSpin->setToolTip("Wait In Time");
row->addWidget(waitInSpin);
waitOutSpin = new QSpinBox(this);
waitOutSpin->setRange(0, 10000);
waitOutSpin->setToolTip("Wait Out Time");
row->addWidget(waitOutSpin);
stopAtEndCheck = new QCheckBox(this);
stopAtEndCheck->setToolTip("Halt");
stopAtEndCheck->setChecked("True");
row->addWidget(stopAtEndCheck);
layout->addWidget(row);
setLayout(layout);
}
QWidget *CueTrackWidget::createHeader()
{
QWidget *ret = new QWidget();
auto layout = new QHBoxLayout(this);
QLabel *l = new QLabel("Cue Number");
layout->addWidget(l);
l = new QLabel("File Path");
layout->addWidget(l);
l = new QLabel("Volume");
layout->addWidget(l);
l = new QLabel("Bus 1");
layout->addWidget(l);
l = new QLabel("Bus 2");
layout->addWidget(l);
l = new QLabel("Pan");
layout->addWidget(l);
l = new QLabel("Pitch");
layout->addWidget(l);
l = new QLabel("Playback Status");
layout->addWidget(l);
l = new QLabel("Fade In");
layout->addWidget(l);
l = new QLabel("Fade Out");
layout->addWidget(l);
l = new QLabel("Wait In");
layout->addWidget(l);
l = new QLabel("Wait Out ");
layout->addWidget(l);
l = new QLabel("Halt");
layout->addWidget(l);
l = new QLabel("Name");
layout->addWidget(l);
l = new QLabel("Notes");
layout->addWidget(l);
l = new QLabel("Entry Point");
layout->addWidget(l);
l = new QLabel("Exit Point");
layout->addWidget(l);
ret->setLayout(layout);
return ret;
}
void CueTrackWidget::setupStatusCombo() {
statusCombo = new QComboBox(this);
statusCombo->addItem("Stopped", Stopped);
statusCombo->addItem("Paused", Paused);
statusCombo->addItem("PlayingOnce", PlayingOnce);
statusCombo->addItem("PlayingLoop", PlayingLoop);
statusCombo->addItem("Iddle", Iddle);
statusCombo->addItem("PlayingFolder", PlayingFolder);
statusCombo->addItem("PlayingFolderLoop", PlayingFolderLoop);
statusCombo->addItem("PlayingFolderRandom", PlayingFolderRandom);
}
CueTrack CueTrackWidget::saveCueTrack() const {
CueTrack cueTrack;
cueTrack.filePath = filePathEdit->text().toStdString();
cueTrack.volume = volumeSpin->value();
// Guarda el resto de los campos aquí...
cueTrack.status = static_cast<Status>(statusCombo->currentData().toInt());
return cueTrack;
}

72
src/cuetrackwidget.h Normal file
View file

@ -0,0 +1,72 @@
#ifndef CUETRACKWIDGET_H
#define CUETRACKWIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QSpinBox>
#include <QComboBox>
#include <QFormLayout>
#include <QCheckBox>
#include <QLabel>
#include "defines.h"
class CueTrackWidget : public QWidget {
Q_OBJECT
public:
explicit CueTrackWidget(QWidget *parent = nullptr);
CueTrack saveCueTrack() const;
QWidget *createHeader();
int audioLayer = 0;
int getVolume() const { return volumeSpin->value(); }
int getPan() const { return panSpin->value(); }
int getPitch() const { return pitchSpin->value(); }
int getBus1() const { return bus1Spin->value(); }
int getBus2() const { return bus2Spin->value(); }
Status getStatus() const { return static_cast<Status>(statusCombo->currentIndex()); }
QString getFilePath() const { return filePathEdit->text(); }
void setFilePath(QString text) const { filePathEdit->setText(text);};
int getFadeIn() const { return fadeInSpin->value(); }
int getFadeOut() const { return fadeOutSpin->value(); }
int getWaitIn() const { return waitInSpin->value(); }
int getWaitOut() const { return waitOutSpin->value(); }
bool getStopAtEnd() const { return stopAtEndCheck->isChecked(); }
QString getName() const { return nameEdit->text(); }
QString getDescription() const { return descriptionEdit->text(); }
int getUserNumber() const { return userNumberSpin->value(); }
int getEntryPoint() const { return entryPointSpin->value(); }
int getExitPoint() const { return exitPointSpin->value(); }
void highlight(bool highlight) {
if (highlight)
this->setStyleSheet("background-color: yellow;");
else
this->setStyleSheet("background-color: white;");
}
private:
QCheckBox* active;
QLineEdit* filePathEdit;
QSpinBox* volumeSpin;
QSpinBox* panSpin;
QSpinBox* pitchSpin;
QSpinBox* bus1Spin;
QSpinBox* bus2Spin;
QComboBox* statusCombo;
QSpinBox* fadeOutSpin;
QSpinBox* fadeInSpin;
QSpinBox* waitInSpin;
QSpinBox* waitOutSpin;
QCheckBox* stopAtEndCheck;
QLineEdit* nameEdit;
QLineEdit* descriptionEdit;
QSpinBox* userNumberSpin;
QSpinBox* entryPointSpin;
QSpinBox* exitPointSpin;
void setupUi();
void setupStatusCombo();
};
#endif // CUETRACKWIDGET_H

View file

@ -59,10 +59,23 @@ constexpr const char* statusToString(Status e) noexcept
case Status::PlayingFolderLoop: return "Play Folder Loop";
case Status::PlayingFolderRandom: return "Playing Folder Random";
default: return "--++--";
}
}
}
#include <QString>
static Status stringToStatus(QString *statusStr) {
if (statusStr->compare("Stopped")) return Stopped;
else if (statusStr->compare("Paused")) return Paused;
else if (statusStr->compare("PlayingOnce")) return PlayingOnce;
else if (statusStr->compare("PlayingLoop")) return PlayingLoop;
else if (statusStr->compare("Iddle")) return Iddle;
else if (statusStr->compare("PlayingFolder")) return PlayingFolder;
else if (statusStr->compare("PlayingFolderLoop")) return PlayingFolderLoop;
else if (statusStr->compare("PlayingFolderRandom")) return PlayingFolderRandom;
else return Stopped; // Valor por defecto o manejar como error
}
struct layerData {
QString media;
Status status;
@ -79,5 +92,27 @@ struct layerData {
int bus2Vol;
float level;
};
struct CueTrack {
std::string filePath;
int volume = 0; // 0 - 65535 ToDo: change to db -85 - 0
int pan = 128; // 0 - 255
int pitch = 128; // 0 - 255
int bus1 = 255; // 0 - 255
int bus2 = 255; // 0 - 255
Status status;
int fadeOut = 3; // ToDo: change to float or milliseconds
int fadeIn = 3;
int waitIn = 0;
int waitOut = 0;
bool stopAtEnd = false; // trigger next cue when this is executed
std::string name;
std::string description;
int userNumber; // cue user id
int entryPoint; // 0 - 255
int exitPoint; // 0 - 255
int audioLayer; // internal audio layer used when cue is loaded
};
#endif // __cplusplus
#endif // DEFINES_H

View file

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "libremediaserver-audio-gui.h"
#include "libremediaserver-audio-ui.h"
libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent)
@ -35,6 +35,7 @@ libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent)
topWidget->setContentsMargins(0, 0, 0, 0);
addDockWidget(Qt::TopDockWidgetArea, topWidget);
connect(ui.actionLaunch_OLA_Setup, SIGNAL(triggered()), this, SLOT(olasetup()));
connect(ui.actionLaunchShowPlayer, SIGNAL(triggered()), this, SLOT(launchShowPlayerWindow()));
this->setContentsMargins(0, 0, 0, 0);
this->setStyleSheet(
"margin: 0px;"
@ -43,6 +44,7 @@ libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent)
"selection-color: blue;"
"selection-background-color: green"
);
m_showPlayer = new ShowPlayer();
}
libreMediaServerAudioUi::~libreMediaServerAudioUi()
@ -55,3 +57,9 @@ void libreMediaServerAudioUi::olasetup()
view->load(QUrl("http://localhost:9090/ola.html"));
view->show();
}
void libreMediaServerAudioUi::launchShowPlayerWindow()
{
qDebug() << "launch show player";
m_showPlayer->show();
}

View file

@ -26,7 +26,8 @@
#include "audiowidget.h"
#include "dmxwidget.h"
#include "defines.h"
#include "ui_libremediaserver-audio-gui.h"
#include "showplayer.h"
#include "ui_libremediaserver-audio-ui.h"
class libreMediaServerAudioUi : public QMainWindow
{
@ -37,12 +38,14 @@ public:
virtual ~libreMediaServerAudioUi();
AudioWidget *m_aw;
dmxWidget *m_dmxWidget;
ShowPlayer *m_showPlayer;
private:
Ui::LibreMediaServerAudio ui;
Ui::LibreMediaServerAudioUi ui;
private slots:
void olasetup();
void launchShowPlayerWindow();
};
#endif // LIBREMEDIASERVERAUDIOUI_H

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<author>Santi Noreña lms@criptomart.net</author>
<class>LibreMediaServerAudio</class>
<widget class="QMainWindow" name="LibreMediaServerAudio">
<class>LibreMediaServerAudioUi</class>
<widget class="QMainWindow" name="LibreMediaServerAudioUi">
<property name="geometry">
<rect>
<x>0</x>
@ -41,6 +41,7 @@
<string>File</string>
</property>
<addaction name="actionLaunch_OLA_Setup"/>
<addaction name="actionLaunchShowPlayer"/>
</widget>
<addaction name="menuFile"/>
</widget>
@ -49,6 +50,11 @@
<string>OLA Setup</string>
</property>
</action>
<action name="actionLaunchShowPlayer">
<property name="text">
<string>Show Player</string>
</property>
</action>
</widget>
<resources/>
<connections/>

View file

@ -226,6 +226,9 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
connect(m_lmsUi->m_aw, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int)));
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(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString)));
m_refreshUi = new QTimer(this);
connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi()));
m_refreshUi->start(UI_REFRESH_TIME);
@ -236,7 +239,7 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
}
};
// From Ui widgets
// From Ui widgets and ShowPlayer
void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value)
{
switch (s){

View file

@ -30,7 +30,7 @@ using namespace std;
#include "settings.h"
#include "defines.h"
#ifndef NOGUI
#include "libremediaserver-audio-gui.h"
#include "libremediaserver-audio-ui.h"
#endif
class libreMediaServerAudio : public QObject

View file

@ -8,7 +8,7 @@
#include "olathread.h"
#include "settings.h"
#include "libremediaserver-audio.h"
#include "libremediaserver-audio-gui.h"
#include "libremediaserver-audio-ui.h"
#include "defines.h"
olaThread *m_ola;

81196
src/miniaudio.c Normal file

File diff suppressed because it is too large Load diff

7766
src/miniaudio.h Normal file

File diff suppressed because it is too large Load diff

View file

@ -502,7 +502,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status)
result = ma_sound_start(&m_mae.sounds[layer]);
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 load when seeking
usleep(FADE_TIME * 1500); // avoid glitch when seeking
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, FADE_TIME * 2);
default:
break;

View file

@ -57,12 +57,8 @@ typedef struct
class MiniAudioEngine
{
friend class libreMediaServerAudio;
public:
static void audioDataCallback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);
protected:
MiniAudioEngine();
void stopEngine();
bool startEngine(uint layersQty, uint* audioDevicesID, uint audioDevicesQty);

86
src/showplayer.cpp Normal file
View file

@ -0,0 +1,86 @@
#include "showplayer.h"
QWidget *ShowPlayer::createHeader()
{
QWidget *ret = new QWidget();
auto layout = new QHBoxLayout(this);
QLabel *l = new QLabel("Cue Number");
layout->addWidget(l);
l = new QLabel("File Path");
layout->addWidget(l);
l = new QLabel("Volume");
layout->addWidget(l);
l = new QLabel("Bus 1");
layout->addWidget(l);
l = new QLabel("Bus 2");
layout->addWidget(l);
l = new QLabel("Pan");
layout->addWidget(l);
l = new QLabel("Pitch");
layout->addWidget(l);
l = new QLabel("Playback Status");
layout->addWidget(l);
l = new QLabel("Fade In");
layout->addWidget(l);
l = new QLabel("Fade Out");
layout->addWidget(l);
l = new QLabel("Wait In");
layout->addWidget(l);
l = new QLabel("Wait Out ");
layout->addWidget(l);
l = new QLabel("Halt");
layout->addWidget(l);
l = new QLabel("Name");
layout->addWidget(l);
l = new QLabel("Notes");
layout->addWidget(l);
l = new QLabel("Entry Point");
layout->addWidget(l);
l = new QLabel("Exit Point");
layout->addWidget(l);
ret->setLayout(layout);
return ret;
}
ShowPlayer::ShowPlayer(QWidget *parent) :
QDialog(parent)
, ui(new Ui::ShowPlayer)
{
ui->setupUi(this);
connect(ui->addCueButton, SIGNAL(clicked()), this, SLOT(onAddTrack()));
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
QWidget *w = createHeader();
ui->headerLayout->addWidget(w);
currentTrackIndex = 0;
filesLoaded = 0;
currentStatus = Status::Iddle;
}
ShowPlayer::~ShowPlayer() {}
void ShowPlayer::onAddTrack() {
TrackDialog dialog;
dialog.show();
if (dialog.exec() == QDialog::Accepted) {
ui->cueListWidget->addCueTrackWidget(dialog.track);
}
}
void ShowPlayer::go()
{
CueTrackWidget* current = ui->cueListWidget->getSelectedTrack();
if (!current)
return;
for (int i = 0; i < MAX_LAYERS; i++) {
if (layersUsed[i] == -1) {
layersUsed[i] = currentTrackIndex;
current->audioLayer = i;
break;
}
}
updateTrackStateInEngine(currentTrackIndex, current->audioLayer);
emit uiLoadMedia(current->audioLayer, current->getFilePath());
emit uiPlaybackChanged(current->audioLayer, current->getStatus());
filesLoaded++;
}

55
src/showplayer.h Normal file
View file

@ -0,0 +1,55 @@
#ifndef SHOWPLAYER_H
#define SHOWPLAYER_H
#include <vector>
#include <string>
#include <QDialog>
#include "defines.h"
#include "cuetrackwidget.h"
#include "cuetracklistwidget.h"
#include "trackdialog.h"
#include "ui_showplayer.h"
namespace Ui {
class ShowPlayer;
}
class ShowPlayer : public QDialog
{
Q_OBJECT
public:
explicit ShowPlayer(QWidget *parent = nullptr);
~ShowPlayer();
private:
Ui::ShowPlayer *ui;
size_t currentTrackIndex;
Status currentStatus = Status::Iddle;
size_t filesLoaded = 0;
int layersUsed[MAX_LAYERS] = { -1 };
QWidget *createHeader();
void updateTrackStateInEngine(size_t index, int layer) {
CueTrackWidget *track = ui->cueListWidget->getTrackAtIndex(index);
emit uiSliderChanged(layer, Slider::Volume, track->getVolume());
emit uiSliderChanged(layer, Slider::Pan, track->getPan());
emit uiSliderChanged(layer, Slider::Pitch, track->getPitch());
emit uiSliderChanged(layer, Slider::Bus1, track->getBus1());
emit uiSliderChanged(layer, Slider::Bus2, track->getBus2());
};
private slots:
void onAddTrack();
void go();
signals:
void uiPlaybackChanged(int layer, Status s);
void uiSliderChanged(int layer, Slider s, int vol);
void uiLoadMedia(int layer, QString s);
};
#endif // SHOWPLAYER_H

164
src/showplayer.ui Normal file
View file

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ShowPlayer</class>
<widget class="QDialog" name="ShowPlayer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>276</width>
<height>112</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Show Player</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QSplitter" name="masterSplitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QPushButton" name="goButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</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">
<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">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<item>
<widget class="QToolButton" name="rmCueButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="addCueButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="editCueButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="horizontalLayoutWidget_2">
<layout class="QHBoxLayout" name="headerLayout">
<property name="spacing">
<number>1</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
</property>
</layout>
</widget>
<widget class="CueTrackListWidget" name="cueListWidget" native="true">
<property name="enabled">
<bool>true</bool>
</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>
</property>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>CueTrackListWidget</class>
<extends>QWidget</extends>
<header>src/cuetracklistwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>