Antigona Release #1

Merged
snt merged 49 commits from filters into main 2024-05-26 12:42:53 +00:00
10 changed files with 50 additions and 125 deletions
Showing only changes of commit b59cc92c5f - Show all commits

View file

@ -13,23 +13,14 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, QString name, int layer):
QVBoxLayout *layout = new QVBoxLayout; QVBoxLayout *layout = new QVBoxLayout;
QGridLayout *status = new QGridLayout; QGridLayout *status = new QGridLayout;
m_statusLabel = new QLabel;
m_statusLabel->setText(STATUS_LABEL);
m_statusValue = new QLabel; m_statusValue = new QLabel;
status->addWidget(m_statusLabel, 0, 0); status->addWidget(m_statusValue, 1, 1);
status->addWidget(m_statusValue, 0, 2);
m_folderLabel = new QLabel;
m_folderLabel->setText(FOLDER_LABEL);
m_folderValue = new QLabel; m_folderValue = new QLabel;
m_folderValue->setMaximumWidth(200); m_folderValue->setMaximumWidth(100);
status->addWidget(m_folderLabel, 1, 0); status->addWidget(m_folderValue, 0, 0);
status->addWidget(m_folderValue, 1, 1);
m_fileLabel = new QLabel;
m_fileLabel->setText(FILE_LABEL);
m_fileValue = new QLabel; m_fileValue = new QLabel;
m_fileValue->setMaximumWidth(200); m_fileValue->setMaximumWidth(100);
status->addWidget(m_fileLabel, 1, 2); status->addWidget(m_fileValue, 0, 2);
status->addWidget(m_fileValue, 1, 3);
layout->addLayout(status); layout->addLayout(status);
QGridLayout *volumeBox = new QGridLayout; QGridLayout *volumeBox = new QGridLayout;
@ -126,26 +117,17 @@ AudioLayerWidget::~AudioLayerWidget()
// From UI. // From UI.
void AudioLayerWidget::volumeChanged(int value) void AudioLayerWidget::volumeChanged(int value)
{ {
(void)value; emit(uiSliderChanged(m_layer, Slider::Volume, value));
// ToDo: call the audio engine
} }
void AudioLayerWidget::panChanged(int value) void AudioLayerWidget::panChanged(int value)
{ {
(void)value; emit(uiSliderChanged(m_layer, Slider::Pan, value));
// ToDo: call the audio engine
} }
void AudioLayerWidget::pitchChanged(int value) void AudioLayerWidget::pitchChanged(int value)
{ {
(void)value; emit(uiSliderChanged(m_layer, Slider::Pitch, value));
// ToDo: call the audio engine
}
void AudioLayerWidget::loopChanged(int value)
{
(void)value;
// ToDo: call the audio engine
} }
void AudioLayerWidget::toggleSuspendResume() void AudioLayerWidget::toggleSuspendResume()

View file

@ -65,14 +65,13 @@ public slots:
void volumeChanged(int vol); void volumeChanged(int vol);
void panChanged(int vol); void panChanged(int vol);
void pitchChanged(int vol); void pitchChanged(int vol);
void loopChanged(int vol);
void fileLoaded(QString file); void fileLoaded(QString file);
void durationChanged(qint64 dur); void durationChanged(qint64 dur);
void refreshUi(float progress); void refreshUi(float progress);
signals: signals:
void uiPlaybackChanged(int layer, Status s); void uiPlaybackChanged(int layer, Status s);
void uiSliderChanged(int layer, Slider s, Status status); void uiSliderChanged(int layer, Slider s, int value);
}; };

View file

