From b4988a130752b0b454558696e6797958e527e570 Mon Sep 17 00:00:00 2001 From: snt Date: Sun, 7 Jul 2024 18:05:37 +0200 Subject: [PATCH 1/2] fade out when stop or pause --- src/cuetrackwidget.h | 1 + src/defines.h | 3 ++- src/libremediaserver-audio.cpp | 10 +++++----- src/libremediaserver-audio.h | 2 +- src/miniaudioengine.cpp | 24 +++++++++++++++--------- src/miniaudioengine.h | 2 +- src/showplayer.cpp | 3 ++- src/showplayer.h | 2 +- 8 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h index 6e7bd8b..87cd221 100644 --- a/src/cuetrackwidget.h +++ b/src/cuetrackwidget.h @@ -38,6 +38,7 @@ private slots: signals: void cueFinished(int layer); void goAction(int layer); + void NewFunction(CueTrack *track); }; #endif // CUETRACKWIDGET_H diff --git a/src/defines.h b/src/defines.h index f6a083c..1844856 100644 --- a/src/defines.h +++ b/src/defines.h @@ -91,7 +91,8 @@ struct layerData { int bus1Vol; int bus2Vol; float level; - int fade; + int fadeIn; + int fadeOut; }; struct CueTrack { diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index a440561..d6a5b71 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -73,8 +73,8 @@ void libreMediaServerAudio::loadMedia(int layer, int folder, int file) m_mae.loadMedia(layer, mediaFile.toLatin1().data()); m_currentMedia[layer] = mediaFile; #ifndef NOGUI - if (m_ui) - m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer)); + if (m_ui) + m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer)); #endif m_mae.printFormatInfo(layer); } @@ -228,7 +228,7 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) connect(m_lmsUi->m_aw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_aw, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int))); - connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int))); + connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int, int))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); m_refreshUi = new QTimer(this); @@ -301,11 +301,11 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) } } -void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int ms) +void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut) { switch (s){ case Slider::Volume: - m_mae.volChanged(layer, value, ms); + m_mae.volChanged(layer, value, fadeIn, fadeOut); m_updateUi[layer][0] = value; break; } diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 65b5d11..d2f2ec6 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -66,7 +66,7 @@ private: private slots: void refreshUi(); void uiSliderChanged(int layer, Slider s, int value); - void uiSliderChangedFaded(int layer, Slider s, int value, int ms); + void uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut); void uiPlaybackChanged(int layer, Status s); void uiLoadMedia(int layer, QString s); diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 9ab9f63..d81b309 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -59,6 +59,8 @@ bool MiniAudioEngine::startEngine(uint layers, uint* audioDevicesId, uint audioD m_mae.currentStatus[i].vol = 0.0f; m_mae.currentStatus[i].cursor = 0; m_mae.currentStatus[i].updated = MA_FALSE; + m_mae.currentStatus[i].fadeIn = FADE_TIME; + m_mae.currentStatus[i].fadeOut = FADE_TIME; } result = this->startContext(); if (result != MA_SUCCESS) return false; @@ -435,14 +437,15 @@ ma_result MiniAudioEngine::printFormatInfo(int layer) // Expects between 0 and 65535 vol value void MiniAudioEngine::volChanged(int layer, int vol) { - volChanged(layer, vol, FADE_TIME); + volChanged(layer, vol, FADE_TIME, FADE_TIME); } // Expects between 0 and 65535 vol value and fade time in milliseconds -void MiniAudioEngine::volChanged(int layer, int vol, int ms) +void MiniAudioEngine::volChanged(int layer, int vol, int fadeIn, int fadeOut) { m_mae.currentStatus[layer].vol = vol; - m_mae.currentStatus[layer].fade = ms; + m_mae.currentStatus[layer].fadeIn = fadeIn; + m_mae.currentStatus[layer].fadeOut = fadeOut; if (m_mae.mediaLoaded[layer] != MA_TRUE) return; if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated) @@ -452,10 +455,9 @@ void MiniAudioEngine::volChanged(int layer, int vol, int ms) db = 0; } else db = ma_volume_db_to_linear(db); - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, ms); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, fadeIn); } - void MiniAudioEngine::panChanged(int layer, float value) { float result; @@ -483,18 +485,20 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) ma_result result = MA_SUCCESS; float db = 0; bool loop = false; + bool playAtBegin = false; + if (status == Status::Stopped) + playAtBegin = true; m_mae.currentStatus[layer].status = status; if (m_mae.mediaLoaded[layer] != MA_TRUE) return MA_DOES_NOT_EXIST; m_mae.currentStatus[layer].updated = false; switch (status) { case Status::Paused: - result = ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], FADE_TIME); + result = ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], m_mae.currentStatus[layer].fadeOut); break; case Status::Stopped: - ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], 0.0f); - result = this->seekToCursor(layer, m_mae.currentStatus[layer].cursor); + ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], m_mae.currentStatus[layer].fadeOut); break; case Status::PlayingLoop: loop = true; @@ -505,6 +509,8 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) case Status::PlayingFolder: case Status::PlayingFolderLoop: case Status::PlayingFolderRandom: + if (playAtBegin) + this->seekToCursor(layer, 0); ma_sound_set_looping(&m_mae.sounds[layer], loop); if (ma_sound_is_playing(&m_mae.sounds[layer])) break; ma_sound_set_stop_time_in_milliseconds(&m_mae.sounds[layer], ~(ma_uint64)0); @@ -515,7 +521,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0.000001f, 0.000000f, FADE_TIME); if (m_mae.currentStatus[layer].cursor > 0) usleep(FADE_TIME * 1500); // avoid glitch when seeking - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fade); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fadeIn); default: break; } diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 0a1bca8..c94587a 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -64,7 +64,7 @@ public: bool startEngine(uint layersQty, uint* audioDevicesID, uint audioDevicesQty); ma_result loadMedia(int layer, char *media); void volChanged(int layer, int vol); - void volChanged(int layer, int vol, int ms); + void volChanged(int layer, int vol, int fadeIn, int fadeOut); void panChanged(int layer, float pan); void pitchChanged(int layer, float pitch); ma_result playbackChanged(int layer, Status status); diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 2815dfb..4e95da2 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -20,6 +20,7 @@ ShowPlayer::ShowPlayer(QWidget *parent) : current[i] = nullptr; prevCue[i] = nullptr; } + ui->nextCue->setNextCue(); } ShowPlayer::~ShowPlayer() {} @@ -72,7 +73,7 @@ void ShowPlayer::fade(Slider s, int start, CueTrack *track) { } void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { - emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000); + emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000, track->fadeOut * 1000); if (prevCue[track->audioLayer] != nullptr) { if (prevCue[track->audioLayer]->pan != track->pan) fade(Slider::Pan, prevCue[track->audioLayer]->pan, track); diff --git a/src/showplayer.h b/src/showplayer.h index fcba462..724d96b 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -55,7 +55,7 @@ private slots: signals: void uiPlaybackChanged(int layer, Status s); void uiSliderChanged(int layer, Slider s, int vol); - void uiSliderChangedFaded(int layer, Slider s, int vol, int ms); + void uiSliderChangedFaded(int layer, Slider s, int vol, int fadeIn, int fadeOut); void uiLoadMedia(int layer, QString s); }; From 46b7624fb519b378b0add77ecce21ab2e7967e41 Mon Sep 17 00:00:00 2001 From: snt Date: Mon, 8 Jul 2024 20:23:25 +0200 Subject: [PATCH 2/2] fix playing folder modes in ui. read/write settings and cue list at start/exit.shortcuts. --- src/cuetracklistwidget.cpp | 45 ++++--- src/cuetracklistwidget.h | 1 - src/cuetrackwidget.cpp | 10 +- src/libremediaserver-audio.cpp | 237 ++++++++++++++++++++++++--------- src/libremediaserver-audio.h | 7 +- src/main.cpp | 5 +- src/settings.cpp | 17 ++- src/settings.h | 4 + src/showplayer.cpp | 14 +- src/showplayer.h | 2 + 10 files changed, 252 insertions(+), 90 deletions(-) diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp index 22f9062..0e2d6f6 100644 --- a/src/cuetracklistwidget.cpp +++ b/src/cuetracklistwidget.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "cuetracklistwidget.h" CueTrackListWidget::CueTrackListWidget(QWidget *parent) @@ -25,6 +26,19 @@ CueTrackListWidget::CueTrackListWidget(QWidget *parent) QObject::connect(shortcut_up, SIGNAL(activated()), this, SLOT(key_up())); QShortcut *shortcut_down = new QShortcut(QKeySequence("Down"), parent); QObject::connect(shortcut_down, SIGNAL(activated()), this, SLOT(key_down())); + QShortcut *shortcut_copy = new QShortcut(QKeySequence("Ctrl+C"), parent); + QObject::connect(shortcut_copy, SIGNAL(activated()), this, SLOT(copyCueTrack())); + QShortcut *shortcut_cut = new QShortcut(QKeySequence("Ctrl+X"), parent); + QObject::connect(shortcut_cut, SIGNAL(activated()), this, SLOT(cutCueTrack())); + QShortcut *shortcut_paste = new QShortcut(QKeySequence("Ctrl+V"), parent); + QObject::connect(shortcut_paste, SIGNAL(activated()), this, SLOT(pasteCueTrack())); + tableWidget->installEventFilter(this); + QShortcut *shortcut_delete = new QShortcut(QKeySequence("Delete"), parent); + QObject::connect(shortcut_delete, SIGNAL(activated()), this, SLOT(deleteCueTrack())); + QShortcut *shortcut_insert = new QShortcut(QKeySequence("Insert"), parent); + QObject::connect(shortcut_insert, SIGNAL(activated()), this, SLOT(createNewCueTrack())); + QShortcut *shortcut_edit = new QShortcut(QKeySequence("e"), parent); + QObject::connect(shortcut_edit, SIGNAL(activated()), this, SLOT(editCueTrack())); } void CueTrackListWidget::addCueTrack(CueTrack* cue) { @@ -95,18 +109,6 @@ void CueTrackListWidget::displayCueTrackInTable(CueTrack *cueTrack, int index) { tableWidget->setItem(index, 5, new QTableWidgetItem(statusStr)); tableWidget->setItem(index, 6, new QTableWidgetItem(*getFileName(cueTrack->filePath))); } -//ToDo: make shortcuts in showplayer instead -void CueTrackListWidget::keyPressEvent(QKeyEvent* event) { - if (event->key() == Qt::Key_Delete) { - deleteCueTrack(); - } - if (event->key() == Qt::Key_Insert) { - createNewCueTrack(); - } - if (event->key() == Qt::Key_Return) { - editCueTrack(); - } -} void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) { if (selectedIndex >= 0 && selectedIndex < tableWidget->rowCount()) { @@ -183,13 +185,18 @@ void CueTrackListWidget::editCueTrack() void CueTrackListWidget::deleteCueTrack() { - removeCueTrack(selectedIndex); - if (selectedIndex >= m_size) - { - selectedIndex = m_size - 1; - emit changeSelectedIndex(selectedIndex); - } - redrawCueTrackList(); + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, "Delete Cue Track", "Are you sure you want to delete this cue track?", + QMessageBox::Yes | QMessageBox::No); + if (reply == QMessageBox::Yes) { + removeCueTrack(selectedIndex); + if (selectedIndex >= m_size) + { + selectedIndex = m_size - 1; + emit changeSelectedIndex(selectedIndex); + } + redrawCueTrackList(); + } } void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst) diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index 518b4ef..321a36a 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -50,7 +50,6 @@ private slots: void key_up(); void key_down(); void displayCueTrackInTable(CueTrack *cueTrack, int index); - void keyPressEvent(QKeyEvent* event); void updateSelectedCueTrack(bool highlightRow); void cueTrackLoadDefaults(CueTrack * t); void copyCueTrack(CueTrack *src, CueTrack *dst); diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp index 609cf4d..4e26b0c 100644 --- a/src/cuetrackwidget.cpp +++ b/src/cuetrackwidget.cpp @@ -65,9 +65,13 @@ void CueTrackWidget::go() void CueTrackWidget::waitInSlot() { emit goAction(ui->audioLayer->intValue()); - tlFade.setDuration(ui->fade->value() * 1000); - tlFade.start(); - ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #00FF00; }"); + if (ui->fade->value() > 0) { + tlFade.setDuration(ui->fade->value() * 1000); + tlFade.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #00FF00; }"); + } else { + fadeSlot(); + } } void CueTrackWidget::fadeSlot() diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index d6a5b71..c2bd32b 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -27,9 +27,6 @@ libreMediaServerAudio::libreMediaServerAudio() m_settings->readFile(); m_ui = m_settings->getShowUi(); m_layersQty = m_settings->getLayersNumber(); - m_dmxSettings = m_settings->getDmxSettings(); - m_mediaLibrary = new MediaLibrary; - m_mediaLibrary->initMediaLibrary(); for (uint i = 0; i < m_layersQty; i++) { m_currentMedia[i] = ""; m_currentStatus[i] = Status::Iddle; @@ -44,21 +41,44 @@ libreMediaServerAudio::libreMediaServerAudio() cout << "Can not start Audio Engine!" << endl; exit(-1); } - m_ola = new olaThread(this, m_layersQty); - Q_CHECK_PTR(m_ola); - m_ola->blockSignals(true); - m_ola->registerUniverse(); + if (m_settings->getDmxActive()) { + m_dmxSettings = m_settings->getDmxSettings(); + m_mediaLibrary = new MediaLibrary; + m_mediaLibrary->initMediaLibrary(); + m_ola = new olaThread(this, m_layersQty); + Q_CHECK_PTR(m_ola); + m_ola->blockSignals(true); + m_ola->registerUniverse(); #ifdef NOGUI - m_ola->start(QThread::TimeCriticalPriority ); + m_ola->start(QThread::TimeCriticalPriority ); #endif - m_ola->blockSignals(false); + m_ola->blockSignals(false); + } else { + qDebug() << "DMX inactive"; + } + if (!m_settings->getShowPlayerActive()) + qDebug() << "ShowPlayer inactive"; cout << "Core init Complete." << endl; } libreMediaServerAudio::~libreMediaServerAudio() { - m_ola->stop(); + if (m_settings->getDmxActive()) + m_ola->stop(); m_mae.stopEngine(); + Settings::getInstance()->beginGroup("mainwindow"); + Settings::getInstance()->setValue("size", m_lmsUi->size()); + Settings::getInstance()->setValue("fullScreen", m_lmsUi->isFullScreen()); + Settings::getInstance()->setValue("geometry", m_lmsUi->saveGeometry()); + Settings::getInstance()->setValue("showPlayer", m_lmsUi->m_showPlayer->isVisible()); + Settings::getInstance()->setValue("showPlayerSize", m_lmsUi->m_showPlayer->size()); + Settings::getInstance()->setValue("showPlayerGeometry", m_lmsUi->m_showPlayer->saveGeometry()); + Settings::getInstance()->endGroup(); + m_settings->settingsSaver(); + if (m_settings->getShowPlayerActive()) + m_lmsUi->m_showPlayer->saveCueTrackList("lastshow.xml"); + delete m_lmsUi; + delete m_settings; sleep(1); cout << "bye!" << endl; exit(0); @@ -170,52 +190,113 @@ void libreMediaServerAudio::refreshUi() { } m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i)); if (m_mae.getAtEnd(i)) { - if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) { - m_currentStatus[i] = Status::Stopped; - m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); - m_lmsUi->m_showPlayer->cueTrackAtEnd(i); - } - if (m_currentStatus[i] == Status::PlayingFolder) { - uint last = 0; - if (!m_played.isEmpty()) - last = m_played.last() + 1; - int folder = m_ola->getValue(i, DMX_FOLDER); - if (last < m_mediaLibrary->getMediaFolderCount(folder)) { - this->loadMedia(i, folder, last); - m_mae.playbackChanged(i, Status::PlayingFolder); - } - else { - m_currentStatus[i] = Status::Stopped; - m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); - m_lmsUi->m_showPlayer->cueTrackAtEnd(i); - } - } - else if (m_currentStatus[i] == Status::PlayingFolderLoop) { - uint last = m_played.last(); - int folder = m_ola->getValue(i, DMX_FOLDER); - last++; - if (last >= m_mediaLibrary->getMediaFolderCount(folder)) { - this->loadMedia(i, folder, 0); - m_mae.playbackChanged(i, Status::PlayingFolderLoop); - } else { - this->loadMedia(i, folder, last); - m_mae.playbackChanged(i, Status::PlayingFolder); - } - } - else if (m_currentStatus[i] == Status::PlayingFolderRandom) { - int last = -1; - int folder = m_ola->getValue(i, DMX_FOLDER); - if (uint(abs(m_played.size())) >= m_mediaLibrary->getMediaFolderCount(folder)) - m_played.clear(); - while (last == -1) { - last = rand() % m_mediaLibrary->getMediaFolderCount(folder); - if (m_played.contains(last)) - last = -1; - } - this->loadMedia(i, folder, last); - m_mae.playbackChanged(i, Status::PlayingFolderRandom); - } + if (m_settings->getDmxActive()) + endMediaDMX(i); + else + endMediaUi(i); + } + } +} + +int libreMediaServerAudio::getFileIndexInFolder(const QString& currentFilePath) { + QDir directory = QFileInfo(currentFilePath).absoluteDir(); + QStringList filters; + filters << "*.mp3" << "*.wav" << "*.flac"; + QStringList fileList = directory.entryList(filters, QDir::Files, QDir::Name); + m_folderSize = fileList.size(); + return fileList.indexOf(QFileInfo(currentFilePath).fileName()); +} + +QString libreMediaServerAudio::getNextFile(const QString& currentFilePath, bool loop, bool random) { + QDir directory = QFileInfo(currentFilePath).absoluteDir(); + QStringList filters; + filters << "*.mp3" << "*.wav" << "*.flac"; + QStringList fileList = directory.entryList(filters, QDir::Files, QDir::Name); + m_folderSize = fileList.size(); + int currentIndex = fileList.indexOf(QFileInfo(currentFilePath).fileName()); + if (currentIndex >= 0 && currentIndex < m_folderSize - 1 && !random) { + return directory.absoluteFilePath(fileList.at(currentIndex + 1)); + } else if (loop && fileList.size() > 0 && !random) { + return directory.absoluteFilePath(fileList.at(0)); + } else if (random && m_folderSize > 0) { + if (m_played.size() >= m_folderSize ) + m_played.clear(); + int r = rand() % fileList.size(); + while (m_played.contains(r)) { + r = rand() % fileList.size(); + } + return directory.absoluteFilePath(fileList.at(r)); + } + return QString(); +} + +void libreMediaServerAudio::endMediaUi(int i) +{ + QString nextFile; + if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) { + m_currentStatus[i] = Status::Stopped; + m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); + } else if (m_currentStatus[i] == Status::PlayingFolder) { + nextFile = getNextFile(m_currentMedia[i], false, false); + } else if (m_currentStatus[i] == Status::PlayingFolderLoop) { + nextFile = getNextFile(m_currentMedia[i], true, false); + } else if (m_currentStatus[i] == Status::PlayingFolderRandom) { + nextFile = getNextFile(m_currentMedia[i], false, true); + } + if (!nextFile.isEmpty()) { + this->uiLoadMedia(i, nextFile); + m_mae.playbackChanged(i, m_currentStatus[i]); + } else { + m_currentStatus[i] = Status::Stopped; + m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); + m_played.clear(); + } +} + +void libreMediaServerAudio::endMediaDMX(int i) +{ + if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) { + m_currentStatus[i] = Status::Stopped; + m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); + } else if (m_currentStatus[i] == Status::PlayingFolder) { + uint last = 0; + if (!m_played.isEmpty()) + last = m_played.last() + 1; + int folder = m_ola->getValue(i, DMX_FOLDER); + QString nextFile = getNextFile(m_currentMedia[i], false, false); + if (!nextFile.isEmpty()) { + this->loadMedia(i, folder, last); + m_mae.playbackChanged(i, Status::PlayingFolder); + } else { + m_currentStatus[i] = Status::Stopped; + m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); } + } else if (m_currentStatus[i] == Status::PlayingFolderLoop) { + uint last = m_played.last(); + int folder = m_ola->getValue(i, DMX_FOLDER); + last++; + QString nextFile = getNextFile(m_currentMedia[i], true, false); + if (!nextFile.isEmpty()) { + this->loadMedia(i, folder, last); + m_mae.playbackChanged(i, Status::PlayingFolder); + } else { + this->loadMedia(i, folder, 0); + m_mae.playbackChanged(i, Status::PlayingFolderLoop); + } + } else if (m_currentStatus[i] == Status::PlayingFolderRandom) { + int last = -1; + int folder = m_ola->getValue(i, DMX_FOLDER); + while (last == -1) { + last = rand() % m_mediaLibrary->getMediaFolderCount(folder); + if (m_played.contains(last)) + last = -1; + } + this->loadMedia(i, folder, last); + m_mae.playbackChanged(i, Status::PlayingFolderRandom); } } @@ -223,7 +304,6 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) { m_lmsUi = lmsUi; m_ui = true; - connect(m_ola, SIGNAL(universeReceived(int)), m_lmsUi->m_dmxWidget, SLOT(updateWatchDMX(int))); connect(m_lmsUi->m_aw, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int))); connect(m_lmsUi->m_aw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_aw, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); @@ -231,14 +311,32 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int, int))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); - m_refreshUi = new QTimer(this); - connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); - m_refreshUi->start(UI_REFRESH_TIME); - m_ola->start(QThread::TimeCriticalPriority ); + if (m_settings->getDmxActive()) { + connect(m_ola, SIGNAL(universeReceived(int)), m_lmsUi->m_dmxWidget, SLOT(updateWatchDMX(int))); + m_ola->start(QThread::TimeCriticalPriority ); + } else { + m_lmsUi->m_dmxWidget->hide(); + //m_lmsUi->topWidget->hide(); + } for (uint i = 0; i < m_settings->getAudioDeviceQty(); i++) { char *name = m_mae.getDeviceName(i); m_lmsUi->m_aw->busNameChanged(i, name); } + if (m_settings->getShowPlayerActive()) { + m_lmsUi->m_showPlayer->loadCueTrackList("lastshow.xml"); + m_lmsUi->m_showPlayer->show(); + } + m_settings->beginGroup("mainwindow"); + auto geometry = m_settings->value("geometry", QByteArray()).toByteArray(); + if (!geometry.isEmpty()) + lmsUi->restoreGeometry(geometry); + geometry = m_settings->value("showPlayerGeometry", QByteArray()).toByteArray(); + if (!geometry.isEmpty()) + lmsUi->m_showPlayer->restoreGeometry(geometry); + m_settings->endGroup(); + m_refreshUi = new QTimer(this); + connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); + m_refreshUi->start(UI_REFRESH_TIME); }; // From Ui widgets and ShowPlayer @@ -274,6 +372,7 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) void libreMediaServerAudio::uiPlaybackChanged(int layer, Status s) { ma_result result; + QString tmp; result = m_mae.playbackChanged(layer, s); if (result == MA_SUCCESS) { @@ -282,6 +381,22 @@ void libreMediaServerAudio::uiPlaybackChanged(int layer, Status s) } else { qWarning() << "ui playback change error " << result << " status " << statusToString(s) << "layer" << layer; } + switch (s) { + case Status::PlayingOnce: + case Status::PlayingLoop: + case Status::Iddle: + case Status::Stopped: + m_played.clear(); + break; + case Status::Paused: + case Status::PlayingFolder: + case Status::PlayingFolderLoop: + break; + case Status::PlayingFolderRandom: + tmp = getNextFile(m_currentMedia[layer], false, true); + uiLoadMedia(layer, tmp); + break; + } } void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) @@ -296,6 +411,7 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) if (result == MA_SUCCESS) { m_currentMedia[layer] = mediaFile; m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer)); + m_played.append(getFileIndexInFolder(mediaFile)); } else { qWarning() << "ui load media error" << result << "file" << mediaFile << "layer" << layer; } @@ -310,4 +426,5 @@ void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, break; } } + #endif diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index d2f2ec6..580ca9a 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -62,13 +62,18 @@ private: QTimer *m_refreshUi; libreMediaServerAudioUi *m_lmsUi; float m_updateUi[MAX_LAYERS][4]; - + int m_folderSize; + private slots: void refreshUi(); void uiSliderChanged(int layer, Slider s, int value); void uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut); void uiPlaybackChanged(int layer, Status s); void uiLoadMedia(int layer, QString s); + void endMediaDMX(int layer); + void endMediaUi(int layer); + QString getNextFile(const QString& currentFilePath, bool loop, bool random); + int getFileIndexInFolder(const QString& currentFilePath); #endif }; diff --git a/src/main.cpp b/src/main.cpp index 5cea13f..3aabf65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,7 +35,10 @@ int main(int argc, char *argv[]) libreMediaServerAudio lms; app.setApplicationName("LibreMediaServerAudio"); app.setOrganizationName("Criptomart"); - app.setOrganizationDomain("Criptomart.net"); + app.setOrganizationDomain("criptomart.net"); + QCoreApplication::setOrganizationName("Criptomart"); + QCoreApplication::setOrganizationDomain("criptomart.net"); + QCoreApplication::setApplicationName("LibreMediaServerAudio"); app.setApplicationVersion(VERSION); #ifndef NOGUI if (hasUi(argc, argv) || lms.getShowUi()) diff --git a/src/settings.cpp b/src/settings.cpp index 2c8361f..fc17589 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -12,7 +12,7 @@ Settings *Settings::getInstance(QObject *parent) { } Settings::Settings(QObject *parent) : - QSettings{parent} + QSettings("Criptomart", "LibreMediaServer", parent) { m_layersNumber = 0; m_ui = false; @@ -30,6 +30,8 @@ void Settings::settingsLoader() { beginGroup("lmsAudio"); m_ui = value("ui", 0).toBool(); + m_dmxActive = value("dmxActive", 0).toBool(); + m_showPlayerActive = value("showPlayerActive", 0).toBool(); m_layersNumber = value("layersNumber", 0).toInt(); m_pathmedia = value("path", "").toString(); endGroup(); @@ -60,6 +62,8 @@ void Settings::settingsSaver() { beginGroup("lmsAudio"); setValue("ui", m_ui); + setValue("dmxActive", m_dmxActive); + setValue("showPlayerActive", m_showPlayerActive); setValue("layersNumber", m_layersNumber); setValue("path", m_pathmedia); endGroup(); @@ -78,15 +82,17 @@ void Settings::settingsSaver() endGroup(); } endGroup(); + sync(); + qDebug() << "writed settings to " << fileName(); } -// Read the dmx settings for dmx.xml At the moment we need: +// Read the dmx settings. At the moment we need: // - The path to the medias folder tree // - The number of sources/layers controlled by DMX // - The first DMX channel of each source/layer -// - The universe to bind in OLA +// - dmxActive and The universe to bind in OLA // - Audio device id -// - Show the Ui or not +// - Show Ui, showPlayer void Settings::readFromFile(QString file) { QFile* xmlFile = new QFile(file); if (!xmlFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -106,6 +112,8 @@ void Settings::readFromFile(QString file) { if(token == QXmlStreamReader::StartElement) { if(xmlReader->name() == "lmsAudio") { m_ui = xmlReader->attributes().value("ui").toLocal8Bit().toInt(); + m_dmxActive = xmlReader->attributes().value("dmxActive").toInt(); + m_showPlayerActive = xmlReader->attributes().value("showPlayerActive").toInt(); m_layersNumber = xmlReader->attributes().value("layersNumber").toLocal8Bit().toInt(); m_pathmedia = xmlReader->attributes().value("path").toLocal8Bit(); continue; @@ -142,6 +150,7 @@ void Settings::readFromFile(QString file) { void Settings::printSettings() { qInfo() << "Settings readed:\nShow Ui:" << m_ui << "Layers:" << m_layersNumber << "Path:" << m_pathmedia <<"Audio Device qty:" << m_audioDeviceQty; + qInfo() << "dmx: " << m_dmxActive << " showPlayer: " << m_showPlayerActive; for (uint i = 0; i < m_audioDeviceQty; i++) qInfo() << "Audio device internal id:" << i << "system id:" << m_audioDeviceId[i]; for (int i = 0; i < m_layersNumber; i++) diff --git a/src/settings.h b/src/settings.h index 8f57f0c..028bc8e 100644 --- a/src/settings.h +++ b/src/settings.h @@ -28,6 +28,8 @@ public: inline uint *getAudioDeviceId() { return m_audioDeviceId; } inline uint getAudioDeviceQty() { return m_audioDeviceQty; } inline bool getShowUi() { return m_ui; } + inline bool getDmxActive() { return m_dmxActive; } + inline bool getShowPlayerActive() { return m_showPlayerActive; } void readFile(); void readFromFile(QString file); void printSettings(); @@ -43,6 +45,8 @@ private: QSet m_universe; int m_layersNumber; bool m_ui; + bool m_dmxActive; + bool m_showPlayerActive; }; #endif // SETTINGS_H diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 4e95da2..9ac3f5a 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -23,7 +23,11 @@ ShowPlayer::ShowPlayer(QWidget *parent) : ui->nextCue->setNextCue(); } -ShowPlayer::~ShowPlayer() {} +ShowPlayer::~ShowPlayer() +{ + saveCueTrackList("lastshow.xml"); + delete ui; +} void ShowPlayer::onAddTrack() { ui->cueListWidget->createNewCueTrack(); @@ -167,3 +171,11 @@ void ShowPlayer::updateIndex(int index) { ui->nextCue->loadCueTrack(track); } } + +void ShowPlayer::loadCueTrackList(QString path) { + ui->cueListWidget->loadCueTrackList(path.toStdString()); +} + +void ShowPlayer::saveCueTrackList(QString path) { + ui->cueListWidget->saveCueTrackList(path.toStdString()); +} \ No newline at end of file diff --git a/src/showplayer.h b/src/showplayer.h index 724d96b..4054904 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -29,6 +29,8 @@ public: public slots: void cueTrackAtEnd(int layer); + void loadCueTrackList(QString path); + void saveCueTrackList(QString path); private: Ui::ShowPlayer *ui;