fix playing folder modes in ui. read/write settings and cue list at

start/exit.shortcuts.
This commit is contained in:
snt 2024-07-08 20:23:25 +02:00
parent b4988a1307
commit 46b7624fb5
10 changed files with 252 additions and 90 deletions

View file

@ -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