@ -8,7 +8,7 @@ AudioWidget::AudioWidget() :
for (int i= 0; i < Settings::getInstance()->getLayersNumber(); i++ ) { for (int i= 0; i < Settings::getInstance()->getLayersNumber(); i++ ) {
AudioLayerWidget *alw = new AudioLayerWidget(this, tr("Layer %1").arg(i + 1), i); AudioLayerWidget *alw = new AudioLayerWidget(this, tr("Layer %1").arg(i + 1), i);
m_layout->insertWidget(i, alw); m_layout->insertWidget(i, alw);
connect(alw, SIGNAL(uiSliderAction(int, Slider, qreal)), this, SLOT(uiSliderAction(int, Status))); 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)));
} }
setLayout(m_layout); setLayout(m_layout);
@ -92,20 +92,22 @@ void AudioWidget::refreshUi() {
} }
} }
void AudioWidget::uiSliderAction(int layer, Slider s, qreal value) void AudioWidget::uiSliderAction(int layer, Slider s, int value)
{ {
switch (s){ switch (s){
case Slider::Volume: case Slider::Volume:
this->volChanged(layer, value); m_mae.volChanged(layer, value);
break;
case Slider::Pan: case Slider::Pan:
this->panChanged(layer, value); m_mae.panChanged(layer, value);
break;
case Slider::Pitch: case Slider::Pitch:
this->pitchChanged(layer, value); m_mae.pitchChanged(layer, value);
break;
} }
} }
void AudioWidget::uiChangePlaybackStatus(int layer, Status s) { void AudioWidget::uiChangePlaybackStatus(int layer, Status s) {
qDebug("changing playback %i %i", layer, s);
m_mae.playbackChanged(layer, s); m_mae.playbackChanged(layer, s);
} }

View file

@ -3,7 +3,6 @@
#include <QObject> #include <QObject>
#include <QWidget> #include <QWidget>
#include <QVBoxLayout>
#include <QDialog> #include <QDialog>
#include "audiomasterwidget.h" #include "audiomasterwidget.h"
@ -40,7 +39,7 @@ private:
QTimer *m_refreshUi; QTimer *m_refreshUi;
public slots: public slots:
void uiSliderAction(int layer, Slider s, qreal value); void uiSliderAction(int layer, Slider s, int value);
void uiChangePlaybackStatus(int layer, Status s); void uiChangePlaybackStatus(int layer, Status s);
private slots: private slots:

View file

@ -15,14 +15,11 @@
#define STOP_LABEL "Stop" #define STOP_LABEL "Stop"
#define PAUSE_LABEL "Pause" #define PAUSE_LABEL "Pause"
#define IDDLE_LABEL "Iddle playback" #define IDDLE_LABEL "Iddle playback"
#define VOLUME_LABEL "Volume" #define VOLUME_LABEL "Vol"
#define PROGRESS_LABEL "Progress" #define PROGRESS_LABEL "Progress"
#define PROGRESS_TIME_LABEL "Current" #define PROGRESS_TIME_LABEL "Current"
#define REMAINING_TIME "Remaining" #define REMAINING_TIME "Remaining"
#define TOTAL_TIME_LABEL "Total" #define TOTAL_TIME_LABEL "Total"
#define FILE_LABEL "File: "
#define FOLDER_LABEL "Folder: "
#define STATUS_LABEL "Status: "
#define NOTIFY_INTERVAL 150 #define NOTIFY_INTERVAL 150
#define PULL_TIMER_INTERVAL 10 #define PULL_TIMER_INTERVAL 10
#define MAX_DEVICES 16 #define MAX_DEVICES 16

View file

@ -66,7 +66,7 @@ libreMediaServerAudio::libreMediaServerAudio(QStringList args, QWidget *parent)
topWidget->setWidget(amw); topWidget->setWidget(amw);
addDockWidget(Qt::TopDockWidgetArea, topWidget); addDockWidget(Qt::TopDockWidgetArea, topWidget);
// ola setup // ola setup
ola = new olaThread(); ola = new olaThread(this, set->getLayersNumber());
Q_CHECK_PTR(ola); Q_CHECK_PTR(ola);
ola->blockSignals(true); ola->blockSignals(true);
connect(set, SIGNAL(registerUniverse(int)), ola, SLOT(registerUniverse(int))); connect(set, SIGNAL(registerUniverse(int)), ola, SLOT(registerUniverse(int)));
@ -82,6 +82,7 @@ libreMediaServerAudio::libreMediaServerAudio(QStringList args, QWidget *parent)
aw->startEngine(); aw->startEngine();
qDebug("Init Complete."); qDebug("Init Complete.");
ola->blockSignals(false); ola->blockSignals(false);
ola->resendDmx();
} }
/////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////

