fix playing folder modes in ui. read/write settings and cue list at
start/exit.shortcuts.
This commit is contained in:
parent
b4988a1307
commit
46b7624fb5
10 changed files with 252 additions and 90 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue