better ui, change colors and font

This commit is contained in:
snt 2024-05-04 15:05:45 +02:00
parent 1fccbf64fd
commit 88704cd726
9 changed files with 129 additions and 97 deletions

View file

@ -4,39 +4,47 @@ Libre Media Server Audio - An Open source Media Server for arts and performing.
https://git.criptomart.net/libremediaserver 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. + Select sound device output.
+ pan. + Pan.
+ Show faders values. + Show faders values. New SliderGroup class.
+ play offset. + Entry Point 16 bits.
+ Refactor AudioMasterWidget to AudioDMXReceptionWidget. + Refactor AudioMasterWidget to AudioDMXReceptionWidget.
+ mp3, flac, wav (mp3 has given some errors seeking cursor...). + Read mp3, flac, wav (mp3 has given some errors seeking cursor...).
+ settings dialog not working, only read the conf file at startup. + Removed settings dialog, only read xml conf file at startup.
+ variable number of layers. + Real dynamic variable number of layers based on conf file setting.
+ olathread, send double channels only once for each dmx frame buffer. + 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. + Ubuntu 22.04 jammy.
+ Use SFML as audio engine.
+ Qt 5.15.3. + Qt 5.15.3.
+ pitch. + Pitch.
+ loop. + Loop.
v 0.1.2 Mayordomo (12/08/2015) v 0.1.2 Mayordomo (12/08/2015)
- GUI config - GUI config.
- Several bugs tested in real world - Several bugs tested in real world.
- variable layers - Variable layers.
- SFML as audio engine - SFML as audio engine.
v 0.1.1 Pascual (24/09/2014) v 0.1.1 Pascual (24/09/2014)
+ First Version: 4 layers playing .ogg + First Version: 4 layers playing .ogg.
+ Needs Open Lighting Arquitecture => 0.9.0 + Needs Open Lighting Arquitecture => 0.9.0.
+ Pure Data as audio engine + Pure Data as audio engine.

View file

@ -20,8 +20,8 @@ v 0.2.2
+ hay que empaquetar OLA, incluirlo en el binario, o implementar sACN y linkarlo estáticamente. + hay que empaquetar OLA, incluirlo en el binario, o implementar sACN y linkarlo estáticamente.
+ https://github.com/ETCLabs/sACN + https://github.com/ETCLabs/sACN
- Qt6. - Qt6.
- audio processing (eq, rev, compresor, ...) por master y capa. - Audio processing (eq, rev, compresor, ...) by master and layer.
- CIPT/MSex, send icons play-pause-stop. - CIPT/MSex, send icons play/pause/stop.
- Rasp build. - Rasp build.
- Octopus Sound Card support (6 outputs - 8 inputs). - Octopus Sound Card support (6 outputs - 8 inputs).
@ -41,15 +41,13 @@ v 0.2.1
- audio device linked, outputs will be redirected there. - audio device linked, outputs will be redirected there.
- dmx address + universe settings. - dmx address + universe settings.
- Rose noise and sine generator in menu to test system. - Rose noise and sine generator in menu to test system.
- Keyboards strokes, load media files from ui. - Ui/Ux; 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: Dar la opción clickeando en el widget de tiempo de poner una cuenta atrás en vez de hacia delante.
- Logs, verbosity, timestamp. - 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 play mode without pitch control, it saves resources. MA_SOUND_FLAG_NO_PITCH
- New control mode without pitch control, it saves resources. MA_SOUND_FLAG_NO_PITCH
- Vumeter or indicator about audio output in layer and master. - Vumeter or indicator about audio output in layer and master.
- SettingsDialog. - SettingsDialog.
- Load/save conf file. - Load/save conf file.
- ¿stop offset? is it needed? - ¿Exit Point? is it needed?
- decouple MiniAudioEngine from AudioWidget, starts whith no gui or with audio in a dedicated thread. - Hardening: check return errors, i'm too happy....
- New Status "Iddle" in playbacks if is not loaded. - Tests: errors on wrong conf file.
- check return errors, we are too happy....

View file

