cambida señal dmx por llamada directa al método, reduce un 20% de cpu en

mi ordenador.
Restringida actualización de entry point como volumen, sigue cascando la
búsqueda en mp3, wav va fino.
This commit is contained in:
snt 2024-05-05 21:44:21 +02:00
parent d34b972a54
commit 5915d4898e
6 changed files with 45 additions and 37 deletions

View file

@ -58,7 +58,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer):
m_totalTimeValue = new QTimeEdit; m_totalTimeValue = new QTimeEdit;
m_totalTimeValue->setObjectName("Track Length"); m_totalTimeValue->setObjectName("Track Length");
m_totalTimeValue->setToolTip("Track Length"); m_totalTimeValue->setToolTip("Track Length");
m_totalTimeValue->setDisplayFormat("mm:ss:zz"); m_totalTimeValue->setDisplayFormat("mm:ss:zzz");
m_totalTimeValue->setReadOnly(true); m_totalTimeValue->setReadOnly(true);
m_totalTimeValue->setButtonSymbols(QAbstractSpinBox::NoButtons); m_totalTimeValue->setButtonSymbols(QAbstractSpinBox::NoButtons);
m_totalTimeValue->setMinimumWidth(80); m_totalTimeValue->setMinimumWidth(80);

View file

@ -29,10 +29,14 @@ libreMediaServerAudio::libreMediaServerAudio(bool gui)
m_mediaLibrary = new MediaLibrary; m_mediaLibrary = new MediaLibrary;
m_mediaLibrary->initMediaLibrary(); m_mediaLibrary->initMediaLibrary();
for (int i = 0; i < MAX_LAYERS; i++) { for (int i = 0; i < MAX_LAYERS; i++) {
m_currentMedia[i] = Status::Iddle; m_currentMedia[i] = "";
m_currentStatus[i] = Status::Iddle;
#ifdef NOGUI
m_updateUi[i][0] = -1; m_updateUi[i][0] = -1;
m_updateUi[i][1] = -1; m_updateUi[i][1] = -1;
m_updateUi[i][2] = -1; m_updateUi[i][2] = -1;
m_updateUi[i][3] = -1;
#endif
} }
m_ola = new olaThread(this, set->getLayersNumber()); m_ola = new olaThread(this, set->getLayersNumber());
Q_CHECK_PTR(m_ola); Q_CHECK_PTR(m_ola);
@ -42,7 +46,9 @@ libreMediaServerAudio::libreMediaServerAudio(bool gui)
m_mae.startEngine(set->getAudioDeviceId()); m_mae.startEngine(set->getAudioDeviceId());
qDebug("Core init Complete. Start reading DMX."); qDebug("Core init Complete. Start reading DMX.");
m_ola->blockSignals(false); m_ola->blockSignals(false);
#ifdef NOGUI
m_ola->start(QThread::TimeCriticalPriority ); m_ola->start(QThread::TimeCriticalPriority );
#endif
} }
libreMediaServerAudio::~libreMediaServerAudio() libreMediaServerAudio::~libreMediaServerAudio()
@ -71,7 +77,6 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer)); m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer));
#endif #endif
} }
return;
} else if (channel == VOLUME_COARSE || channel == VOLUME_FINE) { } else if (channel == VOLUME_COARSE || channel == VOLUME_FINE) {
float tmp = value / 65025.0f; float tmp = value / 65025.0f;
m_mae.volChanged(layer, tmp); m_mae.volChanged(layer, tmp);
@ -84,10 +89,7 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
m_updateUi[layer][2] = value; m_updateUi[layer][2] = value;
} else if (channel == ENTRY_POINT_COARSE || channel == ENTRY_POINT_FINE) { } else if (channel == ENTRY_POINT_COARSE || channel == ENTRY_POINT_FINE) {
m_mae.setCursor(layer, value); m_mae.setCursor(layer, value);
#ifndef NOGUI m_updateUi[layer][3] = value;
m_lmsUi->m_aw->cursorChanged(layer, m_mae.getCursor(layer));
#endif
return;
} else if (channel == PLAYBACK && value > 0) { } else if (channel == PLAYBACK && value > 0) {
aux = value / 25; aux = value / 25;
Status s = m_currentStatus[layer]; Status s = m_currentStatus[layer];
@ -111,10 +113,6 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
void libreMediaServerAudio::refreshUi() { void libreMediaServerAudio::refreshUi() {
if (!m_ui) return; if (!m_ui) return;
for (int i= 0; i < Settings::getInstance()->getLayersNumber(); i++ ) { for (int i= 0; i < Settings::getInstance()->getLayersNumber(); i++ ) {
Status s = m_currentStatus[i];
if (s == Status::PlayingOnce || s == Status::PlayingLoop) {
m_lmsUi->m_aw->cursorChanged(i, m_mae.getCursor(i));
}
if (m_updateUi[i][0] >= 0) { if (m_updateUi[i][0] >= 0) {
m_lmsUi->m_aw->volChanged(i, m_updateUi[i][0]); m_lmsUi->m_aw->volChanged(i, m_updateUi[i][0]);
m_updateUi[i][0] = -1; m_updateUi[i][0] = -1;
@ -127,7 +125,10 @@ void libreMediaServerAudio::refreshUi() {
m_lmsUi->m_aw->pitchChanged(i, m_updateUi[i][2]); m_lmsUi->m_aw->pitchChanged(i, m_updateUi[i][2]);
m_updateUi[i][2] = -1; m_updateUi[i][2] = -1;
} }
//m_lmsUi->m_aw->playbackChanged(i, m_currentStatus[i]); if (m_updateUi[i][3] >= 0) {
m_lmsUi->m_aw->cursorChanged(i, m_mae.getCursor(i));
m_updateUi[i][3] = -1;
}
} }
} }
@ -141,6 +142,7 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
m_refreshUi = new QTimer(this); m_refreshUi = new QTimer(this);
connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi()));
m_refreshUi->start(UI_REFRESH_TIME); m_refreshUi->start(UI_REFRESH_TIME);
m_ola->start(QThread::TimeCriticalPriority );
}; };
void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value)

