diff --git a/docs/lms-audio.xlm b/docs/lms-audio.xlm deleted file mode 100644 index b2ea7ed..0000000 --- a/docs/lms-audio.xlm +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/lms-audio.xml b/docs/lms-audio.xml new file mode 100644 index 0000000..6d15b0d --- /dev/null +++ b/docs/lms-audio.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/roadmap.txt b/docs/roadmap.txt index 9e4f017..a92bd03 100644 --- a/docs/roadmap.txt +++ b/docs/roadmap.txt @@ -42,3 +42,8 @@ v 0.3.0 - ampliar writer para recibir un número n de entradas y escribirlas cada una en un buffer - aislar miniaudio del callback dmx tal como hemos hecho con la Ui, al menos las operaciones lentas como cargar medios. - en load media usar un fence para actualizar mediaLoaded. +- Video + +v 0.2.1 showplayer + + diff --git a/lms-resources.qrc b/lms-resources.qrc index 21a0629..a8112f0 100644 --- a/lms-resources.qrc +++ b/lms-resources.qrc @@ -10,6 +10,7 @@ resources/save_button.png resources/icon.png resources/panic_button.jpg - resources/go_button.jpeg + resources/go_button.jpeg + resources/restore_button.jpg diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000..f9be058 Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/panic_button.jpg b/resources/panic_button.jpg new file mode 100644 index 0000000..1e5e62d Binary files /dev/null and b/resources/panic_button.jpg differ diff --git a/resources/restore_button.jpg b/resources/restore_button.jpg new file mode 100644 index 0000000..5de74ed Binary files /dev/null and b/resources/restore_button.jpg differ diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp index 0e2d6f6..0be4c03 100644 --- a/src/cuetracklistwidget.cpp +++ b/src/cuetracklistwidget.cpp @@ -14,31 +14,32 @@ #include #include #include "cuetracklistwidget.h" +#include "editcuetrackwidget.h" CueTrackListWidget::CueTrackListWidget(QWidget *parent) { layout = new QVBoxLayout(this); tableWidget = new QTableWidget(); - tableWidget->setSortingEnabled(false); + tableWidget->setSortingEnabled(false); layout->addWidget(tableWidget); setLayout(layout); - 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); + tableWidget->installEventFilter(parent); + 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())); - QShortcut *shortcut_copy = new QShortcut(QKeySequence("Ctrl+C"), parent); - QObject::connect(shortcut_copy, SIGNAL(activated()), this, SLOT(copyCueTrack())); - QShortcut *shortcut_cut = new QShortcut(QKeySequence("Ctrl+X"), parent); - QObject::connect(shortcut_cut, SIGNAL(activated()), this, SLOT(cutCueTrack())); - QShortcut *shortcut_paste = new QShortcut(QKeySequence("Ctrl+V"), parent); - QObject::connect(shortcut_paste, SIGNAL(activated()), this, SLOT(pasteCueTrack())); - tableWidget->installEventFilter(this); - QShortcut *shortcut_delete = new QShortcut(QKeySequence("Delete"), parent); - QObject::connect(shortcut_delete, SIGNAL(activated()), this, SLOT(deleteCueTrack())); - QShortcut *shortcut_insert = new QShortcut(QKeySequence("Insert"), parent); - QObject::connect(shortcut_insert, SIGNAL(activated()), this, SLOT(createNewCueTrack())); - QShortcut *shortcut_edit = new QShortcut(QKeySequence("e"), parent); - QObject::connect(shortcut_edit, SIGNAL(activated()), this, SLOT(editCueTrack())); + QShortcut *shortcut_copy = new QShortcut(QKeySequence("Ctrl+C"), parent); + QObject::connect(shortcut_copy, SIGNAL(activated()), this, SLOT(copyCueTrack())); + QShortcut *shortcut_cut = new QShortcut(QKeySequence("Ctrl+X"), parent); + QObject::connect(shortcut_cut, SIGNAL(activated()), this, SLOT(cutCueTrack())); + QShortcut *shortcut_paste = new QShortcut(QKeySequence("Ctrl+V"), parent); + QObject::connect(shortcut_paste, SIGNAL(activated()), this, SLOT(pasteCueTrack())); + QShortcut *shortcut_delete = new QShortcut(QKeySequence("Delete"), parent); + QObject::connect(shortcut_delete, SIGNAL(activated()), this, SLOT(deleteCueTrack())); + QShortcut *shortcut_insert = new QShortcut(QKeySequence("Insert"), parent); + QObject::connect(shortcut_insert, SIGNAL(activated()), this, SLOT(createNewCueTrack())); + QShortcut *shortcut_edit = new QShortcut(QKeySequence("e"), parent); + QObject::connect(shortcut_edit, SIGNAL(activated()), this, SLOT(editCueTrack())); } void CueTrackListWidget::addCueTrack(CueTrack* cue) { @@ -92,7 +93,7 @@ void CueTrackListWidget::key_down() { void CueTrackListWidget::displayCueTrackInTable(CueTrack *cueTrack, int index) { if (tableWidget->columnCount() == 0) { tableWidget->setColumnCount(7); - QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"}; + QStringList headers = {"Active", "Cue","Chan", "Name", "Vol", "State", "File"}; tableWidget->setHorizontalHeaderLabels(headers); } if (index == -1) @@ -247,7 +248,7 @@ void CueTrackListWidget::redrawCueTrackList() int selected = cueTracks.at(selectedIndex)->userNumber; clearTableWidget(); tableWidget->setColumnCount(7); - QStringList headers = {"Active", "Number","Channel", "Name", "Volume", "Status", "File"}; + QStringList headers = {"Active", "Cue","Chan", "Name", "Vol", "State", "File"}; tableWidget->setHorizontalHeaderLabels(headers); sortCueTrackList(); selectedIndex = 0; @@ -270,6 +271,7 @@ void CueTrackListWidget::redrawCueTrackList() void CueTrackListWidget::loadCueTrackList(std::string filename) { + qDebug() << "loading cue list from " << filename.data(); QFile file(QString::fromStdString(filename)); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -389,6 +391,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) void CueTrackListWidget::saveCueTrackList(std::string filename) { + qDebug() << "saving cue list to " << filename.data(); std::ofstream file(filename); if (!file.is_open()) { @@ -508,7 +511,7 @@ CueTrack loadCueTrackFromXml(const QString& filename) { const QString elementName = xmlReader.name().toString(); if (elementName == "filePath") { cueTrack.filePath = xmlReader.readElementText().toStdString(); - } else if (elementName == "volume") { + } else if (elementName == "vol") { cueTrack.volume = xmlReader.readElementText().toInt(); } else if (elementName == "pan") { cueTrack.pan = xmlReader.readElementText().toInt(); @@ -518,7 +521,7 @@ CueTrack loadCueTrackFromXml(const QString& filename) { cueTrack.bus1 = xmlReader.readElementText().toInt(); } else if (elementName == "bus2") { cueTrack.bus2 = xmlReader.readElementText().toInt(); - } else if (elementName == "status") { + } else if (elementName == "state") { QString tmp = xmlReader.readElementText(); cueTrack.status = stringToStatus(&tmp); } else if (elementName == "fadeOut") { diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index 321a36a..ff731b2 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -10,7 +10,6 @@ #include #include #include "defines.h" -#include "editcuetrackwidget.h" class CueTrackListWidget : public QWidget { Q_OBJECT diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp index 4e26b0c..0039a4f 100644 --- a/src/cuetrackwidget.cpp +++ b/src/cuetrackwidget.cpp @@ -17,9 +17,14 @@ CueTrackWidget::CueTrackWidget(QWidget *parent) : connect(&tlFade, SIGNAL(finished()), this, SLOT(fadeSlot())); connect(&tlWaitIn, SIGNAL(finished()), this, SLOT(waitInSlot())); connect(&tlWaitOut, SIGNAL(finished()), this, SLOT(waitOutSlot())); + connect(ui->playButton, SIGNAL(clicked()), this, SLOT(play())); + connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(stop())); + connect(ui->pauseButton, SIGNAL(clicked()), this, SLOT(pause())); + connect(ui->fadeInButton, SIGNAL(clicked()), this, SLOT(fadeIn())); + connect(ui->fadeOutButton, SIGNAL(clicked()), this, SLOT(fadeOut())); + connect(ui->muteButton, SIGNAL(clicked()), this, SLOT(mute())); } - CueTrackWidget::~CueTrackWidget() { delete ui; @@ -34,9 +39,9 @@ void CueTrackWidget::loadCueTrack(CueTrack* track) 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->fade->display(track->fadeIn); + ui->waitIn->display(track->waitIn); + ui->waitOut->display(track->waitOut); ui->halt->setChecked(track->stopAtEnd); QFileInfo fileInfo(track->filePath.data()); fileInfo.fileName().truncate(64); @@ -44,6 +49,7 @@ void CueTrackWidget::loadCueTrack(CueTrack* track) ui->status->setText(statusToString(track->status)); ui->audioLayer->display(track->audioLayer); ui->multi->setChecked(track->multi); + ui->fadeOut->display(track->fadeOut); } void CueTrackWidget::go() @@ -95,4 +101,48 @@ void CueTrackWidget::setNextCue() { ui->cueProgressBar->setDisabled(true); ui->cueProgressBar->hide(); + ui->audioControlLayout->setEnabled(false); + QList list = { 1, 0 }; + ui->cueValues->setSizes(list); +} + +void CueTrackWidget::play() +{ + QString t = ui->status->text(); + emit changeStatus(ui->audioLayer->intValue(), stringToStatus(&t)); +} + +void CueTrackWidget::stop() +{ + emit changeStatus(ui->audioLayer->intValue(), Status::Stopped); +} + +void CueTrackWidget::pause() +{ + emit changeStatus(ui->audioLayer->intValue(), Status::Paused); +} + +void CueTrackWidget::fadeIn() +{ + emit changeVol(ui->audioLayer->intValue(), Slider::Volume, ui->vol->value() * 655.35, ui->fade->value() * 1000, ui->fadeOut->value() * 1000); + muted = false; +} + +void CueTrackWidget::fadeOut() +{ + emit changeVol(ui->audioLayer->intValue(), Slider::Volume, 0, ui->fade->value() * 1000, ui->fadeOut->value() * 1000); + muted = true; +} + +void CueTrackWidget::mute() +{ + if (muted) + { + emit changeVol(ui->audioLayer->intValue(), Slider::Volume, ui->vol->value() * 655.35, 0, 0); + muted = false; + } + else { + emit changeVol(ui->audioLayer->intValue(), Slider::Volume, 0, 0, 0); + muted = true; + } } diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h index 87cd221..0915b84 100644 --- a/src/cuetrackwidget.h +++ b/src/cuetrackwidget.h @@ -19,26 +19,34 @@ 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: + Ui::CueTrackWidget *ui; + QTimeLine tlFade; + QTimeLine tlWaitIn; + QTimeLine tlWaitOut; + bool muted = false; + private slots: void fadeSlot(); void waitInSlot(); void waitOutSlot(); + void play(); + void stop(); + void pause(); + void fadeIn(); + void fadeOut(); + void mute(); signals: void cueFinished(int layer); void goAction(int layer); - void NewFunction(CueTrack *track); + void changeStatus(int layer, Status status); + void changeVol(int layer, Slider s, int value, int fadein, int fadeout); }; #endif // CUETRACKWIDGET_H diff --git a/src/cuetrackwidget.ui b/src/cuetrackwidget.ui index 314782b..1928afc 100644 --- a/src/cuetrackwidget.ui +++ b/src/cuetrackwidget.ui @@ -6,8 +6,8 @@ 0 0 - 502 - 329 + 1000 + 740 @@ -37,99 +37,42 @@ 0 - 0 + 1 - 0 + 1 - 0 + 1 - 0 + 1 - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - QFrame::StyledPanel - + Qt::Vertical - - false - - - 8 - - - - - 0 - 0 - - - - - 0 - 0 - - + Qt::Horizontal - + - + 0 0 - 0 - 0 - - - - Cue Progress - - - Cue Progress - - - 24 - - - - - - 1 - 0 - - - - - 48 - 48 + 24 + 24 14 - 75 true @@ -161,7 +104,7 @@ - 2 + 0 0 @@ -174,7 +117,6 @@ 13 - 75 true @@ -206,6 +148,29 @@ 3 + + + + 2 + 0 + + + + + 0 + 0 + + + + Cue Progress + + + Cue Progress + + + 24 + + @@ -214,12 +179,15 @@ 0 + + QFrame::StyledPanel + Qt::Horizontal - + - + 0 0 @@ -227,37 +195,206 @@ 0 - 24 + 12 - 16777215 - 24 + 26 + 16777215 + + + + Audio Channel + + + true + + + false + + + 1 + + + QLCDNumber::Flat + + + + + + 0 + 0 + + + + + 100 + 16777215 - 10 + 13 - Media FIle Name + Playback Status + + + true QFrame::StyledPanel - Media file name + Playback Status + + + Qt::PlainText + + + true - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignCenter true - - 3 + + + + + 0 + 0 + + + + + 130 + 16777215 + + + + + true + false + + + + Qt::NoFocus + + + <html><head/><body><p>PLay next cue at same time this cue, do not wait to finish the cue.</p></body></html> + + + Qt::LeftToRight + + + true + + + Multi Go + + + + :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg + + + + 32 + 32 + + + + + + + 0 + 0 + + + + + 24 + 0 + + + + + 120 + 16777215 + + + + + 13 + true + + + + Qt::NoFocus + + + Do not play next cue if checked + + + If checked, do not play next cue. If checked, Go next cue when this cue has finished. + + + Halt + + + true + + + Halt + + + + :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png + + + + 32 + 32 + + + + true + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + true + + + QFrame::StyledPanel + + + Media File Name + + + true + + + Qt::AlignJustify|Qt::AlignVCenter + + + true @@ -280,6 +417,12 @@ 16777215 + + QFrame::NoFrame + + + 0 + Qt::Horizontal @@ -318,117 +461,118 @@ 0 - - + + - 0 + 10 0 - - Qt::NoFocus + + QFrame::StyledPanel - - Wait in time in seconds + + QFrame::Plain - - QAbstractSpinBox::NoButtons - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Wait out time in secods - - - QAbstractSpinBox::NoButtons - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Fade time in seconds - - - Fade In - - - Fade In Time in seconds - - - true - - - true - - - true - - - QAbstractSpinBox::NoButtons - - - - - + false - - - - - - - - 99990000.000000000000000 - - - QAbstractSpinBox::AdaptiveDecimalStepType + + QLCDNumber::Flat - - + + - 0 + 10 0 - - Qt::NoFocus + + QFrame::StyledPanel - - Exit Point + + QFrame::Plain - - QAbstractSpinBox::NoButtons + + false + + + QLCDNumber::Flat - - + + + + + 10 + 0 + + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + QLCDNumber::Flat + + + + + + + + 10 + 0 + + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + QLCDNumber::Flat + + + + + + + + 10 + 0 + + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + QLCDNumber::Flat + + + + + 0 @@ -437,23 +581,64 @@ - 13 + 10 - - Playback Status - QFrame::StyledPanel - Playback Status + Bus +2 - - Qt::PlainText + + Qt::AlignCenter - - true + + + + + + + 0 + 0 + + + + + 10 + + + + QFrame::StyledPanel + + + Vol + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 10 + + + + QFrame::StyledPanel + + + Exit +Point Qt::AlignCenter @@ -463,219 +648,57 @@ - - + + + + + 10 + 0 + + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + QLCDNumber::Flat + + + + + 0 0 - - Qt::NoFocus - - - Entry Point - - - QAbstractSpinBox::NoButtons - - - - - - - - 0 - 0 - - - - - 0 - 24 - - - - Audio Channel - - - false - - - 1 - - - QLCDNumber::Flat - - - - - - - - 0 - 0 - - - - - 24 - 0 - - - - - 13 - 75 - true - - - - Qt::NoFocus - - - Do not play next cue if checked - - - If checked, do not play next cue. If checked, Go next cue when this cue has finished. - - - Halt - - - true - - - Halt - - - - :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png - - - - 32 - 32 - - - - true - - - - - - - - - QLayout::SetDefaultConstraint - - - 0 - - - - - 3 - - - - - - - - 0 - 0 - - 10 + + QFrame::StyledPanel + - Bus 1 + Bus + 1 Qt::AlignCenter - - - - 3 - - - QLCDNumber::Flat - - - - - - - - 10 - - - - Volume - - - Qt::AlignCenter - - - - - - - - 10 - - - - Bus 2 - - - Qt::AlignCenter - - - - - - - <html><head/><body><p>Volume</p></body></html> - - - 3 - - - - - - - <html><head/><body><p>Bus 2 Volume</p></body></html> - - - 3 - - - - - - - <html><head/><body><p>Bus 1 Volume</p></body></html> - - - 3 - - - - + - + 0 0 @@ -685,6 +708,9 @@ 10 + + QFrame::StyledPanel + Pan @@ -693,13 +719,50 @@ - - + + + + + 0 + 0 + + 10 + + QFrame::StyledPanel + + + Fade +In + + + Qt::AlignCenter + + + true + + + + + + + + 0 + 0 + + + + + 10 + + + + QFrame::StyledPanel + Pitch @@ -708,8 +771,8 @@ - - + + 0 @@ -718,45 +781,351 @@ - 50 - false - true + 10 - - <html><head/><body><p>PLay next cue at same time this cue, do not wait to finish the cue.</p></body></html> - - - Qt::RightToLeft + + QFrame::StyledPanel - + Wait +Out - - - :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg + + Qt::AlignCenter - - - 32 - 32 - + + true - - + + + + + 10 + 0 + + + + <html><head/><body><p>Bus 1 Volume</p></body></html> + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + 3 + + + QLCDNumber::Flat + + + + + + + + 0 + 0 + + 10 + + QFrame::StyledPanel + - MultiCue + Fade +Out Qt::AlignCenter + + true + + + + + + + + 0 + 0 + + + + + 10 + + + + QFrame::StyledPanel + + + Wait +In + + + Qt::AlignCenter + + + true + + + + + + + + 10 + 0 + + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + 3 + + + QLCDNumber::Flat + + + + + + + + 10 + 0 + + + + <html><head/><body><p>Bus 2 Volume</p></body></html> + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + 3 + + + QLCDNumber::Flat + + + + + + + + 10 + 0 + + + + <html><head/><body><p>Volume</p></body></html> + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + 3 + + + QLCDNumber::Flat + + + + + + + + 10 + 0 + + + + QFrame::StyledPanel + + + QFrame::Plain + + + false + + + 3 + + + QLCDNumber::Flat + + + + + + + + 0 + 0 + + + + + 10 + + + + QFrame::StyledPanel + + + Entry +Point + + + Qt::AutoText + + + false + + + Qt::AlignCenter + + + true + + + + + + + + + 0 + 0 + + + + + QLayout::SetMaximumSize + + + 0 + + + + + + 0 + 0 + + + + Play + + + + + + + + 0 + 0 + + + + Pause + + + false + + + false + + + + + + + + 0 + 0 + + + + Stop + + + + + + + + 0 + 0 + + + + Fade +In + + + + + + + + 0 + 0 + + + + Mute + + + true + + + + + + + + 0 + 0 + + + + Fade + Out + @@ -766,13 +1135,6 @@ - - waitOut - fade - entryPoint - exitPoint - waitIn - diff --git a/src/defines.h b/src/defines.h index 1844856..c530664 100644 --- a/src/defines.h +++ b/src/defines.h @@ -4,7 +4,7 @@ #define VERSION "LibreMediaServerAudio v0.2.0 Antigona" #define COPYRIGHT "(C) 2014-2024 Santi Noreña " #define LICENSE "GPL3 Licensed. See LICENSE.txt." -#define DEFAULT_FILE "lms-audio.xlm" +#define DEFAULT_FILE "lms-audio.xml" #define MAX_LAYERS 4 #define MAX_AUDIODEVICES 8 #define FORMAT ma_format_f32 /* Must always be f32. */ diff --git a/src/filterbankwidget.cpp b/src/filterbankwidget.cpp index c948411..3b05ec3 100644 --- a/src/filterbankwidget.cpp +++ b/src/filterbankwidget.cpp @@ -36,6 +36,14 @@ FilterBankWidget::FilterBankWidget(QWidget *parent) "font-size: 8px;}"); connect(m_bypass, SIGNAL(stateChanged(int)), this, SLOT(bypassChanged(int))); master->addWidget(fb[0]); + fb[0]->setFocusPolicy(Qt::NoFocus); + fb[0]->setButtonSymbols(QAbstractSpinBox::NoButtons); + fb[0]->setValue(-1); + fb[0]->setDecimals(1); + fb[0]->setAlignment(Qt::AlignHCenter); + fb[0]->setContentsMargins(0, 0, 0, 0); + fb[0]->setMaximumWidth(66); + fb[0]->setMinimumWidth(25); layout->addLayout(master); for (int i = 1; i < 13;) { QVBoxLayout *filterLayout= new QVBoxLayout; diff --git a/src/libremediaserver-audio-ui.cpp b/src/libremediaserver-audio-ui.cpp index e1f8533..bfeeeb3 100644 --- a/src/libremediaserver-audio-ui.cpp +++ b/src/libremediaserver-audio-ui.cpp @@ -45,10 +45,46 @@ libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent) "selection-background-color: green" ); m_showPlayer = new ShowPlayer(); + m_showPlayer->setFocus(); + QShortcut *shortcut_space = new QShortcut(QKeySequence(" "), this); + QObject::connect(shortcut_space, SIGNAL(activated()), m_showPlayer, SLOT(go())); + QShortcut *shortcut_up = new QShortcut(QKeySequence("Up"), this); + QObject::connect(shortcut_up, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(key_up())); + QShortcut *shortcut_down = new QShortcut(QKeySequence("Down"), this); + QObject::connect(shortcut_down, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(key_down())); + QShortcut *shortcut_copy = new QShortcut(QKeySequence("Ctrl+C"), this); + QObject::connect(shortcut_copy, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(copyCueTrack())); + QShortcut *shortcut_cut = new QShortcut(QKeySequence("Ctrl+X"), this); + QObject::connect(shortcut_cut, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(cutCueTrack())); + QShortcut *shortcut_paste = new QShortcut(QKeySequence("Ctrl+V"), this); + QObject::connect(shortcut_paste, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(pasteCueTrack())); + QShortcut *shortcut_delete = new QShortcut(QKeySequence("Delete"), this); + QObject::connect(shortcut_delete, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(deleteCueTrack())); + QShortcut *shortcut_insert = new QShortcut(QKeySequence("Insert"), this); + QObject::connect(shortcut_insert, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(createNewCueTrack())); + QShortcut *shortcut_edit = new QShortcut(QKeySequence("e"), this); + QObject::connect(shortcut_edit, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(editCueTrack())); + Settings::getInstance()->beginGroup("mainwindow"); + auto geometry = Settings::getInstance()->value("geometry", QByteArray()).toByteArray(); + if (!geometry.isEmpty()) + restoreGeometry(geometry); + geometry = Settings::getInstance()->value("showPlayerGeometry", QByteArray()).toByteArray(); + if (!geometry.isEmpty()) + m_showPlayer->restoreGeometry(geometry); + Settings::getInstance()->endGroup(); } libreMediaServerAudioUi::~libreMediaServerAudioUi() { + Settings::getInstance()->beginGroup("mainwindow"); + Settings::getInstance()->setValue("size", size()); + Settings::getInstance()->setValue("fullScreen", isFullScreen()); + Settings::getInstance()->setValue("geometry", saveGeometry()); + Settings::getInstance()->setValue("showPlayer", m_showPlayer->isVisible()); + Settings::getInstance()->setValue("showPlayerSize", m_showPlayer->size()); + Settings::getInstance()->setValue("showPlayerGeometry", m_showPlayer->saveGeometry()); + Settings::getInstance()->endGroup(); + delete m_showPlayer; } void libreMediaServerAudioUi::olasetup() @@ -60,6 +96,5 @@ void libreMediaServerAudioUi::olasetup() void libreMediaServerAudioUi::launchShowPlayerWindow() { - //m_showPlayer->showMaximized(); m_showPlayer->show(); } diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index c2bd32b..f3dab82 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -24,7 +24,7 @@ libreMediaServerAudio::libreMediaServerAudio() { m_settings = Settings::getInstance(this); - m_settings->readFile(); + //m_settings->readFile(); m_ui = m_settings->getShowUi(); m_layersQty = m_settings->getLayersNumber(); for (uint i = 0; i < m_layersQty; i++) { @@ -66,17 +66,6 @@ libreMediaServerAudio::~libreMediaServerAudio() if (m_settings->getDmxActive()) m_ola->stop(); m_mae.stopEngine(); - Settings::getInstance()->beginGroup("mainwindow"); - Settings::getInstance()->setValue("size", m_lmsUi->size()); - Settings::getInstance()->setValue("fullScreen", m_lmsUi->isFullScreen()); - Settings::getInstance()->setValue("geometry", m_lmsUi->saveGeometry()); - Settings::getInstance()->setValue("showPlayer", m_lmsUi->m_showPlayer->isVisible()); - Settings::getInstance()->setValue("showPlayerSize", m_lmsUi->m_showPlayer->size()); - Settings::getInstance()->setValue("showPlayerGeometry", m_lmsUi->m_showPlayer->saveGeometry()); - Settings::getInstance()->endGroup(); - m_settings->settingsSaver(); - if (m_settings->getShowPlayerActive()) - m_lmsUi->m_showPlayer->saveCueTrackList("lastshow.xml"); delete m_lmsUi; delete m_settings; sleep(1); @@ -316,7 +305,6 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) m_ola->start(QThread::TimeCriticalPriority ); } else { m_lmsUi->m_dmxWidget->hide(); - //m_lmsUi->topWidget->hide(); } for (uint i = 0; i < m_settings->getAudioDeviceQty(); i++) { char *name = m_mae.getDeviceName(i); @@ -326,14 +314,6 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) m_lmsUi->m_showPlayer->loadCueTrackList("lastshow.xml"); m_lmsUi->m_showPlayer->show(); } - m_settings->beginGroup("mainwindow"); - auto geometry = m_settings->value("geometry", QByteArray()).toByteArray(); - if (!geometry.isEmpty()) - lmsUi->restoreGeometry(geometry); - geometry = m_settings->value("showPlayerGeometry", QByteArray()).toByteArray(); - if (!geometry.isEmpty()) - lmsUi->m_showPlayer->restoreGeometry(geometry); - m_settings->endGroup(); m_refreshUi = new QTimer(this); connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); m_refreshUi->start(UI_REFRESH_TIME); @@ -356,6 +336,7 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) m_updateUi[layer][2] = value; break; case Slider::Bypass: + // ToDo: sigsev when no dmx, resolve this whitout dmxSettings, is it needed= m_mae.setBypass(m_dmxSettings.at(layer).audioDevice, layer, value); break; case Slider::Bus1: diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index d81b309..2c6144c 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -1,3 +1,4 @@ +#include #include "miniaudioengine.h" #include "dmxPersonality.h" @@ -285,7 +286,7 @@ ma_result MiniAudioEngine::startDevices() engineConfig.noAutoStart = MA_TRUE; for (uint internalId = 0; internalId < m_mae.audioDevicesQty; internalId++) { - deviceConfig.capture.pDeviceID = &m_mae.pPlaybackDeviceInfos[m_mae.audioDevicesId[internalId]].id; + //deviceConfig.capture.pDeviceID = &m_mae.pPlaybackDeviceInfos[m_mae.audioDevicesId[internalId]].id; deviceConfig.playback.pDeviceID = &m_mae.pPlaybackDeviceInfos[m_mae.audioDevicesId[internalId]].id; deviceConfig.pUserData = &m_mae.engines[internalId]; result = ma_device_init(&m_mae.context, &deviceConfig, &m_mae.devices[internalId]); @@ -499,6 +500,9 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) break; case Status::Stopped: ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], m_mae.currentStatus[layer].fadeOut); + QTimer::singleShot(m_mae.currentStatus[layer].fadeOut, [this, layer] { + this->seekToCursor(layer, m_mae.currentStatus[layer].cursor); + }); break; case Status::PlayingLoop: loop = true; diff --git a/src/settings.cpp b/src/settings.cpp index fc17589..53b02c3 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -19,7 +19,31 @@ Settings::Settings(QObject *parent) : m_audioDeviceQty = 0; for (uint i = 0; i < MAX_AUDIODEVICES; i++) m_audioDeviceId[i] = -1; - settingsLoader(); + if (QFile::exists(DEFAULT_FILE)) + readFromFile(DEFAULT_FILE); + else if (QFile::exists(fileName())) + settingsLoader(); + else { + qDebug() << "Can not read initial settings, making some standard"; + setValue("lmsAudio/ui", 1); + setValue("lmsAudio/dmxActive", 0); + setValue("lmsAudio/showPlayerActive", 1); + setValue("lmsAudio/layersNumber", 2); + setValue("lmsAudio/path", "../media/"); + setValue("audioDevice/devicesNumber", 2); + setValue("audioDevice/id0", 4); + setValue("audioDevice/id1", 3); + setValue("layers/layer0/dmx", 1); + setValue("layers/layer0/universe", 1); + setValue("layers/layer0/id", 0); + setValue("layers/layer0/audioDevice", 0); + setValue("layers/layer1/dmx", 26); + setValue("layers/layer1/universe", 1); + setValue("layers/layer1/id", 1); + setValue("layers/layer1/audioDevice", 0); + sync(); + settingsLoader(); + } } Settings::~Settings() { @@ -28,6 +52,7 @@ Settings::~Settings() { void Settings::settingsLoader() { + qDebug() << "loading settings from system"; beginGroup("lmsAudio"); m_ui = value("ui", 0).toBool(); m_dmxActive = value("dmxActive", 0).toBool(); @@ -94,14 +119,14 @@ void Settings::settingsSaver() // - Audio device id // - Show Ui, showPlayer void Settings::readFromFile(QString file) { + qDebug() << "loading settings from xml file " << file; QFile* xmlFile = new QFile(file); if (!xmlFile->open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::critical(NULL,"Load XML File Problem", QString("Couldn't open %1 to load settings").arg(file), QMessageBox::Ok); - // Instead exit give the oportunity to load another file or define the settings - qCritical("Load XML File Problem"); - exit(1); + qCritical("Load XML File Problem"); + return; } QXmlStreamReader* xmlReader = new QXmlStreamReader(xmlFile); while(!xmlReader->atEnd() && !xmlReader->hasError()) { diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 9ac3f5a..328227b 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -13,7 +13,12 @@ ShowPlayer::ShowPlayer(QWidget *parent) : connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList())); connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go())); connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(updateIndex(int))); - currentStatus = Status::Iddle; + connect(ui->panicButton, SIGNAL(clicked()), this, SLOT(panicButtonClicked())); + connect(ui->restoreButton, SIGNAL(clicked()), this, SLOT(restoreButtonClicked())); + connect(ui->CopyCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(copyCueTrack())); + connect(ui->PasteCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(pasteCueTrack())); + connect(ui->CutCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(cutCueTrack())); + currentStatus = Status::Iddle; for(int i = 0; i < MAX_LAYERS; i++) { layersUsed[i] = -1; cueTrackWidgetPlaying[i] = nullptr; @@ -21,12 +26,22 @@ ShowPlayer::ShowPlayer(QWidget *parent) : prevCue[i] = nullptr; } ui->nextCue->setNextCue(); + Settings::getInstance()->beginGroup("showPlayerSplittersState"); + ui->splitter_main->restoreState(Settings::getInstance()->value("mainSplitter").toByteArray()); + ui->splitter_controls->restoreState(Settings::getInstance()->value("controlsSplitter").toByteArray()); + ui->splitter_cues->restoreState(Settings::getInstance()->value("cueSplitter").toByteArray()); + Settings::getInstance()->endGroup(); } ShowPlayer::~ShowPlayer() { saveCueTrackList("lastshow.xml"); - delete ui; + Settings::getInstance()->beginGroup("showPlayerSplittersState"); + Settings::getInstance()->setValue("mainSplitter", ui->splitter_main->saveState()); + Settings::getInstance()->setValue("controlsSplitter", ui->splitter_controls->saveState()); + Settings::getInstance()->setValue("cueSplitter", ui->splitter_cues->saveState()); + Settings::getInstance()->endGroup(); + delete ui; } void ShowPlayer::onAddTrack() { @@ -78,7 +93,7 @@ void ShowPlayer::fade(Slider s, int start, CueTrack *track) { void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000, track->fadeOut * 1000); - if (prevCue[track->audioLayer] != nullptr) { + if (track->fadeIn != 0 && prevCue[track->audioLayer] != nullptr) { if (prevCue[track->audioLayer]->pan != track->pan) fade(Slider::Pan, prevCue[track->audioLayer]->pan, track); if (prevCue[track->audioLayer]->pitch != track->pitch) @@ -120,12 +135,12 @@ void ShowPlayer::cueTrackAtEnd(int layer) void ShowPlayer::cueFinished(int c) { - if (!current[c]) - return; - if (!current[c]->stopAtEnd) + if (!current[c]) + return; + if (!current[c]->stopAtEnd) this->go(); - if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused) - cueTrackAtEnd(c); + if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused) + cueTrackAtEnd(c); } CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) { @@ -134,10 +149,12 @@ CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) { widget->loadCueTrack(track); connect(widget, SIGNAL(goAction(int)), this, SLOT(goAction(int))); connect(widget, SIGNAL(cueFinished(int)), this, SLOT(cueFinished(int))); + connect(widget, SIGNAL(changeStatus(int, Status)), this, SIGNAL(uiPlaybackChanged(int, Status))); + connect(widget, SIGNAL(changeVol(int, Slider, int, int, int)), this, SIGNAL(uiSliderChangedFaded(int, Slider, int, int, int))); cueTrackWidgetPlaying[track->audioLayer] = widget; item->setSizeHint(widget->sizeHint()); ui->activeCueList->setItemWidget(item, widget); - return (widget); + return (widget); } void ShowPlayer::playCueTrack(CueTrack* track) { @@ -178,4 +195,28 @@ void ShowPlayer::loadCueTrackList(QString path) { void ShowPlayer::saveCueTrackList(QString path) { ui->cueListWidget->saveCueTrackList(path.toStdString()); -} \ No newline at end of file +} + +void ShowPlayer::panicButtonClicked() { + for (int i = 0; i < MAX_LAYERS; i++) { + if (layersUsed[i] != -1) { + CueTrack* track = current[i]; + if (track && track->active) { + emit uiSliderChanged(track->audioLayer, Slider::Volume, 0); + emit uiPlaybackChanged(track->audioLayer, Status::Paused); + } + } + } +} + +void ShowPlayer::restoreButtonClicked() { + for (int i = 0; i < MAX_LAYERS; i++) { + if (layersUsed[i] != -1) { + CueTrack* track = current[i]; + if (track) { + emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn, track->fadeOut); + emit uiPlaybackChanged(track->audioLayer, track->status); + } + } + } +} diff --git a/src/showplayer.h b/src/showplayer.h index 4054904..9220640 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -26,6 +26,7 @@ class ShowPlayer : public QDialog public: explicit ShowPlayer(QWidget *parent = nullptr); ~ShowPlayer(); + Ui::ShowPlayer *ui; public slots: void cueTrackAtEnd(int layer); @@ -33,13 +34,13 @@ public slots: void saveCueTrackList(QString path); private: - Ui::ShowPlayer *ui; Status currentStatus = Status::Iddle; int layersUsed[MAX_LAYERS]; CueTrack *current[MAX_LAYERS]; CueTrack *prevCue[MAX_LAYERS]; CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS]; CueTrackWidget *addCueTrackWidget(CueTrack *track); + std::map> prePanicState; private slots: void updateTrackStateInEngine(CueTrack *track); @@ -53,11 +54,13 @@ private slots: void goAction(int channel); void updateIndex(int index); void fade(Slider s, int start, CueTrack *track); + void panicButtonClicked(); + void restoreButtonClicked(); signals: void uiPlaybackChanged(int layer, Status s); - void uiSliderChanged(int layer, Slider s, int vol); - void uiSliderChangedFaded(int layer, Slider s, int vol, int fadeIn, int fadeOut); + void uiSliderChanged(int layer, Slider s, int value); + void uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut); void uiLoadMedia(int layer, QString s); }; diff --git a/src/showplayer.ui b/src/showplayer.ui index 42c4603..768f936 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -34,7 +34,7 @@ - + Qt::Vertical @@ -238,7 +238,7 @@ - + Qt::Horizontal @@ -286,6 +286,9 @@ Qt::ClickFocus + + Panic! + ... @@ -295,7 +298,7 @@ - 96 + 120 120 @@ -303,8 +306,26 @@ P + + + Restore + + + + + + + :/buttons/resources/restore_button.jpg:/buttons/resources/restore_button.jpg + + + + 120 + 120 + + + - + Qt::Horizontal