View file

@ -7,7 +7,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>199</width> <width>114</width>
<height>218</height> <height>218</height>
</rect> </rect>
</property> </property>
@ -20,7 +20,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>199</width> <width>114</width>
<height>22</height> <height>22</height>
</rect> </rect>
</property> </property>
@ -33,7 +33,13 @@
<addaction name="action_Settings"/> <addaction name="action_Settings"/>
<addaction name="actionLaunch_OLA_Setup"/> <addaction name="actionLaunch_OLA_Setup"/>
</widget> </widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
</widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
<addaction name="menuHelp"/>
</widget> </widget>
<action name="actionExit"> <action name="actionExit">
<property name="text"> <property name="text">

View file

@ -1,10 +1,11 @@
#include "olathread.h" #include "olathread.h"
olaThread::olaThread(QObject *parent) olaThread::olaThread(QObject *parent, int layers) :
m_counter(0)
, m_layers(layers)
{ {
Q_UNUSED(parent); Q_UNUSED(parent);
m_counter = 0;
gettimeofday(&m_last_data, NULL); gettimeofday(&m_last_data, NULL);
for (int i=0; i < MAX_LAYERS; i++) for (int i=0; i < MAX_LAYERS; i++)
{ {
@ -41,7 +42,6 @@ void olaThread::init()
void olaThread::run() void olaThread::run()
{ {
emit toTerminal("Start reading DMX");
m_clientWrapper->GetSelectServer()->Run(); m_clientWrapper->GetSelectServer()->Run();
} }
@ -64,15 +64,13 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data,
{ {
m_counter++; m_counter++;
gettimeofday(&m_last_data, NULL); gettimeofday(&m_last_data, NULL);
uint universe = data.universe; foreach (const dmxSetting &i, Settings::getInstance()->getDmxSettings()) {
emit layerReceived(); if(i.universe == data.universe && i.address > -1) {
foreach (const dmxSetting &i, Settings::getInstance()->getDmxSettings()) { // loop for reading the channels by layer. for (int j = 0; j < LAYER_CHANNELS; j++){
if(i.universe == universe && i.address > -1) { // Compare if the layer is from this universe AND if the DMX address is 0 or greater, process this layer. int value = buffer.Get((i.address) + j);
for (int j = 0; j < MAX_LAYERS; j++){ if (m_dmx[i.layer][j] != value) {
int value = buffer.Get((i.address) + j); // Get the value for this channel.
if (m_dmx[i.layer][j] != value) { // Compare the new value with the old value.
emit dmxOutput(i.layer,j,value);
m_dmx[i.layer][j] = value; m_dmx[i.layer][j] = value;
emit dmxOutput(i.layer,j,value);
} }
} }
} }
@ -82,17 +80,13 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data,
/** /**
* Check for data loss each 4 seconds. * Check for data loss each 4 seconds.
*/ */
bool olaThread::CheckDataLoss() { bool olaThread::CheckDataLoss() {
struct timeval now, diff; struct timeval now, diff;
if (timerisset(&m_last_data)) { if (timerisset(&m_last_data)) {
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
timersub(&now, &m_last_data, &diff); timersub(&now, &m_last_data, &diff);
if (diff.tv_sec > 4 || (diff.tv_sec == 4 && diff.tv_usec > 4000000)) { if (diff.tv_sec > 4 || (diff.tv_sec == 4 && diff.tv_usec > 4000000)) {
// loss of data qInfo()<< "olaThread| Can not read one or several universes";
qDebug()<< "olaThread| Can not read one or several universes";
emit toTerminal("olaThread: Can not read one universe");
// return false; // Retorna false para deshabilitar el callback
} }
} }
return true; return true;
@ -100,8 +94,7 @@ bool olaThread::CheckDataLoss() {
void olaThread::resendDmx() void olaThread::resendDmx()
{ {
// qDebug() << "Resending DMX info"; for (int i = 0; i < m_layers; i++) {
for (int i = 0; i < MAX_LAYERS; i++) { // loop for reading the channels by layer.
for (int j = 0; j < LAYER_CHANNELS; j++){ for (int j = 0; j < LAYER_CHANNELS; j++){
emit dmxOutput(i, j, m_dmx[i][j]); emit dmxOutput(i, j, m_dmx[i][j]);
} }
@ -110,19 +103,11 @@ void olaThread::resendDmx()
void olaThread::socketClosed() void olaThread::socketClosed()
{ {
qWarning("ola close the connection. Trying reopening it... "); qWarning("ola closed connection. Try reopening it... ");
emit toTerminal("OLA closed the connection. Tryin reopening it... ");
m_clientWrapper->GetSelectServer()->Terminate(); m_clientWrapper->GetSelectServer()->Terminate();
m_client = NULL; m_client = NULL;
m_clientWrapper = NULL; m_clientWrapper = NULL;
// setup ola connection
init(); init();
// register universes
registerUniverse(); registerUniverse();
// start thread
run(); run();
} }

View file

@ -5,7 +5,6 @@
#include <QObject> #include <QObject>
#include <QThread> #include <QThread>
#include <QDebug>
#include <ola/DmxBuffer.h> #include <ola/DmxBuffer.h>
#include <ola/Logging.h> #include <ola/Logging.h>
@ -25,7 +24,7 @@ class olaThread : public QThread
public: public:
olaThread(QObject *parent = 0); olaThread(QObject *parent = 0, int layers = 0);
virtual ~olaThread(); virtual ~olaThread();
/** Retorna el valor de un canal /** Retorna el valor de un canal
@ -37,9 +36,6 @@ public:
return m_dmx[layer][channel]; return m_dmx[layer][channel];
} }
/**
* @brief resendDMX emite todo el buffer DMX
*/
void resendDmx(); void resendDmx();
private: private:
@ -49,78 +45,49 @@ private:
ola::client::OlaClient *m_client; ola::client::OlaClient *m_client;
unsigned int m_counter; unsigned int m_counter;
struct timeval m_last_data; // Last DMX frame received struct timeval m_last_data; // Last DMX frame received
int m_layers;
int m_dmx[MAX_LAYERS][LAYER_CHANNELS]; // DMX Buffer. Habría que cambiarlo si queremos hacer las capas dinámicas int m_dmx[MAX_LAYERS][LAYER_CHANNELS];
/** /**
* @brief Callback from ola. Control de errores en el registro de Universos en OLA * @brief Callback from ola. Control de errores en el registro de Universos en OLA
* typedef SingleUseCallback1<void, const Result&> ola::client::SetCallback * typedef SingleUseCallback1<void, const Result&> ola::client::SetCallback
* @param ola::client::Result &error * @param ola::client::Result &error
* @return void * @return void
*
*
*/ */
inline void RegisterComplete(const ola::client::Result &error) { inline void RegisterComplete(const ola::client::Result &error) {
if (error.Success()) { if (error.Success()) {
qDebug("Register Universe success"); qDebug("Register Universe success");
emit toTerminal("Register Universe success");
} else { } else {
qWarning("Register command failed: %s", error.Error().c_str()); qWarning("Register command failed: %s", error.Error().c_str());
emit toTerminal("olaThread| Register command failed " + QString::fromStdString(error.Error()));
} }
} }
/** /**
* @brief Check if the dmx info is arriving each 4 seconds * @brief Check if the dmx info is arriving each 4 seconds
* @return bool * @return bool
*/ */
bool CheckDataLoss(); bool CheckDataLoss();
/** /**
* @brief RepeteableDMXCallBack from ola called when arrives a new dmx frame * @brief RepeteableDMXCallBack from ola called when arrives a new dmx frame
* typedef Callback2<void, const DMXMetadata&, const DmxBuffer&> ola::client::RepeatableDMXCallback * typedef Callback2<void, const DMXMetadata&, const DmxBuffer&> ola::client::RepeatableDMXCallback
* This is called one for second if there is not updated in the DMX frame. We need emit only the channels that * This is called one for second if there is not updated in the DMX frame.
* has changed to save resources. * emit only the channels that has been changed.
*
*
*/ */
void NewDmx(const ola::client::DMXMetadata &dmx_meta, const ola::DmxBuffer &buffer); // void NewDmx(const ola::client::DMXMetadata &dmx_meta, const ola::DmxBuffer &buffer); //
/** /**
* @brief Sometimes the ola server closes the connection. This is a callback to handle this event an reconect to ola * @brief Sometimes the ola server closes the connection. This is a callback to handle this event an reconect to ola
*
*
*/ */
void socketClosed(); void socketClosed();
void init();
/**
* @brief Open the connection with olad and start processing data.
*
*
*/
void init();
public slots: public slots:
void stop();
void stop(); // Close the connection with olad.
/**
* @brief register one Universe
* void ola::client::OlaClient::RegisterUniverse(unsigned int universe,RegisterAction register_action,SetCallback * callback
* @param universe
*/
inline void registerUniverse(int universe) { inline void registerUniverse(int universe) {
qDebug("Registering universe %d", universe); qInfo("Registering universe %d", universe);
m_client->RegisterUniverse(universe, m_client->RegisterUniverse(universe,
ola::client::REGISTER, ola::client::REGISTER,
ola::NewSingleCallback ola::NewSingleCallback
(this, &olaThread::RegisterComplete)); (this, &olaThread::RegisterComplete));
} }
/**
* @brief Register all the universes again
*
*/
inline void registerUniverse() { inline void registerUniverse() {
QSet<int> unis = Settings::getInstance()->getUniverses(); QSet<int> unis = Settings::getInstance()->getUniverses();
foreach (const int &universe, unis) { foreach (const int &universe, unis) {
@ -128,15 +95,8 @@ public slots:
} }
} }
protected slots:
signals: signals:
void dmxOutput(int layer, int channel, int value);
// void finished(); // Signal for closing. Not used now.
void dmxOutput(int layer, int channel, int value); // Signal when a channel has changed
void toTerminal(QString message);
void universeReceived(uint universe);
void layerReceived();
}; };
using namespace ola; using namespace ola;

View file

@ -73,27 +73,22 @@ void Settings::readFromFile(QString file) {
m_settings.append(temp); m_settings.append(temp);
if (!m_universe.contains(temp.universe)) { if (!m_universe.contains(temp.universe)) {
m_universe.insert(temp.universe); m_universe.insert(temp.universe);
// emit registerUniverse(temp.universe);
} }
counter++; counter++;
} }
} }
} }
if(xmlReader->hasError()) { if(xmlReader->hasError()) {
QMessageBox::critical(NULL,"File xml Parse Error ", xmlReader->errorString(), QMessageBox::Ok); QMessageBox::critical(NULL,"File xml Parse Error ", xmlReader->errorString(), QMessageBox::Ok);
qWarning("File xml Parse Error %s", xmlReader->errorString().toLatin1().constData()); qWarning("File xml Parse Error %s", xmlReader->errorString().toLatin1().constData());
return; return;
} }
//close reader and flush file
xmlReader->clear(); xmlReader->clear();
xmlFile->close(); xmlFile->close();
delete xmlReader; delete xmlReader;
delete xmlFile; delete xmlFile;
} }
/** Read the default file /** Read the default file
* *
*/ */
@ -110,7 +105,6 @@ void Settings::changeLayerSetup(int layer, int universe, int address)
m_settings.replace(layer, temp); m_settings.replace(layer, temp);
if (!m_universe.contains(temp.universe)) { if (!m_universe.contains(temp.universe)) {
m_universe.insert(temp.universe); m_universe.insert(temp.universe);
// emit registerUniverse(temp.universe);
} }
} }