View file

@ -35,25 +35,26 @@ class libreMediaServerAudio : public QObject
public: public:
libreMediaServerAudio(bool gui = false); libreMediaServerAudio(bool gui = false);
virtual ~libreMediaServerAudio(); virtual ~libreMediaServerAudio();
olaThread *m_ola; void dmxInput(int layer, int channel, int value);
#ifndef NOGUI #ifndef NOGUI
void setUi(libreMediaServerAudioUi *lmsUi); void setUi(libreMediaServerAudioUi *lmsUi);
#endif #endif
//static void NewDmx(const ola::client::DMXMetadata &data, const ola::DmxBuffer &buffer);
private: private:
olaThread *m_ola;
MediaLibrary *m_mediaLibrary; MediaLibrary *m_mediaLibrary;
MiniAudioEngine m_mae; MiniAudioEngine m_mae;
QString m_currentMedia[MAX_LAYERS]; QString m_currentMedia[MAX_LAYERS];
Status m_currentStatus[MAX_LAYERS]; Status m_currentStatus[MAX_LAYERS];
static QList<dmxSetting> m_dmxSettings;
#ifndef NOGUI #ifndef NOGUI
bool m_ui; bool m_ui;
QTimer *m_refreshUi; QTimer *m_refreshUi;
libreMediaServerAudioUi *m_lmsUi; libreMediaServerAudioUi *m_lmsUi;
float m_updateUi[MAX_LAYERS][3]; float m_updateUi[MAX_LAYERS][4];
#endif #endif
private slots: private slots:
void dmxInput(int layer, int channel, int value);
#ifndef NOGUI #ifndef NOGUI
void refreshUi(); void refreshUi();
void uiSliderChanged(int layer, Slider s, int value); void uiSliderChanged(int layer, Slider s, int value);

