diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index 3e68214..41955a6 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -2,8 +2,8 @@ TEMPLATE = app TARGET = libremediaserver-audio QT += webkitwidgets widgets HEADERS += src/libremediaserver-audio.h \ + src/editcuetrackwidget.h \ src/cuetracklistwidget.h \ - src/cuetrackwidget.h \ src/showplayer.h \ src/clickabledoublespinbox.h \ src/clickablelabel.h \ @@ -23,10 +23,9 @@ HEADERS += src/libremediaserver-audio.h \ src/audiowidget.h \ src/defines.h \ src/settings.h \ - src/slidergroup.h \ - src/trackdialog.h + src/slidergroup.h SOURCES += src/main.cpp \ - src/cuetrackwidget.cpp \ + src/editcuetrackwidget.cpp \ src/showplayer.cpp \ src/clickabledoublespinbox.cpp \ src/clickablelabel.cpp \ @@ -43,8 +42,7 @@ SOURCES += src/main.cpp \ src/audiolayerwidget.cpp \ src/audiowidget.cpp \ src/settings.cpp \ - src/slidergroup.cpp \ - src/trackdialog.cpp + src/slidergroup.cpp FORMS += \ src/showplayer.ui \ src/libremediaserver-audio-ui.ui @@ -59,3 +57,6 @@ OTHER_FILES += \ docs/changelog.txt \ docs/lms-audio.xlm \ docs/roadmap.txt + +SOURCES += \ + src/cuetracklistwidget.cpp diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index 9b6ecf7..576df5c 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -275,10 +275,10 @@ void AudioLayerWidget::setMediaFile(QString file) int size = list.size(); if (size >= 2) { QString tmp = list.at(size - 2); - tmp.truncate(60); + tmp.truncate(64); m_folderValue->setText(tmp); tmp = list.at(size - 1); - tmp.truncate(40); + tmp.truncate(64); m_fileValue->setText(tmp); } } diff --git a/src/clickabledoublespinbox.cpp b/src/clickabledoublespinbox.cpp index 76feb8b..9ec04f4 100644 --- a/src/clickabledoublespinbox.cpp +++ b/src/clickabledoublespinbox.cpp @@ -5,13 +5,5 @@ ClickableDoubleSpinBox::ClickableDoubleSpinBox(QWidget *parent) : QDoubleSpinBox(parent) { - setFocusPolicy(Qt::NoFocus); - setButtonSymbols(QAbstractSpinBox::NoButtons); - setValue(-1); - setDecimals(1); - setAlignment(Qt::AlignHCenter); - setContentsMargins(0, 0, 0, 0); - setMaximumWidth(66); - setMinimumWidth(25); } diff --git a/src/clickabledoublespinbox.h b/src/clickabledoublespinbox.h index 81bcb76..ff668fb 100644 --- a/src/clickabledoublespinbox.h +++ b/src/clickabledoublespinbox.h @@ -10,11 +10,20 @@ class ClickableDoubleSpinBox : public QDoubleSpinBox { Q_OBJECT public: + bool active = false; + explicit ClickableDoubleSpinBox(QWidget *parent = nullptr); protected: void mousePressEvent ( QMouseEvent * event ) { if (event->button() == Qt::LeftButton) { emit click(); + active = true; + //this->setBackgroundRole(QPalette::BrightText); + + } else if (event->button() == Qt::RightButton) { + emit click(); + active = false; + //this->setBackgroundRole(QPalette::Shadow); } event->accept(); } diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index d3b1727..af17160 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -1,94 +1,46 @@ #ifndef CUETRACKLISTWIDGET_H #define CUETRACKLISTWIDGET_H +#include #include #include #include #include #include - -#include "cuetrackwidget.h" +#include +#include +#include +#include "defines.h" +#include "editcuetrackwidget.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(layout->itemAt(index)->widget()); - } - return nullptr; - } - - CueTrackWidget* getSelectedTrack() { - CueTrackWidget* track = getTrackAtIndex(selectedIndex); - key_down(); - return track; - } + explicit CueTrackListWidget(QWidget *parent = nullptr); + CueTrack* getSelectedTrack(); + void createNewCueTrack(); + void editCueTrack(); + void deleteCueTrack(); private: - QScrollArea* scrollArea; - QWidget* containerWidget; + std::vector cueTracks; QVBoxLayout* layout; + QTableWidget* tableWidget; + int m_size = 0; + int size() { return m_size; } + int selectedIndex = 0; + size_t lastUserCueNumber = 0; 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); - } - } - + void addCueTrack(CueTrack* cue); + void removeCueTrack(int index); + CueTrack* getTrackAtIndex(int index); + void key_up(); + void key_down(); + void displayCueTrackInTable(CueTrack *cueTrack); + void keyPressEvent(QKeyEvent* event); + void updateSelectedCueTrack(bool highlightRow); + void cueTrackLoadDefaults(CueTrack * t); + void copyCueTrack(CueTrack *src, CueTrack *dst); }; #endif diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp deleted file mode 100644 index 90e6832..0000000 --- a/src/cuetrackwidget.cpp +++ /dev/null @@ -1,178 +0,0 @@ -#include "cuetrackwidget.h" -#include - -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(statusCombo->currentData().toInt()); - return cueTrack; -} diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h deleted file mode 100644 index b7ddd5c..0000000 --- a/src/cuetrackwidget.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef CUETRACKWIDGET_H -#define CUETRACKWIDGET_H - -#include -#include -#include -#include -#include -#include -#include -#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(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 diff --git a/src/defines.h b/src/defines.h index 64c9eba..1209bcb 100644 --- a/src/defines.h +++ b/src/defines.h @@ -112,6 +112,7 @@ struct CueTrack { int entryPoint; // 0 - 255 int exitPoint; // 0 - 255 int audioLayer; // internal audio layer used when cue is loaded + bool active; }; #endif // __cplusplus diff --git a/src/editcuetrackwidget.cpp b/src/editcuetrackwidget.cpp new file mode 100644 index 0000000..54547fb --- /dev/null +++ b/src/editcuetrackwidget.cpp @@ -0,0 +1,139 @@ +#include "editcuetrackwidget.h" +#include +#include +#include +#include + +EditCueTrackWidget::EditCueTrackWidget(CueTrack *cueTrack, QWidget *parent) + : QDialog(parent) { + setupUi(); + connectSignals(); + this->cueTrack = cueTrack; + loadCueTrack(*cueTrack); +} + +void EditCueTrackWidget::setupUi() { + userNumberSpin = new QSpinBox(this); + nameEdit = new QLineEdit(this); + audioLayerSpin = new QSpinBox(this); + audioLayerSpin->setRange(0, MAX_LAYERS - 1); + filePathEdit = new QLineEdit(this); + statusCombo = new QComboBox(this); + volumeSpin = new QDoubleSpinBox(this); + volumeSpin->setRange(0, 100.01f); + panSpin = new QDoubleSpinBox(this); + pitchSpin = new QDoubleSpinBox(this); + bus1Spin = new QDoubleSpinBox(this); + bus1Spin->setRange(0, 100.01f); + bus2Spin = new QDoubleSpinBox(this); + bus2Spin->setRange(0, 100.01f); + fadeInSpin = new QSpinBox(this); + fadeOutSpin = new QSpinBox(this); + waitInSpin = new QSpinBox(this); + waitOutSpin = new QSpinBox(this); + stopAtEndCheck = new QCheckBox(this); + descriptionEdit = new QLineEdit(this); + entryPointSpin = new QSpinBox(this); + exitPointSpin = new QSpinBox(this); + statusCombo->addItem("Stopped"); + statusCombo->addItem("Paused"); + statusCombo->addItem("PlayingOnce"); + statusCombo->addItem("PlayingLoop"); + statusCombo->addItem("Iddle"); + statusCombo->addItem("PlayingFolder"); + statusCombo->addItem("PlayingFolderLoop"); + statusCombo->addItem("PlayingFolderRandom"); + statusCombo->addItem("PlayingFolderRandomLoop"); + + browseButton = new QPushButton("Browse...", this); + saveButton = new QPushButton("Save", this); + cancelButton = new QPushButton("Cancel", this); + + QFormLayout *layout = new QFormLayout(this); + layout->addRow("User Number", userNumberSpin); + layout->addRow("Name", nameEdit); + layout->addRow("Audio Layer", audioLayerSpin); + layout->addRow("File Path", filePathEdit); + layout->addRow(browseButton); + layout->addRow("Status", statusCombo); + layout->addRow("Fade In", fadeInSpin); + layout->addRow("Fade Out", fadeOutSpin); + layout->addRow("Wait In", waitInSpin); + layout->addRow("Wait Out", waitOutSpin); + layout->addRow("Stop At End", stopAtEndCheck); + layout->addRow("Volume", volumeSpin); + layout->addRow("Bus 1", bus1Spin); + layout->addRow("Bus 2", bus2Spin); + layout->addRow("Pan", panSpin); + layout->addRow("Pitch", pitchSpin); + layout->addRow("Entry Point", entryPointSpin); + layout->addRow("Exit Point", exitPointSpin); + layout->addRow("Description", descriptionEdit); + layout->addRow(saveButton); + layout->addRow(cancelButton); +} + +void EditCueTrackWidget::loadCueTrack(CueTrack cueTrack) { + filePathEdit->setText(cueTrack.filePath.data()); + volumeSpin->setValue(cueTrack.volume); + panSpin->setValue(cueTrack.pan); + pitchSpin->setValue(cueTrack.pitch); + bus1Spin->setValue(cueTrack.bus1); + bus2Spin->setValue(cueTrack.bus2); + fadeInSpin->setValue(cueTrack.fadeIn); + fadeOutSpin->setValue(cueTrack.fadeOut); + waitInSpin->setValue(cueTrack.waitIn); + waitOutSpin->setValue(cueTrack.waitOut); + stopAtEndCheck->setChecked(cueTrack.stopAtEnd); + nameEdit->setText(cueTrack.name.data()); + descriptionEdit->setText(cueTrack.description.data()); + userNumberSpin->setValue(cueTrack.userNumber); + entryPointSpin->setValue(cueTrack.entryPoint); + exitPointSpin->setValue(cueTrack.exitPoint); + statusCombo->setCurrentIndex(statusCombo->findText(statusToString(cueTrack.status))); + audioLayerSpin->setValue(cueTrack.audioLayer); +} + +CueTrack EditCueTrackWidget::saveCueTrack() { + CueTrack cueTrack; + cueTrack.userNumber = userNumberSpin->value(); + cueTrack.name.append(nameEdit->text().toUtf8().constData()); + cueTrack.audioLayer = audioLayerSpin->value(); + cueTrack.filePath.append(filePathEdit->text().toUtf8().constData()); + cueTrack.status = static_cast(statusCombo->currentIndex()); + cueTrack.fadeIn = fadeInSpin->value(); + cueTrack.fadeOut = fadeOutSpin->value(); + cueTrack.waitIn = waitInSpin->value(); + cueTrack.waitOut = waitOutSpin->value(); + cueTrack.stopAtEnd = stopAtEndCheck->isChecked(); + cueTrack.entryPoint = entryPointSpin->value(); + cueTrack.exitPoint = exitPointSpin->value(); + cueTrack.volume = volumeSpin->value(); + cueTrack.bus1 = bus1Spin->value(); + cueTrack.bus2 = bus2Spin->value(); + cueTrack.pan = panSpin->value(); + cueTrack.pitch = pitchSpin->value(); + cueTrack.description.append(descriptionEdit->text().toUtf8().constData()); + return cueTrack; +} + +void EditCueTrackWidget::accept() { + *cueTrack = saveCueTrack(); + QDialog::accept(); +} + +void EditCueTrackWidget::connectSignals() { + connect(saveButton, &QPushButton::clicked, this, &EditCueTrackWidget::accept); + connect(cancelButton, &QPushButton::clicked, this, &EditCueTrackWidget::reject); + connect(browseButton, &QPushButton::clicked, this, &EditCueTrackWidget::onBrowseButtonClicked); +} + +void EditCueTrackWidget::onBrowseButtonClicked() { + QString filePath = QFileDialog::getOpenFileName(this, tr("Select File"), Settings::getInstance()->getPathMedia(), tr("Audio Files (*.mp3 *.wav *.flac)")); + if (!filePath.isEmpty()) { + filePathEdit->setText(filePath); + QDir dir; + Settings::getInstance()->setPathMedia(dir.absoluteFilePath(filePath)); + } +} + diff --git a/src/editcuetrackwidget.h b/src/editcuetrackwidget.h new file mode 100644 index 0000000..080561e --- /dev/null +++ b/src/editcuetrackwidget.h @@ -0,0 +1,54 @@ +#ifndef EDITCUETRACKWIDGET_H +#define EDITCUETRACKWIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "settings.h" +#include "defines.h" + +class EditCueTrackWidget : public QDialog +{ + Q_OBJECT +public: + explicit EditCueTrackWidget(CueTrack *cueTrack, QWidget *parent = nullptr); + CueTrack *cueTrack; + void loadCueTrack(CueTrack cueTrack); + CueTrack saveCueTrack(); + +private: + void setupUi(); + void connectSignals(); + void onBrowseButtonClicked(); + void accept() override; + + QLineEdit *filePathEdit; + QDoubleSpinBox *volumeSpin; + QDoubleSpinBox *panSpin; + QDoubleSpinBox *pitchSpin; + QDoubleSpinBox *bus1Spin; + QDoubleSpinBox *bus2Spin; + QSpinBox *fadeInSpin; + QSpinBox *fadeOutSpin; + QSpinBox *waitInSpin; + QSpinBox *waitOutSpin; + QCheckBox *stopAtEndCheck; + QLineEdit *nameEdit; + QLineEdit *descriptionEdit; + QSpinBox *userNumberSpin; + QSpinBox *entryPointSpin; + QSpinBox *exitPointSpin; + QComboBox *statusCombo; + QSpinBox *audioLayerSpin; + QPushButton *browseButton; + QPushButton *saveButton; + QPushButton *cancelButton; +}; + +#endif // EDITCUETRACKWIDGET_H diff --git a/src/filterbankwidget.cpp b/src/filterbankwidget.cpp index 098e591..c948411 100644 --- a/src/filterbankwidget.cpp +++ b/src/filterbankwidget.cpp @@ -47,6 +47,14 @@ FilterBankWidget::FilterBankWidget(QWidget *parent) } else { fb[j]->setRange(-50, 50); } + fb[j]->setFocusPolicy(Qt::NoFocus); + fb[j]->setButtonSymbols(QAbstractSpinBox::NoButtons); + fb[j]->setValue(-1); + fb[j]->setDecimals(1); + fb[j]->setAlignment(Qt::AlignHCenter); + fb[j]->setContentsMargins(0, 0, 0, 0); + fb[j]->setMaximumWidth(66); + fb[j]->setMinimumWidth(25); filterLayout->insertWidget(j, fb[j]); } filterLayout->setSpacing(0); diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 0a88b2a..1a40036 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -23,7 +23,7 @@ libreMediaServerAudio::libreMediaServerAudio() { - m_settings = Settings::getInstance(); + m_settings = Settings::getInstance(this); m_settings->readFile(); m_ui = m_settings->getShowUi(); m_layersQty = m_settings->getLayersNumber(); @@ -280,7 +280,9 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) { ma_result result; - if (strcmp(mediaFile.toLatin1().constData(), m_currentMedia[layer].toLatin1().constData()) == 0) + if (mediaFile.isEmpty()) + return ; + if (mediaFile.compare(m_currentMedia[layer]) == 0) return; result = m_mae.loadMedia(layer, mediaFile.toLatin1().data()); if (result == MA_SUCCESS) { diff --git a/src/main.cpp b/src/main.cpp index 79b7a91..5cea13f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,8 +31,12 @@ bool hasUi(int &argc, char *argv[]) int main(int argc, char *argv[]) { - QApplication app(argc, argv); - libreMediaServerAudio lms; + QApplication app(argc, argv); + libreMediaServerAudio lms; + app.setApplicationName("LibreMediaServerAudio"); + app.setOrganizationName("Criptomart"); + app.setOrganizationDomain("Criptomart.net"); + app.setApplicationVersion(VERSION); #ifndef NOGUI if (hasUi(argc, argv) || lms.getShowUi()) { diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 5d37356..0e54927 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -58,7 +58,7 @@ bool MiniAudioEngine::startEngine(uint layers, uint* audioDevicesId, uint audioD m_mae.currentStatus[i].pitch = 128; m_mae.currentStatus[i].vol = 0.0f; m_mae.currentStatus[i].cursor = 0; - m_mae.currentStatus[i].updated = false; + m_mae.currentStatus[i].updated = MA_FALSE; } result = this->startContext(); if (result != MA_SUCCESS) return false; @@ -351,6 +351,8 @@ ma_result MiniAudioEngine::loadMedia(int layer, char *file) { ma_result result; + if (!file || !*file) + return MA_INVALID_ARGS; if (m_mae.mediaLoaded[layer] == MA_TRUE) { m_mae.mediaLoaded[layer] = MA_FALSE; @@ -372,7 +374,7 @@ ma_result MiniAudioEngine::loadMedia(int layer, char *file) return result; } m_mae.currentStatus[layer].media = file; - m_mae.currentStatus[layer].updated = true; + m_mae.currentStatus[layer].updated = MA_TRUE; m_mae.mediaLoaded[layer] = MA_TRUE; this->refreshValues(layer); return result; @@ -434,6 +436,8 @@ ma_result MiniAudioEngine::printFormatInfo(int layer) void MiniAudioEngine::volChanged(int layer, int vol) { m_mae.currentStatus[layer].vol = vol; + if (m_mae.mediaLoaded[layer] != MA_TRUE) + return; if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated) return; float db = ((float)vol / 771.0f) - 85.0f; @@ -449,7 +453,7 @@ void MiniAudioEngine::panChanged(int layer, float value) float result; m_mae.currentStatus[layer].pan = value; - if (m_mae.mediaLoaded[layer] == false) + if (m_mae.mediaLoaded[layer] != MA_TRUE) return; result = (value / 128.0) - 1.0; ma_sound_group_set_pan(&m_mae.sounds[layer], result); @@ -460,7 +464,7 @@ void MiniAudioEngine::pitchChanged(int layer, float value) float pitch; m_mae.currentStatus[layer].pitch = value; - if (m_mae.mediaLoaded[layer] == false) + if (m_mae.mediaLoaded[layer] != MA_TRUE) return; pitch = value / 128.0; ma_sound_group_set_pitch(&m_mae.sounds[layer], pitch); @@ -473,7 +477,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) bool loop = false; m_mae.currentStatus[layer].status = status; - if (m_mae.mediaLoaded[layer] == MA_FALSE) + if (m_mae.mediaLoaded[layer] != MA_TRUE) return MA_DOES_NOT_EXIST; m_mae.currentStatus[layer].updated = false; switch (status) { diff --git a/src/settings.cpp b/src/settings.cpp index 6527bcb..2c8361f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2,20 +2,82 @@ Settings *Settings::_instance = 0; -Settings *Settings::getInstance() { +Settings *Settings::getInstance(QObject *parent) { if (_instance == 0) { - _instance = new Settings(); + _instance = new Settings(parent); Q_CHECK_PTR(_instance); } return _instance; } Settings::Settings(QObject *parent) : - QObject(parent) + QSettings{parent} { m_layersNumber = 0; m_ui = false; + m_audioDeviceQty = 0; + for (uint i = 0; i < MAX_AUDIODEVICES; i++) + m_audioDeviceId[i] = -1; + settingsLoader(); +} + +Settings::~Settings() { + settingsSaver(); +} + +void Settings::settingsLoader() +{ + beginGroup("lmsAudio"); + m_ui = value("ui", 0).toBool(); + m_layersNumber = value("layersNumber", 0).toInt(); + m_pathmedia = value("path", "").toString(); + endGroup(); + beginGroup("audioDevice"); + m_audioDeviceQty = value("devicesNumber", 0).toInt(); + for (uint i = 0; i < m_audioDeviceQty; i++) + m_audioDeviceId[i] = value(QString("id%1").arg(i), -1).toInt(); + endGroup(); + beginGroup("layers"); + for (int i = 0; i < m_layersNumber; i++) { + beginGroup(QString("layer%1").arg(i)); + dmxSetting temp; + temp.address = value("dmx", 0).toInt(); + temp.universe = value("universe", 0).toInt(); + temp.layer = value("id", 0).toInt(); + temp.audioDevice = value("audioDevice", 0).toInt(); + m_settings.append(temp); + if (!m_universe.contains(temp.universe)) { + m_universe.insert(temp.universe); + } + endGroup(); + } + endGroup(); + printSettings(); +} + +void Settings::settingsSaver() +{ + beginGroup("lmsAudio"); + setValue("ui", m_ui); + setValue("layersNumber", m_layersNumber); + setValue("path", m_pathmedia); + endGroup(); + beginGroup("audioDevice"); + setValue("devicesNumber", m_audioDeviceQty); + for (uint i = 0; i < m_audioDeviceQty; i++) + setValue(QString("id%1").arg(i), m_audioDeviceId[i]); + endGroup(); + beginGroup("layers"); + for (int i = 0; i < m_layersNumber; i++) { + beginGroup(QString("layer%1").arg(i)); + setValue("dmx", m_settings[i].address); + setValue("universe", m_settings[i].universe); + setValue("id", m_settings[i].layer); + setValue("audioDevice", m_settings[i].audioDevice); + endGroup(); + } + endGroup(); } // Read the dmx settings for dmx.xml At the moment we need: diff --git a/src/settings.h b/src/settings.h index 6e51d14..8f57f0c 100644 --- a/src/settings.h +++ b/src/settings.h @@ -6,20 +6,23 @@ #include #include #include +#include #include "medialibrary.h" #include "audiowidget.h" #include "defines.h" -class Settings : public QObject +class Settings : public QSettings { Q_OBJECT public: - Settings(QObject *parent = 0); - static Settings *getInstance(); + Settings(QObject *parent = nullptr); + ~Settings(); + static Settings *getInstance(QObject *parent = nullptr); inline QSet getUniverses() { return m_universe; } inline QString getPathMedia() { return m_pathmedia; } + inline void setPathMedia(QString new_path) { m_pathmedia = new_path; }; inline QList getDmxSettings() { return m_settings; } inline int getLayersNumber() { return m_layersNumber; } inline uint *getAudioDeviceId() { return m_audioDeviceId; } @@ -28,6 +31,8 @@ public: void readFile(); void readFromFile(QString file); void printSettings(); + void settingsLoader(); + void settingsSaver(); private: static Settings *_instance; diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 6f65f8a..c9108f4 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -1,47 +1,5 @@ #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) @@ -50,37 +8,42 @@ ShowPlayer::ShowPlayer(QWidget *parent) : 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; + for(int i = 0; i < MAX_LAYERS; i++) + layersUsed[i] = -1; } ShowPlayer::~ShowPlayer() {} void ShowPlayer::onAddTrack() { - TrackDialog dialog; - dialog.show(); - if (dialog.exec() == QDialog::Accepted) { - ui->cueListWidget->addCueTrackWidget(dialog.track); - } + ui->cueListWidget->createNewCueTrack(); } void ShowPlayer::go() { - CueTrackWidget* current = ui->cueListWidget->getSelectedTrack(); + CueTrack* current = ui->cueListWidget->getSelectedTrack(); if (!current) return; + if (current->audioLayer < 0) + 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()); + if (layersUsed[i] == -1) { + layersUsed[i] = current->userNumber; + break; + } + } + if (!current->filePath.empty()) + emit uiLoadMedia(current->audioLayer, current->filePath.data()); + updateTrackStateInEngine(current); + emit uiPlaybackChanged(current->audioLayer, current->status); filesLoaded++; } + +void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { + emit uiSliderChanged(track->audioLayer, Slider::Volume, track->volume * 655.35); + 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); +}; diff --git a/src/showplayer.h b/src/showplayer.h index b5e1175..977b0f4 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -5,11 +5,11 @@ #include #include +#include #include "defines.h" -#include "cuetrackwidget.h" #include "cuetracklistwidget.h" -#include "trackdialog.h" +#include "settings.h" #include "ui_showplayer.h" namespace Ui { @@ -26,21 +26,11 @@ public: private: Ui::ShowPlayer *ui; - size_t currentTrackIndex; Status currentStatus = Status::Iddle; size_t filesLoaded = 0; - int layersUsed[MAX_LAYERS] = { -1 }; + int layersUsed[MAX_LAYERS]; - 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()); - }; + void updateTrackStateInEngine(CueTrack *track); private slots: void onAddTrack(); diff --git a/src/showplayer.ui b/src/showplayer.ui index d27f83e..26f0c94 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -6,8 +6,8 @@ 0 0 - 276 - 112 + 538 + 554 @@ -22,6 +22,12 @@ + + + 0 + 0 + + Qt::Vertical @@ -117,16 +123,6 @@ - - - - 1 - - - QLayout::SetMaximumSize - - - true