lms-audio/src/settings.cpp
2024-07-26 20:16:21 +02:00

187 lines
6.9 KiB
C++

#include "settings.h"
Settings *Settings::_instance = 0;
Settings *Settings::getInstance(QObject *parent) {
if (_instance == 0) {
_instance = new Settings(parent);
Q_CHECK_PTR(_instance);
}
return _instance;
}
Settings::Settings(QObject *parent) :
QSettings("Criptomart", "LibreMediaServer", parent)
{
m_layersNumber = 0;
m_ui = false;
m_audioDeviceQty = 0;
for (uint i = 0; i < MAX_AUDIODEVICES; i++)
m_audioDeviceId[i] = -1;
if (QFile::exists(DEFAULT_FILE))
readFromFile(DEFAULT_FILE);
else if (QFile::exists(fileName()))
settingsLoader();
else {
qDebug() << "Can not read initial settings, making some standard";
setValue("lmsAudio/ui", 1);
setValue("lmsAudio/dmxActive", 0);
setValue("lmsAudio/showPlayerActive", 1);
setValue("lmsAudio/layersNumber", 2);
setValue("lmsAudio/path", "../media/");
setValue("audioDevice/devicesNumber", 2);
setValue("audioDevice/id0", 4);
setValue("audioDevice/id1", 3);
setValue("layers/layer0/dmx", 1);
setValue("layers/layer0/universe", 1);
setValue("layers/layer0/id", 0);
setValue("layers/layer0/audioDevice", 0);
setValue("layers/layer1/dmx", 26);
setValue("layers/layer1/universe", 1);
setValue("layers/layer1/id", 1);
setValue("layers/layer1/audioDevice", 0);
sync();
settingsLoader();
}
}
Settings::~Settings() {
settingsSaver();
}
void Settings::settingsLoader()
{
qDebug() << "loading settings from system";
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();
beginGroup("audioDevice");
m_audioDeviceQty = value("devicesNumber", 0).toInt();
for (uint i = 0; i < m_audioDeviceQty; i++)
m_audioDeviceId[i] = value(QString("id%1").arg(i), -1).toInt();
endGroup();
beginGroup("layers");
for (int i = 0; i < m_layersNumber; i++) {
beginGroup(QString("layer%1").arg(i));
dmxSetting temp;
temp.address = value("dmx", 0).toInt();
temp.universe = value("universe", 0).toInt();
temp.layer = value("id", 0).toInt();
temp.audioDevice = value("audioDevice", 0).toInt();
m_settings.append(temp);
if (!m_universe.contains(temp.universe)) {
m_universe.insert(temp.universe);
}
endGroup();
}
endGroup();
printSettings();
}
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();
beginGroup("audioDevice");
setValue("devicesNumber", m_audioDeviceQty);
for (uint i = 0; i < m_audioDeviceQty; i++)
setValue(QString("id%1").arg(i), m_audioDeviceId[i]);
endGroup();
beginGroup("layers");
for (int i = 0; i < m_layersNumber; i++) {
beginGroup(QString("layer%1").arg(i));
setValue("dmx", m_settings[i].address);
setValue("universe", m_settings[i].universe);
setValue("id", m_settings[i].layer);
setValue("audioDevice", m_settings[i].audioDevice);
endGroup();
}
endGroup();
sync();
qDebug() << "writed settings to " << fileName();
}
// 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
// - dmxActive and The universe to bind in OLA
// - Audio device id
// - Show Ui, showPlayer
void Settings::readFromFile(QString file) {
qDebug() << "loading settings from xml file " << file;
QFile* xmlFile = new QFile(file);
if (!xmlFile->open(QIODevice::ReadOnly | QIODevice::Text)) {
QMessageBox::critical(NULL,"Load XML File Problem",
QString("Couldn't open %1 to load settings").arg(file),
QMessageBox::Ok);
qCritical("Load XML File Problem");
return;
}
QXmlStreamReader* xmlReader = new QXmlStreamReader(xmlFile);
while(!xmlReader->atEnd() && !xmlReader->hasError()) {
QXmlStreamReader::TokenType token = xmlReader->readNext();
if(token == QXmlStreamReader::StartDocument) {
continue;
}
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;
}
if(xmlReader->name() == "audioDevice") {
m_audioDeviceQty = xmlReader->attributes().value("devicesNumber").toLocal8Bit().toInt();
for (uint i = 0; i < m_audioDeviceQty; i++)
m_audioDeviceId[i] = xmlReader->attributes().value(QString("id%1").arg(i)).toLocal8Bit().toInt();
}
if(xmlReader->name() == "layer") {
dmxSetting temp;
temp.address = xmlReader->attributes().value("dmx").toLocal8Bit().toInt() - 1;
temp.universe = xmlReader->attributes().value("universe").toLocal8Bit().toInt();
temp.layer = xmlReader->attributes().value("id").toLocal8Bit().toInt();
temp.audioDevice = xmlReader->attributes().value("audioDevice").toLocal8Bit().toInt();
m_settings.append(temp);
if (!m_universe.contains(temp.universe)) {
m_universe.insert(temp.universe);
}
}
}
}
if(xmlReader->hasError()) {
QMessageBox::critical(NULL,"File xml Parse Error ", xmlReader->errorString(), QMessageBox::Ok);
qWarning("File xml Parse Error %s", xmlReader->errorString().toLatin1().constData());
// ToDo: manage this, open a dialog to load a new file.
}
xmlReader->clear();
xmlFile->close();
delete xmlReader;
delete xmlFile;
this->printSettings();
}
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++)
qInfo() << "Layer:" << m_settings[i].layer << "Address:" << m_settings[i].address << "Universe:" << m_settings[i].universe;
}
void Settings::readFile() {
readFromFile(DEFAULT_FILE);
}