View file

@ -114,9 +114,11 @@ ma_result MiniAudioEngine::getAllAudioDevices()
ma_result MiniAudioEngine::loadMedia(int layer, char *file) ma_result MiniAudioEngine::loadMedia(int layer, char *file)
{ {
ma_result result; ma_result result;
float vol = -1;
if (m_mediaLoaded[layer] == true) if (m_mediaLoaded[layer] == true)
{ {
vol = ma_sound_get_volume(&m_currentSound[layer]);
ma_sound_uninit(&m_currentSound[layer]); ma_sound_uninit(&m_currentSound[layer]);
m_mediaLoaded[layer] = false; m_mediaLoaded[layer] = false;
} }
@ -131,7 +133,10 @@ ma_result MiniAudioEngine::loadMedia(int layer, char *file)
qWarning("Failed to load file %s", file); qWarning("Failed to load file %s", file);
else { else {
m_mediaLoaded[layer] = true; m_mediaLoaded[layer] = true;
this->volChanged(layer, 0); if (vol == -1)
this->volChanged(layer, 0);
else
this->volChanged(layer, vol);
} }
return result; return result;
} }

View file

@ -1,11 +1,11 @@
#include "olathread.h" #include "libremediaserver-audio.h"
//#include "olathread.h"
olaThread::olaThread(QObject *parent, int layers) : olaThread::olaThread(QObject *parent, int layers) :
m_counter(0) m_counter(0)
, m_layers(layers) , m_layers(layers)
{ {
Q_UNUSED(parent); this->setParent(parent);
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++)
{ {
@ -36,6 +36,7 @@ void olaThread::init()
} }
m_client = m_clientWrapper->GetClient(); m_client = m_clientWrapper->GetClient();
m_client->SetDMXCallback(ola::NewCallback(this, &olaThread::NewDmx)); m_client->SetDMXCallback(ola::NewCallback(this, &olaThread::NewDmx));
//m_client->SetDMXCallback(ola::NewCallback((libreMediaServerAudio *)this->parent(), libreMediaServerAudio::NewDmx));
m_clientWrapper->GetSelectServer()->RegisterRepeatingTimeout(4000, ola::NewCallback(this, &olaThread::CheckDataLoss)); m_clientWrapper->GetSelectServer()->RegisterRepeatingTimeout(4000, ola::NewCallback(this, &olaThread::CheckDataLoss));
m_client->SetCloseHandler(ola::NewSingleCallback(this, &olaThread::socketClosed)); m_client->SetCloseHandler(ola::NewSingleCallback(this, &olaThread::socketClosed));
m_dmxSettings = Settings::getInstance()->getDmxSettings(); m_dmxSettings = Settings::getInstance()->getDmxSettings();
@ -76,7 +77,7 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data,
case DMX_FOLDER: case DMX_FOLDER:
value *= 0x100; value *= 0x100;
value += buffer.Get(i.address + DMX_FILE); value += buffer.Get(i.address + DMX_FILE);
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
m_dmx[i.layer][DMX_FILE] = buffer.Get(i.address + DMX_FILE); m_dmx[i.layer][DMX_FILE] = buffer.Get(i.address + DMX_FILE);
fileSent = true; fileSent = true;
break; break;
@ -84,13 +85,13 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data,
if (fileSent) if (fileSent)
break; break;
value += buffer.Get(i.address + DMX_FOLDER) * 0x100; value += buffer.Get(i.address + DMX_FOLDER) * 0x100;
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
m_dmx[i.layer][DMX_FOLDER] = buffer.Get(i.address + DMX_FOLDER); m_dmx[i.layer][DMX_FOLDER] = buffer.Get(i.address + DMX_FOLDER);
fileSent = true; fileSent = true;
break; break;
case VOLUME_FINE: case VOLUME_FINE:
value = (buffer.Get(i.address + VOLUME_COARSE) * 0x100) + value; value = (buffer.Get(i.address + VOLUME_COARSE) * 0x100) + value;
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
m_dmx[i.layer][VOLUME_COARSE] = buffer.Get(i.address + VOLUME_COARSE); m_dmx[i.layer][VOLUME_COARSE] = buffer.Get(i.address + VOLUME_COARSE);
volSent = true; volSent = true;
break; break;
@ -98,13 +99,13 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data,
if (volSent) if (volSent)
break; break;
value = (value * 0x100) + buffer.Get(i.address + VOLUME_FINE); value = (value * 0x100) + buffer.Get(i.address + VOLUME_FINE);
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
m_dmx[i.layer][VOLUME_FINE] = buffer.Get(i.address + VOLUME_FINE); m_dmx[i.layer][VOLUME_FINE] = buffer.Get(i.address + VOLUME_FINE);
volSent = true; volSent = true;
break; break;
case ENTRY_POINT_FINE: case ENTRY_POINT_FINE:
value = (buffer.Get(i.address + ENTRY_POINT_COARSE) * 0x100) + value; value = (buffer.Get(i.address + ENTRY_POINT_COARSE) * 0x100) + value;
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
m_dmx[i.layer][ENTRY_POINT_COARSE] = buffer.Get(i.address + ENTRY_POINT_COARSE); m_dmx[i.layer][ENTRY_POINT_COARSE] = buffer.Get(i.address + ENTRY_POINT_COARSE);
entrySent = true; entrySent = true;
break; break;
@ -112,12 +113,12 @@ void olaThread::NewDmx(const ola::client::DMXMetadata &data,
if (entrySent) if (entrySent)
break; break;
value = (value * 0x100) + buffer.Get(i.address + ENTRY_POINT_FINE); value = (value * 0x100) + buffer.Get(i.address + ENTRY_POINT_FINE);
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
m_dmx[i.layer][ENTRY_POINT_FINE] = buffer.Get(i.address + ENTRY_POINT_FINE); m_dmx[i.layer][ENTRY_POINT_FINE] = buffer.Get(i.address + ENTRY_POINT_FINE);
entrySent = true; entrySent = true;
break; break;
default: default:
emit dmxOutput(i.layer,j,value); qobject_cast<libreMediaServerAudio *>(parent())->dmxInput(i.layer, j, value);
break; break;
} }
} }

