diff --git a/docs/changelog.txt b/docs/changelog.txt index 48b0ddf..22a7e1f 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -4,39 +4,47 @@ Libre Media Server Audio - An Open source Media Server for arts and performing. https://git.criptomart.net/libremediaserver ******************************************************************************* -Lbre Media Server ChangeLog +Libre Media Server ChangeLog -v 0.2.0 Antigona (24/04/2024) -+ change engine to miniaudio because is imposible pan in SFML and it has not access to low API and audio processing. -+ Refactor all audio methods to MiniAudioEngine. + + + + + +v 0.2.0 Antígona (24/04/2024) ++ Change audio engine to miniaudio because is imposible pan in SFML and it has not access to low API and audio processing. ++ Refactor all audio methods to MiniAudioEngine class. + Select sound device output. -+ pan. -+ Show faders values. -+ play offset. ++ Pan. ++ Show faders values. New SliderGroup class. ++ Entry Point 16 bits. + Refactor AudioMasterWidget to AudioDMXReceptionWidget. -+ mp3, flac, wav (mp3 has given some errors seeking cursor...). -+ settings dialog not working, only read the conf file at startup. -+ variable number of layers. -+ olathread, send double channels only once for each dmx frame buffer. ++ Read mp3, flac, wav (mp3 has given some errors seeking cursor...). ++ Removed settings dialog, only read xml conf file at startup. ++ Real dynamic variable number of layers based on conf file setting. ++ OlaThread send double channels (volume, entry point, load media) only once for each dmx frame buffer. ++ Terminal mode without graphical interface. All audio methods has been refactorized out of QWidget world. ++ Compilation without GUI (-DNOGUI). ++ New Status "Iddle" in playbacks if is not loaded. ++ New DMX personality version, better sort for audio needs (first load media, set vol, pan, etc, last playback order); -v 0.1.3 Unreleased (19/04/2024) +v 0.1.3 Leúcade (19/04/2024) + Ubuntu 22.04 jammy. -+ Use SFML as audio engine. + Qt 5.15.3. -+ pitch. -+ loop. ++ Pitch. ++ Loop. v 0.1.2 Mayordomo (12/08/2015) -- GUI config -- Several bugs tested in real world -- variable layers -- SFML as audio engine +- GUI config. +- Several bugs tested in real world. +- Variable layers. +- SFML as audio engine. v 0.1.1 Pascual (24/09/2014) -+ First Version: 4 layers playing .ogg -+ Needs Open Lighting Arquitecture => 0.9.0 -+ Pure Data as audio engine ++ First Version: 4 layers playing .ogg. ++ Needs Open Lighting Arquitecture => 0.9.0. ++ Pure Data as audio engine. diff --git a/docs/roadmap.txt b/docs/roadmap.txt index 8ff57d7..6b12098 100644 --- a/docs/roadmap.txt +++ b/docs/roadmap.txt @@ -20,8 +20,8 @@ v 0.2.2 + hay que empaquetar OLA, incluirlo en el binario, o implementar sACN y linkarlo estáticamente. + https://github.com/ETCLabs/sACN - Qt6. -- audio processing (eq, rev, compresor, ...) por master y capa. -- CIPT/MSex, send icons play-pause-stop. +- Audio processing (eq, rev, compresor, ...) by master and layer. +- CIPT/MSex, send icons play/pause/stop. - Rasp build. - Octopus Sound Card support (6 outputs - 8 inputs). @@ -41,15 +41,13 @@ v 0.2.1 - audio device linked, outputs will be redirected there. - dmx address + universe settings. - Rose noise and sine generator in menu to test system. -- 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. +- Ui/Ux; Keyboards strokes, load media files from ui. +- Ui/Ux: Dar la opción clickeando en el widget de tiempo de poner una cuenta atrás en vez de hacia delante. - Logs, verbosity, timestamp. -- Bufgix: depurar errores cuando no carga la librería de medias, cambia el númmero de capas, cambia el universo, etc. -- New control mode without pitch control, it saves resources. MA_SOUND_FLAG_NO_PITCH +- New play 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? -- decouple MiniAudioEngine from AudioWidget, starts whith no gui or with audio in a dedicated thread. -- New Status "Iddle" in playbacks if is not loaded. -- check return errors, we are too happy.... +- ¿Exit Point? is it needed? +- Hardening: check return errors, i'm too happy.... +- Tests: errors on wrong conf file. diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index ffb8341..23dcb9a 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -8,9 +8,31 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): { QVBoxLayout *layout = new QVBoxLayout; + QVBoxLayout *playback = new QVBoxLayout; + m_folderValue = new QLabel; + //m_folderValue->setMaximumWidth(160); + m_folderValue->setAlignment(Qt::AlignHCenter); + m_folderValue->setStyleSheet( + "color: white;" + "background-color: black;" + ); + playback->addWidget(m_folderValue); + m_fileValue = new QLabel; + //m_fileValue->setMaximumWidth(160); + m_fileValue->setAlignment(Qt::AlignHCenter); + m_fileValue->setStyleSheet( + "color: white;" + "background-color: black;" + ); + + playback->addWidget(m_fileValue); + playback->setSpacing(0); + playback->setContentsMargins(0, 0, 0, 0); + layout->addLayout(playback); + m_suspendResumeButton = new QPushButton(this); m_suspendResumeButton->setText(StatusStr[Status::Iddle]); - m_suspendResumeButton->setMaximumWidth(200); + //m_suspendResumeButton->setMaximumWidth(180); //connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspendResume())); layout->addWidget(m_suspendResumeButton); @@ -19,7 +41,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): m_progress->setRange(0, 0); m_progress->setValue(0); m_progress->setFormat("%v / %m"); - m_progress->setMaximumWidth(200); + //m_progress->setMaximumWidth(180); layout->addWidget(m_progress); m_progressTime = new QTimeEdit; @@ -28,7 +50,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): m_progressTime->setDisplayFormat("h:mm:ss:zzz"); m_progressTime->setReadOnly(true); m_progressTime->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_progressTime->setMaximumWidth(88); + //m_progressTime->setMaximumWidth(80); m_progressTime->setFocusPolicy(Qt::NoFocus); m_totalTimeValue = new QTimeEdit; m_totalTimeValue->setObjectName("Track Length"); @@ -36,32 +58,28 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): m_totalTimeValue->setDisplayFormat("h:mm:ss:zzz"); m_totalTimeValue->setReadOnly(true); m_totalTimeValue->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_totalTimeValue->setMaximumWidth(88); + //m_totalTimeValue->setMaximumWidth(80); m_totalTimeValue->setFocusPolicy(Qt::NoFocus); QHBoxLayout *status = new QHBoxLayout; status->addWidget(m_progressTime); status->addWidget(m_totalTimeValue); layout->addLayout(status); - QVBoxLayout *playback = new QVBoxLayout; - m_folderValue = new QLabel; - m_folderValue->setMaximumWidth(200); - playback->addWidget(m_folderValue); - m_fileValue = new QLabel; - m_fileValue->setMaximumWidth(200); - playback->addWidget(m_fileValue); - layout->addLayout(playback); - QHBoxLayout *volumeBox = new QHBoxLayout; - m_volume = new SliderGroup(0 , 100, 2, NULL); + m_volume = new SliderGroup("Vol", 0 , 100, 2, NULL); volumeBox->addWidget(m_volume); connect(m_volume, SIGNAL(valueChanged(float)), this, SLOT(volumeChanged(float))); - m_pan = new SliderGroup(0 , 255, 0, NULL); + m_pan = new SliderGroup("Pan", 0 , 255, 0, NULL); volumeBox->addWidget(m_pan); connect(m_pan, SIGNAL(valueChanged(float)), this, SLOT(panChanged(float))); - m_pitch = new SliderGroup(0 , 255, 0, NULL); + m_pitch = new SliderGroup("Pitch", 0 , 255, 0, NULL); volumeBox->addWidget(m_pitch); + volumeBox->setSpacing(0); + volumeBox->setContentsMargins(0, 0, 0, 0); connect(m_pitch, SIGNAL(valueChanged(float)), this, SLOT(pitchChanged(float))); layout->addLayout(volumeBox); + layout->setAlignment(Qt::AlignHCenter); + layout->setSpacing(0); + layout->setContentsMargins(2, 2, 2, 2); this->setLayout(layout); } diff --git a/src/audiowidget.cpp b/src/audiowidget.cpp index 69dc60d..316e43a 100644 --- a/src/audiowidget.cpp +++ b/src/audiowidget.cpp @@ -10,6 +10,8 @@ AudioWidget::AudioWidget() : connect(alw, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderAction(int, Slider, int))); connect(alw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiChangePlaybackStatus(int, Status))); } + m_layout->setSpacing(0); + m_layout->setContentsMargins(0, 0, 0, 0); setLayout(m_layout); } diff --git a/src/dmxwidget.cpp b/src/dmxwidget.cpp index 60d4206..c5b4150 100644 --- a/src/dmxwidget.cpp +++ b/src/dmxwidget.cpp @@ -9,6 +9,8 @@ dmxWidget::dmxWidget(QWidget *parent) : QVBoxLayout *vbox = new QVBoxLayout; m_receiveDMX->setText("DMX Signal"); vbox->addWidget(m_receiveDMX); + vbox->setSpacing(1); + vbox->setContentsMargins(1, 1, 1, 1); this->setLayout(vbox); connect(m_watchDMX, SIGNAL(timeout()), this, SLOT(watchDMXExpired())); diff --git a/src/libremediaserver-audio-gui.cpp b/src/libremediaserver-audio-gui.cpp index a300229..5c366ac 100644 --- a/src/libremediaserver-audio-gui.cpp +++ b/src/libremediaserver-audio-gui.cpp @@ -32,8 +32,16 @@ libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent) QDockWidget *topWidget = new QDockWidget(tr("Master"), this); topWidget->setAllowedAreas(Qt::TopDockWidgetArea); topWidget->setWidget(m_dmxWidget); + topWidget->setContentsMargins(0, 0, 0, 0); addDockWidget(Qt::TopDockWidgetArea, topWidget); connect(ui.actionLaunch_OLA_Setup, SIGNAL(triggered()), this, SLOT(olasetup())); + this->setContentsMargins(5, 5, 5, 5); + this->setStyleSheet( + "color: white;" + "background-color: gray;" + "selection-color: blue;" + "selection-background-color: green" + ); } libreMediaServerAudioUi::~libreMediaServerAudioUi() diff --git a/src/libremediaserver-audio-gui.ui b/src/libremediaserver-audio-gui.ui index 6ade744..65c83c2 100644 --- a/src/libremediaserver-audio-gui.ui +++ b/src/libremediaserver-audio-gui.ui @@ -1,19 +1,31 @@ - Santi Noreña belfegor@gmail.com + Santi Noreña lms@criptomart.net LibreMediaServerAudio - + 0 0 - 114 - 218 + 800 + 800 + + + Unifont + 12 + 75 + true + + LibreMediaServer + + + ../../../../criptomart/artwork/logo_v2_criptomart.net.png../../../../criptomart/artwork/logo_v2_criptomart.net.png + @@ -21,7 +33,7 @@ 0 0 114 - 22 + 21 @@ -32,47 +44,9 @@ - - - Exit - - - - - Open Configuration... - - - - - Save Configuration... - - - - - Settings... - - - - - false - - - Init - - - - - IP Address - - - - - Make Thumbs - - - OLA Setup... + OLA Setup diff --git a/src/slidergroup.cpp b/src/slidergroup.cpp index 2941bc4..4bef674 100644 --- a/src/slidergroup.cpp +++ b/src/slidergroup.cpp @@ -1,6 +1,7 @@ #include "slidergroup.h" -SliderGroup::SliderGroup(int min, +SliderGroup::SliderGroup(QString name, + int min, int max, int decimals, QWidget *parent) @@ -8,23 +9,43 @@ SliderGroup::SliderGroup(int min, { QVBoxLayout *layout = new QVBoxLayout; layout->setAlignment(Qt::AlignHCenter); - this->setMaximumWidth(65); + layout->setContentsMargins(0, 0, 0, 0); + //this->setMaximumWidth(40); slider = new QSlider(Qt::Orientation::Vertical); slider->setFocusPolicy(Qt::StrongFocus); slider->setTickPosition(QSlider::TicksBothSides); slider->setTickInterval((max - min) / 11); + slider->setMinimumHeight(100); slider->setSingleStep(1); slider->setRange(min, max); - slider->setMaximumWidth(65); + //slider->setMaximumWidth(40); + slider->setToolTip(name); + slider->setStyleSheet("QSlider {" + "border: 1px solid #999999;" + "margin: 0px;" + "height: 200px;" + "width: 40px;}" + ); + slider->setContentsMargins(0, 0, 0, 0); valueBox = new QDoubleSpinBox(); valueBox->setFocusPolicy(Qt::NoFocus); valueBox->setButtonSymbols(QAbstractSpinBox::NoButtons); - valueBox->setMaximumWidth(65); + //valueBox->setMaximumWidth(40); valueBox->setRange(min, max); valueBox->setDecimals(decimals); + valueBox->setObjectName(name); + valueBox->setToolTip(name); + valueBox->setAlignment(Qt::AlignHCenter); + valueBox->setContentsMargins(0, 0, 0, 0); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int))); layout->addWidget(slider); layout->addWidget(valueBox); + this->setStyleSheet("border: 1px solid #999999;" + "width: 40px;" + "margin: 0px;" + ); + layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); this->setLayout(layout); } diff --git a/src/slidergroup.h b/src/slidergroup.h index 8972d56..1d8cc8c 100644 --- a/src/slidergroup.h +++ b/src/slidergroup.h @@ -11,7 +11,8 @@ class SliderGroup : public QWidget Q_OBJECT public: - SliderGroup(int min, + SliderGroup(QString name, + int min, int max, int decimals, QWidget *parent = nullptr);