#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(fileName())) settingsLoader(); else if (QFile::exists(DEFAULT_FILE)) readFromFile(DEFAULT_FILE); 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); }