diff --git a/docs/changelog.txt b/docs/changelog.txt index d019bb8..7ad0243 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -6,15 +6,14 @@ https://git.criptomart.net/libremediaserver Lbre Media Server ChangeLog -v 1.4 -- change engine to miniaudio. -- Select sound device output. -- pan. -- Show faders values. - --> Hacer UI por fader: mute/centrado, valor, visualizador: - --> Hacer UI con la visualización de tiempos. -- SettingsDialog. -- Load/save conf file. +v 0.1.4 ++ change engine to miniaudio. Refactor all audio methods to MiniAudioEngine. ++ Select sound device output. ++ pan. ++ Show faders values. ++ play offset. ++ Refactor AudioMasterWidget to AudioDMXReceptionWidget. Master functions will be in AudioWidget. ++ mp3, flac, wav (mp3 has given some errors seeking cursor...). v 0.1.3 (19/04/2024) diff --git a/docs/roadmap.txt b/docs/roadmap.txt index 91b9a4b..1171e6b 100644 --- a/docs/roadmap.txt +++ b/docs/roadmap.txt @@ -32,8 +32,6 @@ v 1.5 - Play all medias found in folder consecutevily or random, with loop. - Play all medias, consecutevily and random, with loop. - mute/panic on layer. -- loop points. -- play offset. ¿stop offset? - number of layers configured in conf file, up to 256. - Master Bus Layer: - each layer will have one "Gain" prefader that acts in source, "Vol" in v 1.3. @@ -44,10 +42,12 @@ v 1.5 - magicq .hed - audio device linked, outputs will be redirected there. - dmx address + universe settings. -- Keyboards strokes, select files from ui. +- Keyboards strokes, load media files from ui. - Dar la opción clickeando en el widget de tiempo de poner una cuenta atrás en vez de hacia delante. - LOGs y entrada de comandos. - Bufgix: depurar errores cuando no carga la librería de medias, cambia el númmero de capas, cambia el universo, etc. -- Refactor AudioMasterWidget to AudioDMXReceptionWidget. Master functions will be in AudioWidget. - New control mode without pitch control, it saves resources. MA_SOUND_FLAG_NO_PITCH - Vumeter or indicator about audio output in layer and master. +- SettingsDialog. +- Load/save conf file. +- ¿stop offset? is it needed? diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index d86932e..8add248 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -2,6 +2,7 @@ TEMPLATE = app TARGET = libremediaserver-audio QT += webkitwidgets widgets HEADERS += src/libremediaserver-audio.h \ + src/dmxwidget.h \ src/miniaudio.h \ src/medialibrary.h \ src/miniaudioengine.h \ @@ -9,12 +10,13 @@ HEADERS += src/libremediaserver-audio.h \ src/audiolayerwidget.h \ src/dmxPersonality.h \ src/audiowidget.h \ - src/audiomasterwidget.h \ src/defines.h \ src/settings.h \ src/settingsdialog.h \ - src/layersettingswidget.h + src/layersettingswidget.h \ + src/slidergroup.h SOURCES += src/main.cpp \ + src/dmxwidget.cpp \ src/miniaudio.c \ src/libremediaserver-audio.cpp \ src/medialibrary.cpp \ @@ -22,10 +24,10 @@ SOURCES += src/main.cpp \ src/olathread.cpp \ src/audiolayerwidget.cpp \ src/audiowidget.cpp \ - src/audiomasterwidget.cpp \ src/settings.cpp \ src/settingsdialog.cpp \ - src/layersettingswidget.cpp + src/layersettingswidget.cpp \ + src/slidergroup.cpp FORMS += src/libremediaserver-audio.ui \ src/settingsdialog.ui \ src/layersettingswidget.ui diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index 3c58b2c..1a5996c 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -5,102 +5,61 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name, int layer): QGroupBox(parent) , m_layer(layer) , m_suspendResumeButton(0) - , m_volumeIndicator(new QSpinBox) - , m_panIndicator(new QSpinBox) - , m_pitchIndicator(new QSpinBox) { this->setTitle(name); QVBoxLayout *layout = new QVBoxLayout; - QGridLayout *status = new QGridLayout; - m_statusValue = new QLabel; - status->addWidget(m_statusValue, 1, 1); - m_folderValue = new QLabel; - m_folderValue->setMaximumWidth(100); - status->addWidget(m_folderValue, 0, 0); - m_fileValue = new QLabel; - m_fileValue->setMaximumWidth(100); - status->addWidget(m_fileValue, 0, 2); - layout->addLayout(status); - - QGridLayout *volumeBox = new QGridLayout; - m_volumeLabel = new QLabel; - m_volumeLabel->setText(tr(VOLUME_LABEL)); - m_volumeSlider = new QSlider(Qt::Horizontal); - m_volumeSlider->setMinimum(0); - m_volumeSlider->setMaximum(100); - m_volumeSlider->setSingleStep(1); - m_volumeIndicator->setRange(0, 100); - m_volumeIndicator->setValue(0); - m_volumeIndicator->setMaximumWidth(40); - m_volumeIndicator->setButtonSymbols(QAbstractSpinBox::NoButtons); - volumeBox->addWidget(m_volumeLabel, 0, 0); - volumeBox->addWidget(m_volumeSlider, 0, 1); - volumeBox->addWidget(m_volumeIndicator, 0, 2); - connect(m_volumeSlider, SIGNAL(valueChanged(int)), this, SLOT(volumeChanged(int))); - connect(m_volumeSlider, &QSlider::valueChanged, this, [=] () { - m_volumeIndicator->setValue(m_volumeSlider->value()); - }); - m_panLabel = new QLabel; - m_panLabel->setText("Pan"); - m_panSlider = new QSlider(Qt::Horizontal); - m_panSlider->setMinimum(0); - m_panSlider->setMaximum(255); - m_panSlider->setSingleStep(1); - m_panIndicator->setRange(0, 255); - m_panIndicator->setValue(128); - m_panIndicator->setMaximumWidth(40); - m_panIndicator->setButtonSymbols(QAbstractSpinBox::NoButtons); - connect(m_panSlider, &QSlider::valueChanged, this, [=] () { - m_panIndicator->setValue(m_panSlider->value()); - }); - connect(m_panSlider, SIGNAL(valueChanged(int)), this, SLOT(panChanged(int))); - volumeBox->addWidget(m_panLabel, 1, 0); - volumeBox->addWidget(m_panSlider, 1, 1); - volumeBox->addWidget(m_panIndicator, 1, 2); - m_pitchLabel = new QLabel; - m_pitchLabel->setText("Pitch"); - m_pitchSlider = new QSlider(Qt::Horizontal); - m_pitchSlider->setMinimum(0); - m_pitchSlider->setMaximum(255); - m_pitchSlider->setSingleStep(1); - m_pitchIndicator->setRange(0, 255); - m_pitchIndicator->setValue(128); - m_pitchIndicator->setMaximumWidth(40); - m_pitchIndicator->setButtonSymbols(QAbstractSpinBox::NoButtons); - connect(m_pitchSlider, &QSlider::valueChanged, this, [=] () { - m_pitchIndicator->setValue(m_pitchSlider->value()); - }); - connect(m_pitchSlider, SIGNAL(valueChanged(int)), this, SLOT(pitchChanged(int))); - volumeBox->addWidget(m_pitchLabel, 2, 0); - volumeBox->addWidget(m_pitchSlider, 2, 1); - volumeBox->addWidget(m_pitchIndicator, 2, 2); - layout->addLayout(volumeBox); - QHBoxLayout *progressTime = new QHBoxLayout; - m_progressTimeLabel = new QLabel; - m_progressTimeLabel->setText(PROGRESS_TIME_LABEL); + //m_progressTimeLabel = new QLabel; + //m_progressTimeLabel->setText(PROGRESS_TIME_LABEL); + //progressTime->addWidget(m_progressTimeLabel); m_progressTime = new QTimeEdit; m_progressTime->text(); m_progressTime->setDisplayFormat("h:mm:ss:zzz"); m_progressTime->setReadOnly(true); m_progressTime->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_progressTime->setMaximumWidth(100); - progressTime->addWidget(m_progressTimeLabel); + m_progressTime->setMaximumWidth(90); + m_progressTime->setFocusPolicy(Qt::NoFocus); progressTime->addWidget(m_progressTime); - m_totalTimeLabel = new QLabel; - m_totalTimeLabel->setText(TOTAL_TIME_LABEL); + //m_totalTimeLabel = new QLabel; + //m_totalTimeLabel->setText(TOTAL_TIME_LABEL); + //progressTime->addWidget(m_totalTimeLabel); m_totalTimeValue = new QTimeEdit; m_totalTimeValue->setDisplayFormat("h:mm:ss:zzz"); m_totalTimeValue->setReadOnly(true); m_totalTimeValue->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_totalTimeValue->setMaximumWidth(100); - progressTime->addWidget(m_totalTimeLabel); + m_totalTimeValue->setMaximumWidth(90); + m_totalTimeValue->setFocusPolicy(Qt::NoFocus); progressTime->addWidget(m_totalTimeValue); layout->addLayout(progressTime); m_progressSlider = new QSlider(Qt::Horizontal); + m_progressSlider->setFocusPolicy(Qt::NoFocus); layout->addWidget(m_progressSlider); + + QGridLayout *status = new QGridLayout; + m_statusValue = new QLabel; + status->addWidget(m_statusValue, 0, 0); + m_folderValue = new QLabel; + m_folderValue->setMaximumWidth(200); + status->addWidget(m_folderValue, 1, 0); + m_fileValue = new QLabel; + m_fileValue->setMaximumWidth(200); + status->addWidget(m_fileValue, 2, 0); + layout->addLayout(status); + + QHBoxLayout *volumeBox = new QHBoxLayout; + m_volume = new SliderGroup("Vol", 0 , 100, NULL); + volumeBox->addWidget(m_volume); + connect(m_volume, SIGNAL(valueChanged(int)), this, SLOT(volumeChanged(int))); + m_pan = new SliderGroup("Pan", 0 , 255, NULL); + volumeBox->addWidget(m_pan); + connect(m_pan, SIGNAL(valueChanged(int)), this, SLOT(panChanged(int))); + m_pitch = new SliderGroup("Pitch", 0 , 255, NULL); + volumeBox->addWidget(m_pitch); + connect(m_pitch, SIGNAL(valueChanged(int)), this, SLOT(pitchChanged(int))); + layout->addLayout(volumeBox); + m_suspendResumeButton = new QPushButton(this); m_suspendResumeButton->setText(tr(SUSPEND_LABEL)); connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspendResume())); @@ -149,26 +108,23 @@ void AudioLayerWidget::toggleSuspendResume() // from DMX signals void AudioLayerWidget::setVol(qreal vol) { - m_volumeSlider->blockSignals(true); - m_volumeSlider->setValue(vol); - m_volumeIndicator->setValue(vol); - m_volumeSlider->blockSignals(false); + m_volume->blockSignals(true); + m_volume->setValue(vol); + m_volume->blockSignals(false); } void AudioLayerWidget::setPan(qreal pan) { - m_panSlider->blockSignals(true); - m_panSlider->setValue(pan); - m_panIndicator->setValue(pan); - m_panSlider->blockSignals(false); + m_pan->blockSignals(true); + m_pan->setValue(pan); + m_pan->blockSignals(false); } void AudioLayerWidget::setPitch(qreal pitch) { - m_pitchSlider->blockSignals(true); - m_pitchSlider->setValue(pitch); - m_pitchIndicator->setValue(pitch); - m_pitchSlider->blockSignals(false); + m_pitch->blockSignals(true); + m_pitch->setValue(pitch); + m_pitch->blockSignals(false); } void AudioLayerWidget::fileLoaded(QString file) @@ -181,36 +137,35 @@ void AudioLayerWidget::fileLoaded(QString file) } } -QString AudioLayerWidget::getStatus() -{ - QString tmp; - switch (m_status) { - case Status::Paused: - tmp.append("Paused"); - break; - case Status::PlayingLoop: - tmp.append("Playing Loop"); - break; - case Status::PlayingOnce: - tmp.append("Playing one"); - break; - case Status::Stopped: - tmp.append("Stopped"); - break; - } - return tmp; -} - void AudioLayerWidget::setPlaybackStatus(Status status) { m_status = status; if (status == Status::Stopped) m_progressTime->setTime(QTime::fromMSecsSinceStartOfDay(0)); - QString tmp = this->getStatus(); m_statusValue->blockSignals(true); m_suspendResumeButton->blockSignals(true); - m_statusValue->setText(tmp); - m_suspendResumeButton->setText(tmp); + switch (m_status) { + case Status::Paused: + m_statusValue->setText("Pause"); + m_statusValue->setStyleSheet("QLabel { color : red; }"); + m_suspendResumeButton->setText("Pause"); + break; + case Status::PlayingLoop: + m_statusValue->setText("Play Loop"); + m_statusValue->setStyleSheet("QLabel { color : green; }"); + m_suspendResumeButton->setText("Play Loop"); + break; + case Status::PlayingOnce: + m_statusValue->setText("Play One"); + m_statusValue->setStyleSheet("QLabel { color : green; }"); + m_suspendResumeButton->setText("Play One"); + break; + case Status::Stopped: + m_statusValue->setText("Stop"); + m_statusValue->setStyleSheet("QLabel { color : red; }"); + m_suspendResumeButton->setText("Stop"); + break; + } m_statusValue->blockSignals(false); m_suspendResumeButton->blockSignals(false); } diff --git a/src/audiolayerwidget.h b/src/audiolayerwidget.h index f91858f..a484227 100644 --- a/src/audiolayerwidget.h +++ b/src/audiolayerwidget.h @@ -17,6 +17,7 @@ #include #include "defines.h" +#include "slidergroup.h" class AudioLayerWidget : public QGroupBox { @@ -32,7 +33,6 @@ public: void setLoop(bool on); void setPlaybackStatus(Status status); inline Status getPlaybackStatus() { return m_status; } - QString getStatus(); private: Status m_status; @@ -44,15 +44,9 @@ private: QLabel *m_fileValue; QLabel * m_folderLabel; QLabel * m_folderValue; - QLabel *m_volumeLabel; - QSlider *m_volumeSlider; - QSpinBox *m_volumeIndicator; - QLabel *m_panLabel; - QSlider *m_panSlider; - QSpinBox *m_panIndicator; - QLabel *m_pitchLabel; - QSlider *m_pitchSlider; - QSpinBox *m_pitchIndicator; + SliderGroup *m_volume; + SliderGroup *m_pan; + SliderGroup *m_pitch; QLabel * m_progressLabel; QSlider *m_progressSlider; QLabel *m_progressTimeLabel; diff --git a/src/audiowidget.cpp b/src/audiowidget.cpp index d1274d6..63ca562 100644 --- a/src/audiowidget.cpp +++ b/src/audiowidget.cpp @@ -81,6 +81,14 @@ void AudioWidget::playbackChanged(int layer, Status status) dynamic_cast(item->widget())->setPlaybackStatus(status); } +void AudioWidget::entryPointChanged(int layer, int cursor) +{ + m_mae.setCursor(layer, cursor); + QLayoutItem * const item = m_layout->itemAt(layer); + AudioLayerWidget *aw = dynamic_cast(item->widget()); + aw->refreshUi(m_mae.getCursor(layer)); +} + void AudioWidget::refreshUi() { for (int i= 0; i < Settings::getInstance()->getLayersNumber(); i++ ) { QLayoutItem * const item = m_layout->itemAt(i); diff --git a/src/audiowidget.h b/src/audiowidget.h index 26f63b1..cee8dd1 100644 --- a/src/audiowidget.h +++ b/src/audiowidget.h @@ -5,7 +5,7 @@ #include #include -#include "audiomasterwidget.h" +#include "dmxwidget.h" #include "audiolayerwidget.h" #include "settings.h" #include "miniaudioengine.h" @@ -31,6 +31,7 @@ protected: void panChanged(int layer, qreal pan); void pitchChanged(int layer, qreal pitch); void playbackChanged(int layer, Status status); + void entryPointChanged(int layer, int cursor); private: MiniAudioEngine m_mae; diff --git a/src/audiomasterwidget.cpp b/src/dmxwidget.cpp similarity index 51% rename from src/audiomasterwidget.cpp rename to src/dmxwidget.cpp index c8a2db1..4383a76 100644 --- a/src/audiomasterwidget.cpp +++ b/src/dmxwidget.cpp @@ -1,29 +1,32 @@ -#include "audiomasterwidget.h" +#include "dmxwidget.h" -AudioMasterWidget::AudioMasterWidget(QWidget *parent) : +dmxWidget::dmxWidget(QWidget *parent) : QGroupBox(parent) , m_receiveDMX(new QCheckBox) , m_watchDMX(new QTimer) { + this->setFocusPolicy(Qt::FocusPolicy::NoFocus); QVBoxLayout *vbox = new QVBoxLayout; m_receiveDMX->setText("DMX signal"); vbox->addWidget(m_receiveDMX); this->setLayout(vbox); connect(m_watchDMX, SIGNAL(timeout()), this, SLOT(watchDMXExpired())); - m_watchDMX->start(1000); + m_watchDMX->start(2000); } -AudioMasterWidget::~AudioMasterWidget() +dmxWidget::~dmxWidget() { } -void AudioMasterWidget::watchDMXExpired() { +void dmxWidget::watchDMXExpired() { m_receiveDMX->setChecked(false); } -void AudioMasterWidget::updateWatchDMX() +void dmxWidget::updateWatchDMX(int uni) { - m_receiveDMX->setChecked(true); + (void)uni; + if (m_receiveDMX->isChecked() == false) + m_receiveDMX->setChecked(true); } diff --git a/src/audiomasterwidget.h b/src/dmxwidget.h similarity index 54% rename from src/audiomasterwidget.h rename to src/dmxwidget.h index 51218c8..e1540a1 100644 --- a/src/audiomasterwidget.h +++ b/src/dmxwidget.h @@ -1,5 +1,5 @@ -#ifndef AUDIOMASTERWIDGET_H -#define AUDIOMASTERWIDGET_H +#ifndef DMXWIDGET_H +#define DMXWIDGET_H #include #include @@ -7,19 +7,18 @@ #include #include #include +#include - -class AudioMasterWidget : public QGroupBox +class dmxWidget : public QGroupBox { Q_OBJECT public: - AudioMasterWidget(QWidget *parent); - - ~AudioMasterWidget(); + dmxWidget(QWidget *parent); + ~dmxWidget(); public slots: - void updateWatchDMX(); + void updateWatchDMX(int uni); private: QCheckBox *m_receiveDMX; @@ -30,4 +29,4 @@ private slots: }; -#endif // AUDIOMASTERWIDGET_H +#endif // DMXWIDGET_H diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index f8193e7..6f6e263 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -27,55 +27,30 @@ libreMediaServerAudio::libreMediaServerAudio(QStringList args, QWidget *parent) Q_UNUSED(args); ui.setupUi(this); this->setWindowTitle(VERSION); - Settings *set = Settings::getInstance(); set->readFile(); connect(set, SIGNAL(audioDeviceChanged(int)), this, SLOT(audioDeviceChanged(int))); -/* - if (args.contains("-log")) { - // Inicia el widget Terminal - textEdit = new QTextEdit; - textEdit->setReadOnly(true); - QDockWidget *bottomWidget = new QDockWidget(tr("Terminal"), this); - bottomWidget->setAllowedAreas(Qt::BottomDockWidgetArea); - bottomWidget->setWidget(textEdit); - addDockWidget(Qt::BottomDockWidgetArea, bottomWidget); - connect(ola, SIGNAL(toTerminal(QString)), - textEdit, SLOT(append(QString)), Qt::QueuedConnection); - }*/ - - /* connect(MediaLibrary::getInstance(), SIGNAL(debug(QString)), - textEdit, SLOT(append(QString)), Qt::QueuedConnection); - - connect(MediaLibrary::getInstance(), SIGNAL(warning(QString)), - textEdit, SLOT(append(QString)), Qt::QueuedConnection); - */ - this->setWindowTitle(VERSION); qDebug() << VERSION; qDebug() << COPYRIGHT; qDebug() << LICENSE; - - // start audio engine MediaLibrary::getInstance()->initMediaLibrary(); aw = new AudioWidget; setCentralWidget(aw); - amw = new AudioMasterWidget(this); + m_dmxWidget = new dmxWidget(this); QDockWidget *topWidget = new QDockWidget(tr("Master"), this); topWidget->setAllowedAreas(Qt::TopDockWidgetArea); - topWidget->setWidget(amw); + topWidget->setWidget(m_dmxWidget); addDockWidget(Qt::TopDockWidgetArea, topWidget); - // ola setup ola = new olaThread(this, set->getLayersNumber()); Q_CHECK_PTR(ola); ola->blockSignals(true); connect(set, SIGNAL(registerUniverse(int)), ola, SLOT(registerUniverse(int))); - connect(ola, SIGNAL (layerReceived()), amw, SLOT(updateWatchDMX())); + connect(ola, SIGNAL (universeReceived(int)), m_dmxWidget, SLOT(updateWatchDMX(int))); connect(ola, SIGNAL(dmxOutput(int, int, int)), this, SLOT(dmxInput(int, int, int))); connect(ui.actionLaunch_OLA_Setup, SIGNAL(triggered()), this, SLOT(olasetup())); ola->registerUniverse(); ola->start(QThread::TimeCriticalPriority ); - // menus connect(ui.actionOpen_conf, SIGNAL(triggered()), this, SLOT(openFile())); connect(ui.actionSave_conf, SIGNAL(triggered()), this, SLOT(saveFile())); connect(ui.action_Settings, SIGNAL(triggered()), this, SLOT(settings())); @@ -85,21 +60,12 @@ libreMediaServerAudio::libreMediaServerAudio(QStringList args, QWidget *parent) ola->resendDmx(); } -/////////////////////////////////////////////////////////////////// -// Destructor -/////////////////////////////////////////////////////////////////// - libreMediaServerAudio::~libreMediaServerAudio() { ola->stop(); aw->stopEngine(); } -/////////////////////////////////////////////////////////////////// -// Menu File -/////////////////////////////////////////////////////////////////// - -// Open a configuration File void libreMediaServerAudio::openFile() { QFileDialog dialog(this); @@ -110,7 +76,7 @@ void libreMediaServerAudio::openFile() QFile file(fileNames.at(0)); // open(&file); } -// Save configuration File + void libreMediaServerAudio::saveFile() { QFileDialog dialog(this); @@ -128,11 +94,6 @@ void libreMediaServerAudio::settings() sd->show(); } - -/////////////////////////////////////////////////////////////////// -// OLA Stuff -/////////////////////////////////////////////////////////////////// - void libreMediaServerAudio::olasetup() { QWebView *view = new QWebView(); @@ -142,21 +103,20 @@ void libreMediaServerAudio::olasetup() void libreMediaServerAudio::dmxInput(int layer, int channel, int value) { -// This qDebug slows all the program. Uncomment only for debugging purpouse and comment again in normal use -// qDebug() << tr("olaInterface|") << "newdmx layer" << layer << "channel" << channel << "value" << value; if (layer > LAYER_CHANNELS) return; QString mediaFile = NULL; int aux; qreal f; + int r; switch(channel){ - case DMX_FOLDER:// Folder + case DMX_FOLDER: aux = ola->getValue(layer, DMX_FILE); mediaFile = MediaLibrary::getInstance()->requestNewFile(value, aux); if (QFile::exists(mediaFile)) aw->mediaLoaded(layer, mediaFile); break; - case DMX_FILE:// File + case DMX_FILE: aux = ola->getValue(layer, DMX_FOLDER); mediaFile = MediaLibrary::getInstance()->requestNewFile(aux, value); if (QFile::exists(mediaFile)) @@ -176,6 +136,14 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) case PITCH: aw->pitchChanged(layer, value); break; + case ENTRY_POINT_COARSE: + r = ( value * 0x100 ) + ola->getValue(layer, ENTRY_POINT_FINE); + aw->entryPointChanged(layer, r); + break; + case ENTRY_POINT_FINE: + r = ( ola->getValue(layer, ENTRY_POINT_COARSE) * 0x100 ) + value; + aw->entryPointChanged(layer, r); + break; case PLAYBACK: if (value == 0) break; @@ -193,6 +161,8 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) case 3 : aw->playbackChanged(layer, PlayingLoop); break; + default : + break; } default: break; diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 751ffcd..78b347b 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -20,7 +20,6 @@ #ifndef LIBREMEDIASERVERAUDIO_H #define LIBREMEDIASERVERAUDIO_H - #include #include #include @@ -38,7 +37,7 @@ #include "medialibrary.h" #include "olathread.h" #include "settings.h" -#include "audiomasterwidget.h" +#include "dmxwidget.h" #include "settingsdialog.h" #include "defines.h" @@ -56,9 +55,8 @@ public: Ui::LibreMediaServerAudio ui; private: -// void MessageHandler(QtMsgType type, const QMessageLogContext &logcontext, const QString &msg); AudioWidget *aw; - AudioMasterWidget *amw; + dmxWidget *m_dmxWidget; olaThread *ola; void open_start(); @@ -75,6 +73,7 @@ private slots: void openFile(); void saveFile(); void settings(); + }; #endif // LIBREMEDIASERVERAUDIO_H diff --git a/src/medialibrary.cpp b/src/medialibrary.cpp index ee46837..38e8d87 100644 --- a/src/medialibrary.cpp +++ b/src/medialibrary.cpp @@ -42,9 +42,6 @@ void MediaLibrary::initMediaLibrary() { } } -/** - * fill the struct with all files in one library/folder - */ QList MediaLibrary::getMediaInformation(QDir dir) { QList mediaList; @@ -54,7 +51,6 @@ QList MediaLibrary::getMediaInformation(QDir dir) QFileInfo fileInfo; for (int i = 0; i < filelist.size(); ++i) { fileInfo = filelist.at(i); - // Update the data base with the new file mediainf.Number = i; mediainf.MediaName = fileInfo.absoluteFilePath(); mediainf.MediaLength = 1000; @@ -63,9 +59,6 @@ QList MediaLibrary::getMediaInformation(QDir dir) return mediaList; } -/** - * returns the path to a media file from the library. - */ QString MediaLibrary::requestNewFile(int folder, int file){ if (!m_media) { qWarning("MediaLibrary is not init. Set a correct path to media library"); diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index ed010a6..ae74043 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -236,3 +236,16 @@ void MiniAudioEngine::playbackChanged(int layer, Status status) break; } } + +void MiniAudioEngine::setCursor(int layer, int cursor) +{ + ma_uint64 f; + + if (m_mediaLoaded[layer] == false) + return; + ma_sound_get_length_in_pcm_frames(&m_currentSound[layer], &f); + f = (cursor * f) / 65025; + ma_sound_seek_to_pcm_frame(&m_currentSound[layer], f); + //ma_sound_set_start_time_in_pcm_frames(&m_currentSound[layer], f); + //ma_data_source_set_range_in_pcm_frames(&m_currentSound[layer], f, total); +} diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 8cda15b..c38c793 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -26,6 +26,7 @@ protected: void playbackChanged(int layer, Status status); float getDuration(int layer); float getCursor(int layer); + void setCursor(int layer, int cursor); ma_result printFormatInfo(int layer); private: diff --git a/src/olathread.cpp b/src/olathread.cpp index 1453e2d..fdfe041 100644 --- a/src/olathread.cpp +++ b/src/olathread.cpp @@ -75,6 +75,7 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data, } } } + emit universeReceived(data.universe); } /** diff --git a/src/olathread.h b/src/olathread.h index 9692d9e..ee18824 100644 --- a/src/olathread.h +++ b/src/olathread.h @@ -97,6 +97,7 @@ public slots: signals: void dmxOutput(int layer, int channel, int value); + void universeReceived(int uni); }; using namespace ola; diff --git a/src/settings.cpp b/src/settings.cpp index 510685f..b0aab3a 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -89,9 +89,6 @@ void Settings::readFromFile(QString file) { delete xmlFile; } -/** Read the default file - * - */ void Settings::readFile() { readFromFile(DEFAULT_FILE); } diff --git a/src/settings.h b/src/settings.h index 2301d53..5b9c813 100644 --- a/src/settings.h +++ b/src/settings.h @@ -11,157 +11,49 @@ #include "audiowidget.h" #include "defines.h" -/** - * This class stores the settings on lms. - * Is a singleton with set and get methods to manage the settings - * Also writes and reads the settings files. - */ - class Settings : public QObject { Q_OBJECT public: - - static Settings *getInstance(); //Singleton - - /** - * @brief getUniverses - * @return - */ - inline QSet getUniverses() { return m_universe; } - - /** - * @brief getPathMedia - * @return - */ - inline QString getPathMedia() { return m_pathmedia; } - - /** - * @brief setPathMedia - * @param path - */ - void setPathMedia(QString path); - - /** - * @brief getDmxSettings - * @return - */ - inline QList getDmxSettings() { return m_settings; } - - /** - * @brief Get the number of layer currently used - * @return - */ - inline int getLayersNumber() { return m_layersNumber; } - - /** - * @brief Get the number of universes registered - * @return - */ - inline int getUniverseNumber() { return m_universe.size(); } - - /** - * @brief Read the default xml configuration file at startup - */ - void readFile(); - - /** - * @brief changeLayerSetup - * @param layer - * @param universe - * @param address - */ - void changeLayerSetup(int layer, int universe, int address); - - /** - * @brief removeLayer - * @param layer - */ - void removeLayer(int layer); - - /** - * @brief addLayer - */ - void addLayer(); - - /** - * @brief olaThread::setLayersNumber - * @param layersNumber - * - */ - inline void setLayersNumber(int layersNumber) - { + static Settings *getInstance(); + inline QSet getUniverses() { return m_universe; } + inline QString getPathMedia() { return m_pathmedia; } + void setPathMedia(QString path); + inline QList getDmxSettings() { return m_settings; } + inline int getLayersNumber() { return m_layersNumber; } + inline int getUniverseNumber() { return m_universe.size(); } + void readFile(); + void changeLayerSetup(int layer, int universe, int address); + void removeLayer(int layer); + void addLayer(); + inline void setLayersNumber(int layersNumber) + { if (layersNumber <= MAX_LAYERS) m_layersNumber = layersNumber; else m_layersNumber = MAX_LAYERS; - } - - inline int getAudioDeviceId() { return m_audioDeviceId; } - inline void setAudioDeviceId(int id) { m_audioDeviceId = id; } - + } + inline int getAudioDeviceId() { return m_audioDeviceId; } + inline void setAudioDeviceId(int id) { m_audioDeviceId = id; } private: - static Settings *_instance; - - // The list where we store the settings by layer QList m_settings; - - // The path to media library QString m_pathmedia; - - // The SO audio device id used uint m_audioDeviceId; + QSet m_universe; + int m_layersNumber; - /** Constructor - * - */ explicit Settings(QObject *parent = 0); - - QSet m_universe; // Registered universes. - - int m_layersNumber; // Number of layers in wich divide the dmx frame. Each layer, one source. - - /** - * @brief readFromFile - * @param file - */ - void readFromFile(QString file); - - /** - * @brief writeFile - * @param filename - */ + void readFromFile(QString file); // void writeFile(QString filename); // Not implemented yet - - /** - * @brief writeFile - * overload - */ // void writeFile(); // Not implemented yet signals: - - /** - * @brief pathChanged - * @param path - */ void pathChanged(QString path); - - /** - * @brief layersNumber - * @param number - */ void layersNumber(int number); - - /** - * @brief DMXConf - * @param universe - */ void registerUniverse(int universe); - void audioDeviceChanged(int id); }; diff --git a/src/slidergroup.cpp b/src/slidergroup.cpp new file mode 100644 index 0000000..9b7e234 --- /dev/null +++ b/src/slidergroup.cpp @@ -0,0 +1,30 @@ +#include "slidergroup.h" + +SliderGroup::SliderGroup(const QString &title, \ + int min, + int max, + QWidget *parent) + : QGroupBox(title, parent) +{ + this->setFlat(true); + this->setTitle(title); + slider = new QSlider(Qt::Orientation::Vertical); + slider->setFocusPolicy(Qt::StrongFocus); + slider->setTickPosition(QSlider::TicksBothSides); + slider->setTickInterval((max - min) / 11); + slider->setSingleStep(1); + slider->setRange(min, max); + //slider->setInvertedAppearance(false); + //slider->setInvertedControls(false); + valueBox = new QSpinBox(); + valueBox->setFocusPolicy(Qt::NoFocus); + valueBox->setButtonSymbols(QAbstractSpinBox::NoButtons); + valueBox->setMaximumWidth(40); + valueBox->setRange(min, max); + connect(slider, &QSlider::valueChanged, valueBox, &QSpinBox::setValue); + connect(slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int))); + QVBoxLayout *slidersLayout = new QVBoxLayout(); + slidersLayout->addWidget(valueBox); + slidersLayout->addWidget(slider); + setLayout(slidersLayout); +} diff --git a/src/slidergroup.h b/src/slidergroup.h new file mode 100644 index 0000000..9b7b704 --- /dev/null +++ b/src/slidergroup.h @@ -0,0 +1,38 @@ +#ifndef SLIDERGROUP_H +#define SLIDERGROUP_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QDial; +class QScrollBar; +class QSlider; +QT_END_NAMESPACE + +class SliderGroup : public QGroupBox +{ + Q_OBJECT + +public: + SliderGroup(const QString &title, + int min, + int max, + QWidget *parent = nullptr); + +signals: + void valueChanged(int value); + +public slots: + inline void setValue(int value) { slider->setValue(value); }; + inline void sliderValueChanged(int value) { emit valueChanged(value); }; + +private: + QSlider *slider; + QSpinBox *valueBox; +}; + +#endif