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->setObjectName("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->setButtonSymbols(QAbstractSpinBox::NoButtons);
m_totalTimeValue->setMinimumWidth(80);

View file

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

View file

@ -35,25 +35,26 @@ class libreMediaServerAudio : public QObject
public:
libreMediaServerAudio(bool gui = false);
virtual ~libreMediaServerAudio();
olaThread *m_ola;
void dmxInput(int layer, int channel, int value);
#ifndef NOGUI
void setUi(libreMediaServerAudioUi *lmsUi);
#endif
//static void NewDmx(const ola::client::DMXMetadata &data, const ola::DmxBuffer &buffer);
private:
olaThread *m_ola;
MediaLibrary *m_mediaLibrary;
MiniAudioEngine m_mae;
QString m_currentMedia[MAX_LAYERS];
Status m_currentStatus[MAX_LAYERS];
static QList<dmxSetting> m_dmxSettings;
#ifndef NOGUI
bool m_ui;
QTimer *m_refreshUi;
libreMediaServerAudioUi *m_lmsUi;
float m_updateUi[MAX_LAYERS][3];
float m_updateUi[MAX_LAYERS][4];
#endif
private slots:
void dmxInput(int layer, int channel, int value);
#ifndef NOGUI
void refreshUi();
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 result;
float vol = -1;
if (m_mediaLoaded[layer] == true)
{
vol = ma_sound_get_volume(&m_currentSound[layer]);
ma_sound_uninit(&m_currentSound[layer]);
m_mediaLoaded[layer] = false;
}
@ -131,7 +133,10 @@ ma_result MiniAudioEngine::loadMedia(int layer, char *file)
qWarning("Failed to load file %s", file);
else {
m_mediaLoaded[layer] = true;
this->volChanged(layer, 0);
if (vol == -1)
this->volChanged(layer, 0);
else
this->volChanged(layer, vol);
}
return result;
}

View file

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

View file

@ -20,10 +20,17 @@ class olaThread : public QThread
Q_OBJECT
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);
virtual ~olaThread();
void run ();
/** Retorna el valor de un canal
*@param int layer the layer for we want the channel
*@param int channel the channel for the value wanted
@ -35,14 +42,6 @@ public:
void resendDmx();
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
* 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.
* 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
*/