diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index 563eeb9..02da882 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -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); diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 5eb65aa..589c190 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -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) diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 5e956ac..665f3e2 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -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 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); diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 59345e9..f65744d 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -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; } diff --git a/src/olathread.cpp b/src/olathread.cpp index 471775c..409cf79 100644 --- a/src/olathread.cpp +++ b/src/olathread.cpp @@ -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(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(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(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(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(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(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(parent())->dmxInput(i.layer, j, value); break; } } diff --git a/src/olathread.h b/src/olathread.h index dcae35b..ed2735a 100644 --- a/src/olathread.h +++ b/src/olathread.h @@ -20,10 +20,17 @@ class olaThread : public QThread Q_OBJECT public: + QList 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 m_dmxSettings; /** * @brief Callback from ola. Control de errores en el registro de Universos en OLA * typedef SingleUseCallback1 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 */