@ -8,9 +8,31 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer):
{ {
QVBoxLayout *layout = new QVBoxLayout; 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 = new QPushButton(this);
m_suspendResumeButton->setText(StatusStr[Status::Iddle]); m_suspendResumeButton->setText(StatusStr[Status::Iddle]);
m_suspendResumeButton->setMaximumWidth(200); //m_suspendResumeButton->setMaximumWidth(180);
//connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspendResume())); //connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspendResume()));
layout->addWidget(m_suspendResumeButton); layout->addWidget(m_suspendResumeButton);
@ -19,7 +41,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer):
m_progress->setRange(0, 0); m_progress->setRange(0, 0);
m_progress->setValue(0); m_progress->setValue(0);
m_progress->setFormat("%v / %m"); m_progress->setFormat("%v / %m");
m_progress->setMaximumWidth(200); //m_progress->setMaximumWidth(180);
layout->addWidget(m_progress); layout->addWidget(m_progress);
m_progressTime = new QTimeEdit; m_progressTime = new QTimeEdit;
@ -28,7 +50,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer):
m_progressTime->setDisplayFormat("h:mm:ss:zzz"); m_progressTime->setDisplayFormat("h:mm:ss:zzz");
m_progressTime->setReadOnly(true); m_progressTime->setReadOnly(true);
m_progressTime->setButtonSymbols(QAbstractSpinBox::NoButtons); m_progressTime->setButtonSymbols(QAbstractSpinBox::NoButtons);
m_progressTime->setMaximumWidth(88); //m_progressTime->setMaximumWidth(80);
m_progressTime->setFocusPolicy(Qt::NoFocus); m_progressTime->setFocusPolicy(Qt::NoFocus);
m_totalTimeValue = new QTimeEdit; m_totalTimeValue = new QTimeEdit;
m_totalTimeValue->setObjectName("Track Length"); m_totalTimeValue->setObjectName("Track Length");
@ -36,32 +58,28 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer):
m_totalTimeValue->setDisplayFormat("h:mm:ss:zzz"); m_totalTimeValue->setDisplayFormat("h:mm:ss:zzz");
m_totalTimeValue->setReadOnly(true); m_totalTimeValue->setReadOnly(true);
m_totalTimeValue->setButtonSymbols(QAbstractSpinBox::NoButtons); m_totalTimeValue->setButtonSymbols(QAbstractSpinBox::NoButtons);
m_totalTimeValue->setMaximumWidth(88); //m_totalTimeValue->setMaximumWidth(80);
m_totalTimeValue->setFocusPolicy(Qt::NoFocus); m_totalTimeValue->setFocusPolicy(Qt::NoFocus);
QHBoxLayout *status = new QHBoxLayout; QHBoxLayout *status = new QHBoxLayout;
status->addWidget(m_progressTime); status->addWidget(m_progressTime);
status->addWidget(m_totalTimeValue); status->addWidget(m_totalTimeValue);
layout->addLayout(status); 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; 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); volumeBox->addWidget(m_volume);
connect(m_volume, SIGNAL(valueChanged(float)), this, SLOT(volumeChanged(float))); 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); volumeBox->addWidget(m_pan);
connect(m_pan, SIGNAL(valueChanged(float)), this, SLOT(panChanged(float))); 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->addWidget(m_pitch);
volumeBox->setSpacing(0);
volumeBox->setContentsMargins(0, 0, 0, 0);
connect(m_pitch, SIGNAL(valueChanged(float)), this, SLOT(pitchChanged(float))); connect(m_pitch, SIGNAL(valueChanged(float)), this, SLOT(pitchChanged(float)));
layout->addLayout(volumeBox); layout->addLayout(volumeBox);
layout->setAlignment(Qt::AlignHCenter);
layout->setSpacing(0);
layout->setContentsMargins(2, 2, 2, 2);
this->setLayout(layout); this->setLayout(layout);
} }

View file

@ -10,6 +10,8 @@ AudioWidget::AudioWidget() :
connect(alw, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderAction(int, Slider, int))); connect(alw, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderAction(int, Slider, int)));
connect(alw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiChangePlaybackStatus(int, Status))); 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); setLayout(m_layout);
} }

View file

@ -9,6 +9,8 @@ dmxWidget::dmxWidget(QWidget *parent) :
QVBoxLayout *vbox = new QVBoxLayout; QVBoxLayout *vbox = new QVBoxLayout;
m_receiveDMX->setText("DMX Signal"); m_receiveDMX->setText("DMX Signal");
vbox->addWidget(m_receiveDMX); vbox->addWidget(m_receiveDMX);
vbox->setSpacing(1);
vbox->setContentsMargins(1, 1, 1, 1);
this->setLayout(vbox); this->setLayout(vbox);
connect(m_watchDMX, SIGNAL(timeout()), connect(m_watchDMX, SIGNAL(timeout()),
this, SLOT(watchDMXExpired())); this, SLOT(watchDMXExpired()));

View file

@ -32,8 +32,16 @@ libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent)
QDockWidget *topWidget = new QDockWidget(tr("Master"), this); QDockWidget *topWidget = new QDockWidget(tr("Master"), this);
topWidget->setAllowedAreas(Qt::TopDockWidgetArea); topWidget->setAllowedAreas(Qt::TopDockWidgetArea);
topWidget->setWidget(m_dmxWidget); topWidget->setWidget(m_dmxWidget);
topWidget->setContentsMargins(0, 0, 0, 0);
addDockWidget(Qt::TopDockWidgetArea, topWidget); addDockWidget(Qt::TopDockWidgetArea, topWidget);
connect(ui.actionLaunch_OLA_Setup, SIGNAL(triggered()), this, SLOT(olasetup())); 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() libreMediaServerAudioUi::~libreMediaServerAudioUi()