View file

@ -20,10 +20,17 @@ class olaThread : public QThread
Q_OBJECT Q_OBJECT
public: public:
QList<dmxSetting> m_dmxSettings;
int m_dmx[MAX_LAYERS][LAYER_CHANNELS];
ola::client::OlaClientWrapper *m_clientWrapper;
ola::client::OlaClient *m_client;
unsigned int m_counter;
struct timeval m_last_data; // Last DMX frame received
int m_layers;
olaThread(QObject *parent = 0, int layers = 0); olaThread(QObject *parent = 0, int layers = 0);
virtual ~olaThread(); virtual ~olaThread();
void run ();
/** Retorna el valor de un canal /** Retorna el valor de un canal
*@param int layer the layer for we want the channel *@param int layer the layer for we want the channel
*@param int channel the channel for the value wanted *@param int channel the channel for the value wanted
@ -35,14 +42,6 @@ public:
void resendDmx(); void resendDmx();
private: private:
void run ();
ola::client::OlaClientWrapper *m_clientWrapper;
ola::client::OlaClient *m_client;
unsigned int m_counter;
struct timeval m_last_data; // Last DMX frame received
int m_layers;
int m_dmx[MAX_LAYERS][LAYER_CHANNELS];
QList<dmxSetting> m_dmxSettings;
/** /**
* @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
@ -67,7 +66,7 @@ private:
* This is called one for second if there is not updated in the DMX frame. * This is called one for second if there is not updated in the DMX frame.
* emit only the channels that has been changed. * 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
*/ */