View file

@ -1,19 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<author>Santi Noreña belfegor@gmail.com</author> <author>Santi Noreña lms@criptomart.net</author>
<class>LibreMediaServerAudio</class> <class>LibreMediaServerAudio</class>
<widget class="QMainWindow" name="LibreMediaServer Audio"> <widget class="QMainWindow" name="LibreMediaServer Audio">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>114</width> <width>800</width>
<height>218</height> <height>800</height>
</rect> </rect>
</property> </property>
<property name="font">
<font>
<family>Unifont</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>LibreMediaServer</string> <string>LibreMediaServer</string>
</property> </property>
<property name="windowIcon">
<iconset>
<normaloff>../../../../criptomart/artwork/logo_v2_criptomart.net.png</normaloff>../../../../criptomart/artwork/logo_v2_criptomart.net.png</iconset>
</property>
<widget class="QWidget" name="centralwidget"/> <widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
<property name="geometry"> <property name="geometry">
@ -21,7 +33,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>114</width> <width>114</width>
<height>22</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
@ -32,47 +44,9 @@
</widget> </widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
</widget> </widget>
<action name="actionExit">
<property name="text">
<string>Exit</string>
</property>
</action>
<action name="actionOpen_conf">
<property name="text">
<string>Open Configuration...</string>
</property>
</action>
<action name="actionSave_conf">
<property name="text">
<string>Save Configuration...</string>
</property>
</action>
<action name="action_Settings">
<property name="text">
<string>Settings...</string>
</property>
</action>
<action name="actionInitMSEX">
<property name="checkable">
<bool>false</bool>
</property>
<property name="text">
<string>Init</string>
</property>
</action>
<action name="actionIP_Address">
<property name="text">
<string>IP Address</string>
</property>
</action>
<action name="actionMake_Thumbs">
<property name="text">
<string>Make Thumbs</string>
</property>
</action>
<action name="actionLaunch_OLA_Setup"> <action name="actionLaunch_OLA_Setup">
<property name="text"> <property name="text">
<string>OLA Setup...</string> <string>OLA Setup</string>
</property> </property>
</action> </action>
</widget> </widget>

View file

@ -1,6 +1,7 @@
#include "slidergroup.h" #include "slidergroup.h"
SliderGroup::SliderGroup(int min, SliderGroup::SliderGroup(QString name,
int min,
int max, int max,
int decimals, int decimals,
QWidget *parent) QWidget *parent)
@ -8,23 +9,43 @@ SliderGroup::SliderGroup(int min,
{ {
QVBoxLayout *layout = new QVBoxLayout; QVBoxLayout *layout = new QVBoxLayout;
layout->setAlignment(Qt::AlignHCenter); layout->setAlignment(Qt::AlignHCenter);
this->setMaximumWidth(65); layout->setContentsMargins(0, 0, 0, 0);
//this->setMaximumWidth(40);
slider = new QSlider(Qt::Orientation::Vertical); slider = new QSlider(Qt::Orientation::Vertical);
slider->setFocusPolicy(Qt::StrongFocus); slider->setFocusPolicy(Qt::StrongFocus);
slider->setTickPosition(QSlider::TicksBothSides); slider->setTickPosition(QSlider::TicksBothSides);
slider->setTickInterval((max - min) / 11); slider->setTickInterval((max - min) / 11);
slider->setMinimumHeight(100);
slider->setSingleStep(1); slider->setSingleStep(1);
slider->setRange(min, max); 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 = new QDoubleSpinBox();
valueBox->setFocusPolicy(Qt::NoFocus); valueBox->setFocusPolicy(Qt::NoFocus);
valueBox->setButtonSymbols(QAbstractSpinBox::NoButtons); valueBox->setButtonSymbols(QAbstractSpinBox::NoButtons);
valueBox->setMaximumWidth(65); //valueBox->setMaximumWidth(40);
valueBox->setRange(min, max); valueBox->setRange(min, max);
valueBox->setDecimals(decimals); 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))); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int)));
layout->addWidget(slider); layout->addWidget(slider);
layout->addWidget(valueBox); 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); this->setLayout(layout);
} }

View file

@ -11,7 +11,8 @@ class SliderGroup : public QWidget
Q_OBJECT Q_OBJECT
public: public:
SliderGroup(int min, SliderGroup(QString name,
int min,
int max, int max,
int decimals, int decimals,
QWidget *parent = nullptr); QWidget *parent = nullptr);