Compare commits

...

6 commits

Author SHA1 Message Date
snt
f665ccfd7d shortcuts acts in entire app, although the focus is set on the main window
cueTrackWidget and cueTrackListWidget cosmetics
2024-07-26 22:47:24 +02:00
snt
f4bf71dbcf stop reset to cursor when finish fade out 2024-07-26 20:59:45 +02:00
snt
f6eb15f13c save splitters state. Moved restore and save geometry to ui and
showplayer constructors/destructors
2024-07-26 20:16:21 +02:00
snt
11bd76a458 filter bank HPF Ui 2024-07-26 15:42:06 +02:00
snt
8716004c5e cue controls in CueTrackWidget 2024-07-09 20:48:20 +02:00
snt
eed68d1817 panic resotre buttons. copy/cut/paste connects. Load systems settings,
if not, default xml file, if not, generate a generic conf (2 layers,
    no dmx, path ../media, two audiodevices)
2024-07-09 17:11:53 +02:00
21 changed files with 1037 additions and 491 deletions

View file

@ -1,8 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<lmsAudio ui="1" layersNumber="4" path="../media/sound" >
<audioDevice devicesNumber="2" id0="3" id1="4"/>
<layer id="0" dmx="1" universe="1" audioDevice="0" />
<layer id="1" dmx="17" universe="1" audioDevice="0" />
<layer id="2" dmx="33" universe="1" audioDevice="1" />
<layer id="3" dmx="49" universe="1" audioDevice="1"/>
</lmsAudio>

8
docs/lms-audio.xml Normal file
View file

@ -0,0 +1,8 @@
<?xml version='1.0' encoding='UTF-8'?>
<lmsAudio ui="1" dmxActive="0" showPlayerActive="1" layersNumber="4" path="../media/sound" >
<audioDevice devicesNumber="2" id0="4" id1="3"/>
<layer id="0" dmx="1" universe="1" audioDevice="0" />
<layer id="1" dmx="26" universe="1" audioDevice="0" />
<layer id="2" dmx="51" universe="1" audioDevice="1" />
<layer id="3" dmx="76" universe="1" audioDevice="1"/>
</lmsAudio>

View file

@ -42,3 +42,8 @@ v 0.3.0
- ampliar writer para recibir un número n de entradas y escribirlas cada una en un buffer
- aislar miniaudio del callback dmx tal como hemos hecho con la Ui, al menos las operaciones lentas como cargar medios.
- en load media usar un fence para actualizar mediaLoaded.
- Video
v 0.2.1 showplayer

View file

@ -10,6 +10,7 @@
<file>resources/save_button.png</file>
<file>resources/icon.png</file>
<file>resources/panic_button.jpg</file>
<file>resources/go_button.jpeg</file>
<file>resources/go_button.jpeg</file>
<file>resources/restore_button.jpg</file>
</qresource>
</RCC>

BIN
resources/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
resources/panic_button.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View file

@ -14,31 +14,32 @@
#include <QXmlStreamReader>
#include <QMessageBox>
#include "cuetracklistwidget.h"
#include "editcuetrackwidget.h"
CueTrackListWidget::CueTrackListWidget(QWidget *parent)
{
layout = new QVBoxLayout(this);
tableWidget = new QTableWidget();
tableWidget->setSortingEnabled(false);
tableWidget->setSortingEnabled(false);
layout->addWidget(tableWidget);
setLayout(layout);
QShortcut *shortcut_up = new QShortcut(QKeySequence("Up"), parent);
QObject::connect(shortcut_up, SIGNAL(activated()), this, SLOT(key_up()));
QShortcut *shortcut_down = new QShortcut(QKeySequence("Down"), parent);
tableWidget->installEventFilter(parent);
QShortcut *shortcut_up = new QShortcut(QKeySequence("Up"), 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()));
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()));
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) {
@ -92,7 +93,7 @@ void CueTrackListWidget::key_down() {
void CueTrackListWidget::displayCueTrackInTable(CueTrack *cueTrack, int index) {
if (tableWidget->columnCount() == 0) {
tableWidget->setColumnCount(7);
QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"};
QStringList headers = {"Active", "Cue","Chan", "Name", "Vol", "State", "File"};
tableWidget->setHorizontalHeaderLabels(headers);
}
if (index == -1)
@ -247,7 +248,7 @@ void CueTrackListWidget::redrawCueTrackList()
int selected = cueTracks.at(selectedIndex)->userNumber;
clearTableWidget();
tableWidget->setColumnCount(7);
QStringList headers = {"Active", "Number","Channel", "Name", "Volume", "Status", "File"};
QStringList headers = {"Active", "Cue","Chan", "Name", "Vol", "State", "File"};
tableWidget->setHorizontalHeaderLabels(headers);
sortCueTrackList();
selectedIndex = 0;
@ -270,6 +271,7 @@ void CueTrackListWidget::redrawCueTrackList()
void CueTrackListWidget::loadCueTrackList(std::string filename)
{
qDebug() << "loading cue list from " << filename.data();
QFile file(QString::fromStdString(filename));
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
@ -389,6 +391,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename)
void CueTrackListWidget::saveCueTrackList(std::string filename)
{
qDebug() << "saving cue list to " << filename.data();
std::ofstream file(filename);
if (!file.is_open())
{
@ -508,7 +511,7 @@ CueTrack loadCueTrackFromXml(const QString& filename) {
const QString elementName = xmlReader.name().toString();
if (elementName == "filePath") {
cueTrack.filePath = xmlReader.readElementText().toStdString();
} else if (elementName == "volume") {
} else if (elementName == "vol") {
cueTrack.volume = xmlReader.readElementText().toInt();
} else if (elementName == "pan") {
cueTrack.pan = xmlReader.readElementText().toInt();
@ -518,7 +521,7 @@ CueTrack loadCueTrackFromXml(const QString& filename) {
cueTrack.bus1 = xmlReader.readElementText().toInt();
} else if (elementName == "bus2") {
cueTrack.bus2 = xmlReader.readElementText().toInt();
} else if (elementName == "status") {
} else if (elementName == "state") {
QString tmp = xmlReader.readElementText();
cueTrack.status = stringToStatus(&tmp);
} else if (elementName == "fadeOut") {

View file

@ -10,7 +10,6 @@
#include <QTableWidget>
#include <QTableWidgetItem>
#include "defines.h"
#include "editcuetrackwidget.h"
class CueTrackListWidget : public QWidget {
Q_OBJECT

View file

@ -17,9 +17,14 @@ CueTrackWidget::CueTrackWidget(QWidget *parent) :
connect(&tlFade, SIGNAL(finished()), this, SLOT(fadeSlot()));
connect(&tlWaitIn, SIGNAL(finished()), this, SLOT(waitInSlot()));
connect(&tlWaitOut, SIGNAL(finished()), this, SLOT(waitOutSlot()));
connect(ui->playButton, SIGNAL(clicked()), this, SLOT(play()));
connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(stop()));
connect(ui->pauseButton, SIGNAL(clicked()), this, SLOT(pause()));
connect(ui->fadeInButton, SIGNAL(clicked()), this, SLOT(fadeIn()));
connect(ui->fadeOutButton, SIGNAL(clicked()), this, SLOT(fadeOut()));
connect(ui->muteButton, SIGNAL(clicked()), this, SLOT(mute()));
}
CueTrackWidget::~CueTrackWidget()
{
delete ui;
@ -34,9 +39,9 @@ void CueTrackWidget::loadCueTrack(CueTrack* track)
ui->pitch->display(track->pitch);
ui->bus1->display(track->bus1);
ui->bus2->display(track->bus2);
ui->fade->setValue(track->fadeIn);
ui->waitIn->setValue(track->waitIn);
ui->waitOut->setValue(track->waitOut);
ui->fade->display(track->fadeIn);
ui->waitIn->display(track->waitIn);
ui->waitOut->display(track->waitOut);
ui->halt->setChecked(track->stopAtEnd);
QFileInfo fileInfo(track->filePath.data());
fileInfo.fileName().truncate(64);
@ -44,6 +49,7 @@ void CueTrackWidget::loadCueTrack(CueTrack* track)
ui->status->setText(statusToString(track->status));
ui->audioLayer->display(track->audioLayer);
ui->multi->setChecked(track->multi);
ui->fadeOut->display(track->fadeOut);
}
void CueTrackWidget::go()
@ -95,4 +101,48 @@ void CueTrackWidget::setNextCue()
{
ui->cueProgressBar->setDisabled(true);
ui->cueProgressBar->hide();
ui->audioControlLayout->setEnabled(false);
QList<int> list = { 1, 0 };
ui->cueValues->setSizes(list);
}
void CueTrackWidget::play()
{
QString t = ui->status->text();
emit changeStatus(ui->audioLayer->intValue(), stringToStatus(&t));
}
void CueTrackWidget::stop()
{
emit changeStatus(ui->audioLayer->intValue(), Status::Stopped);
}
void CueTrackWidget::pause()
{
emit changeStatus(ui->audioLayer->intValue(), Status::Paused);
}
void CueTrackWidget::fadeIn()
{
emit changeVol(ui->audioLayer->intValue(), Slider::Volume, ui->vol->value() * 655.35, ui->fade->value() * 1000, ui->fadeOut->value() * 1000);
muted = false;
}
void CueTrackWidget::fadeOut()
{
emit changeVol(ui->audioLayer->intValue(), Slider::Volume, 0, ui->fade->value() * 1000, ui->fadeOut->value() * 1000);
muted = true;
}
void CueTrackWidget::mute()
{
if (muted)
{
emit changeVol(ui->audioLayer->intValue(), Slider::Volume, ui->vol->value() * 655.35, 0, 0);
muted = false;
}
else {
emit changeVol(ui->audioLayer->intValue(), Slider::Volume, 0, 0, 0);
muted = true;
}
}

View file

@ -19,26 +19,34 @@ public:
explicit CueTrackWidget(QWidget *parent = nullptr);
~CueTrackWidget();
private:
Ui::CueTrackWidget *ui;
QTimeLine tlFade;
QTimeLine tlWaitIn;
QTimeLine tlWaitOut;
public slots:
void loadCueTrack(CueTrack* track);
void go();
void setNextCue();
private:
Ui::CueTrackWidget *ui;
QTimeLine tlFade;
QTimeLine tlWaitIn;
QTimeLine tlWaitOut;
bool muted = false;
private slots:
void fadeSlot();
void waitInSlot();
void waitOutSlot();
void play();
void stop();
void pause();
void fadeIn();
void fadeOut();
void mute();
signals:
void cueFinished(int layer);
void goAction(int layer);
void NewFunction(CueTrack *track);
void changeStatus(int layer, Status status);
void changeVol(int layer, Slider s, int value, int fadein, int fadeout);
};
#endif // CUETRACKWIDGET_H

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,7 @@
#define VERSION "LibreMediaServerAudio v0.2.0 Antigona"
#define COPYRIGHT "(C) 2014-2024 Santi Noreña <lms@criptomart.net>"
#define LICENSE "GPL3 Licensed. See LICENSE.txt."
#define DEFAULT_FILE "lms-audio.xlm"
#define DEFAULT_FILE "lms-audio.xml"
#define MAX_LAYERS 4
#define MAX_AUDIODEVICES 8
#define FORMAT ma_format_f32 /* Must always be f32. */

View file

@ -36,6 +36,14 @@ FilterBankWidget::FilterBankWidget(QWidget *parent)
"font-size: 8px;}");
connect(m_bypass, SIGNAL(stateChanged(int)), this, SLOT(bypassChanged(int)));
master->addWidget(fb[0]);
fb[0]->setFocusPolicy(Qt::NoFocus);
fb[0]->setButtonSymbols(QAbstractSpinBox::NoButtons);
fb[0]->setValue(-1);
fb[0]->setDecimals(1);
fb[0]->setAlignment(Qt::AlignHCenter);
fb[0]->setContentsMargins(0, 0, 0, 0);
fb[0]->setMaximumWidth(66);
fb[0]->setMinimumWidth(25);
layout->addLayout(master);
for (int i = 1; i < 13;) {
QVBoxLayout *filterLayout= new QVBoxLayout;

View file

@ -45,10 +45,46 @@ libreMediaServerAudioUi::libreMediaServerAudioUi(QWidget *parent)
"selection-background-color: green"
);
m_showPlayer = new ShowPlayer();
m_showPlayer->setFocus();
QShortcut *shortcut_space = new QShortcut(QKeySequence(" "), this);
QObject::connect(shortcut_space, SIGNAL(activated()), m_showPlayer, SLOT(go()));
QShortcut *shortcut_up = new QShortcut(QKeySequence("Up"), this);
QObject::connect(shortcut_up, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(key_up()));
QShortcut *shortcut_down = new QShortcut(QKeySequence("Down"), this);
QObject::connect(shortcut_down, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(key_down()));
QShortcut *shortcut_copy = new QShortcut(QKeySequence("Ctrl+C"), this);
QObject::connect(shortcut_copy, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(copyCueTrack()));
QShortcut *shortcut_cut = new QShortcut(QKeySequence("Ctrl+X"), this);
QObject::connect(shortcut_cut, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(cutCueTrack()));
QShortcut *shortcut_paste = new QShortcut(QKeySequence("Ctrl+V"), this);
QObject::connect(shortcut_paste, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(pasteCueTrack()));
QShortcut *shortcut_delete = new QShortcut(QKeySequence("Delete"), this);
QObject::connect(shortcut_delete, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(deleteCueTrack()));
QShortcut *shortcut_insert = new QShortcut(QKeySequence("Insert"), this);
QObject::connect(shortcut_insert, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(createNewCueTrack()));
QShortcut *shortcut_edit = new QShortcut(QKeySequence("e"), this);
QObject::connect(shortcut_edit, SIGNAL(activated()), m_showPlayer->ui->cueListWidget, SLOT(editCueTrack()));
Settings::getInstance()->beginGroup("mainwindow");
auto geometry = Settings::getInstance()->value("geometry", QByteArray()).toByteArray();
if (!geometry.isEmpty())
restoreGeometry(geometry);
geometry = Settings::getInstance()->value("showPlayerGeometry", QByteArray()).toByteArray();
if (!geometry.isEmpty())
m_showPlayer->restoreGeometry(geometry);
Settings::getInstance()->endGroup();
}
libreMediaServerAudioUi::~libreMediaServerAudioUi()
{
Settings::getInstance()->beginGroup("mainwindow");
Settings::getInstance()->setValue("size", size());
Settings::getInstance()->setValue("fullScreen", isFullScreen());
Settings::getInstance()->setValue("geometry", saveGeometry());
Settings::getInstance()->setValue("showPlayer", m_showPlayer->isVisible());
Settings::getInstance()->setValue("showPlayerSize", m_showPlayer->size());
Settings::getInstance()->setValue("showPlayerGeometry", m_showPlayer->saveGeometry());
Settings::getInstance()->endGroup();
delete m_showPlayer;
}
void libreMediaServerAudioUi::olasetup()
@ -60,6 +96,5 @@ void libreMediaServerAudioUi::olasetup()
void libreMediaServerAudioUi::launchShowPlayerWindow()
{
//m_showPlayer->showMaximized();
m_showPlayer->show();
}

View file

@ -24,7 +24,7 @@
libreMediaServerAudio::libreMediaServerAudio()
{
m_settings = Settings::getInstance(this);
m_settings->readFile();
//m_settings->readFile();
m_ui = m_settings->getShowUi();
m_layersQty = m_settings->getLayersNumber();
for (uint i = 0; i < m_layersQty; i++) {
@ -66,17 +66,6 @@ libreMediaServerAudio::~libreMediaServerAudio()
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);
@ -316,7 +305,6 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
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);
@ -326,14 +314,6 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi)
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);
@ -356,6 +336,7 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value)
m_updateUi[layer][2] = value;
break;
case Slider::Bypass:
// ToDo: sigsev when no dmx, resolve this whitout dmxSettings, is it needed=
m_mae.setBypass(m_dmxSettings.at(layer).audioDevice, layer, value);
break;
case Slider::Bus1:

View file

@ -1,3 +1,4 @@
#include <QTimer>
#include "miniaudioengine.h"
#include "dmxPersonality.h"
@ -285,7 +286,7 @@ ma_result MiniAudioEngine::startDevices()
engineConfig.noAutoStart = MA_TRUE;
for (uint internalId = 0; internalId < m_mae.audioDevicesQty; internalId++) {
deviceConfig.capture.pDeviceID = &m_mae.pPlaybackDeviceInfos[m_mae.audioDevicesId[internalId]].id;
//deviceConfig.capture.pDeviceID = &m_mae.pPlaybackDeviceInfos[m_mae.audioDevicesId[internalId]].id;
deviceConfig.playback.pDeviceID = &m_mae.pPlaybackDeviceInfos[m_mae.audioDevicesId[internalId]].id;
deviceConfig.pUserData = &m_mae.engines[internalId];
result = ma_device_init(&m_mae.context, &deviceConfig, &m_mae.devices[internalId]);
@ -499,6 +500,9 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status)
break;
case Status::Stopped:
ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], m_mae.currentStatus[layer].fadeOut);
QTimer::singleShot(m_mae.currentStatus[layer].fadeOut, [this, layer] {
this->seekToCursor(layer, m_mae.currentStatus[layer].cursor);
});
break;
case Status::PlayingLoop:
loop = true;

View file

@ -19,7 +19,31 @@ Settings::Settings(QObject *parent) :
m_audioDeviceQty = 0;
for (uint i = 0; i < MAX_AUDIODEVICES; i++)
m_audioDeviceId[i] = -1;
settingsLoader();
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() {
@ -28,6 +52,7 @@ Settings::~Settings() {
void Settings::settingsLoader()
{
qDebug() << "loading settings from system";
beginGroup("lmsAudio");
m_ui = value("ui", 0).toBool();
m_dmxActive = value("dmxActive", 0).toBool();
@ -94,14 +119,14 @@ void Settings::settingsSaver()
// - 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);
// Instead exit give the oportunity to load another file or define the settings
qCritical("Load XML File Problem");
exit(1);
qCritical("Load XML File Problem");
return;
}
QXmlStreamReader* xmlReader = new QXmlStreamReader(xmlFile);
while(!xmlReader->atEnd() && !xmlReader->hasError()) {

View file

@ -13,7 +13,12 @@ ShowPlayer::ShowPlayer(QWidget *parent) :
connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList()));
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(updateIndex(int)));
currentStatus = Status::Iddle;
connect(ui->panicButton, SIGNAL(clicked()), this, SLOT(panicButtonClicked()));
connect(ui->restoreButton, SIGNAL(clicked()), this, SLOT(restoreButtonClicked()));
connect(ui->CopyCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(copyCueTrack()));
connect(ui->PasteCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(pasteCueTrack()));
connect(ui->CutCue, SIGNAL(clicked()), ui->cueListWidget, SLOT(cutCueTrack()));
currentStatus = Status::Iddle;
for(int i = 0; i < MAX_LAYERS; i++) {
layersUsed[i] = -1;
cueTrackWidgetPlaying[i] = nullptr;
@ -21,12 +26,22 @@ ShowPlayer::ShowPlayer(QWidget *parent) :
prevCue[i] = nullptr;
}
ui->nextCue->setNextCue();
Settings::getInstance()->beginGroup("showPlayerSplittersState");
ui->splitter_main->restoreState(Settings::getInstance()->value("mainSplitter").toByteArray());
ui->splitter_controls->restoreState(Settings::getInstance()->value("controlsSplitter").toByteArray());
ui->splitter_cues->restoreState(Settings::getInstance()->value("cueSplitter").toByteArray());
Settings::getInstance()->endGroup();
}
ShowPlayer::~ShowPlayer()
{
saveCueTrackList("lastshow.xml");
delete ui;
Settings::getInstance()->beginGroup("showPlayerSplittersState");
Settings::getInstance()->setValue("mainSplitter", ui->splitter_main->saveState());
Settings::getInstance()->setValue("controlsSplitter", ui->splitter_controls->saveState());
Settings::getInstance()->setValue("cueSplitter", ui->splitter_cues->saveState());
Settings::getInstance()->endGroup();
delete ui;
}
void ShowPlayer::onAddTrack() {
@ -78,7 +93,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, track->fadeOut * 1000);
if (prevCue[track->audioLayer] != nullptr) {
if (track->fadeIn != 0 && prevCue[track->audioLayer] != nullptr) {
if (prevCue[track->audioLayer]->pan != track->pan)
fade(Slider::Pan, prevCue[track->audioLayer]->pan, track);
if (prevCue[track->audioLayer]->pitch != track->pitch)
@ -120,12 +135,12 @@ void ShowPlayer::cueTrackAtEnd(int layer)
void ShowPlayer::cueFinished(int c)
{
if (!current[c])
return;
if (!current[c]->stopAtEnd)
if (!current[c])
return;
if (!current[c]->stopAtEnd)
this->go();
if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused)
cueTrackAtEnd(c);
if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused)
cueTrackAtEnd(c);
}
CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) {
@ -134,10 +149,12 @@ CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) {
widget->loadCueTrack(track);
connect(widget, SIGNAL(goAction(int)), this, SLOT(goAction(int)));
connect(widget, SIGNAL(cueFinished(int)), this, SLOT(cueFinished(int)));
connect(widget, SIGNAL(changeStatus(int, Status)), this, SIGNAL(uiPlaybackChanged(int, Status)));
connect(widget, SIGNAL(changeVol(int, Slider, int, int, int)), this, SIGNAL(uiSliderChangedFaded(int, Slider, int, int, int)));
cueTrackWidgetPlaying[track->audioLayer] = widget;
item->setSizeHint(widget->sizeHint());
ui->activeCueList->setItemWidget(item, widget);
return (widget);
return (widget);
}
void ShowPlayer::playCueTrack(CueTrack* track) {
@ -178,4 +195,28 @@ void ShowPlayer::loadCueTrackList(QString path) {
void ShowPlayer::saveCueTrackList(QString path) {
ui->cueListWidget->saveCueTrackList(path.toStdString());
}
}
void ShowPlayer::panicButtonClicked() {
for (int i = 0; i < MAX_LAYERS; i++) {
if (layersUsed[i] != -1) {
CueTrack* track = current[i];
if (track && track->active) {
emit uiSliderChanged(track->audioLayer, Slider::Volume, 0);
emit uiPlaybackChanged(track->audioLayer, Status::Paused);
}
}
}
}
void ShowPlayer::restoreButtonClicked() {
for (int i = 0; i < MAX_LAYERS; i++) {
if (layersUsed[i] != -1) {
CueTrack* track = current[i];
if (track) {
emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn, track->fadeOut);
emit uiPlaybackChanged(track->audioLayer, track->status);
}
}
}
}

View file

@ -26,6 +26,7 @@ class ShowPlayer : public QDialog
public:
explicit ShowPlayer(QWidget *parent = nullptr);
~ShowPlayer();
Ui::ShowPlayer *ui;
public slots:
void cueTrackAtEnd(int layer);
@ -33,13 +34,13 @@ public slots:
void saveCueTrackList(QString path);
private:
Ui::ShowPlayer *ui;
Status currentStatus = Status::Iddle;
int layersUsed[MAX_LAYERS];
CueTrack *current[MAX_LAYERS];
CueTrack *prevCue[MAX_LAYERS];
CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS];
CueTrackWidget *addCueTrackWidget(CueTrack *track);
std::map<int, std::pair<Status, double>> prePanicState;
private slots:
void updateTrackStateInEngine(CueTrack *track);
@ -53,11 +54,13 @@ private slots:
void goAction(int channel);
void updateIndex(int index);
void fade(Slider s, int start, CueTrack *track);
void panicButtonClicked();
void restoreButtonClicked();
signals:
void uiPlaybackChanged(int layer, Status s);
void uiSliderChanged(int layer, Slider s, int vol);
void uiSliderChangedFaded(int layer, Slider s, int vol, int fadeIn, int fadeOut);
void uiSliderChanged(int layer, Slider s, int value);
void uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut);
void uiLoadMedia(int layer, QString s);
};

View file

@ -34,7 +34,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QSplitter" name="splitter_3">
<widget class="QSplitter" name="splitter_main">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@ -238,7 +238,7 @@
</item>
</layout>
</widget>
<widget class="QSplitter" name="splitter_2">
<widget class="QSplitter" name="splitter_controls">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -286,6 +286,9 @@
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="toolTip">
<string>Panic!</string>
</property>
<property name="text">
<string>...</string>
</property>
@ -295,7 +298,7 @@
</property>
<property name="iconSize">
<size>
<width>96</width>
<width>120</width>
<height>120</height>
</size>
</property>
@ -303,8 +306,26 @@
<string>P</string>
</property>
</widget>
<widget class="QPushButton" name="restoreButton">
<property name="toolTip">
<string>Restore</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../lms-resources.qrc">
<normaloff>:/buttons/resources/restore_button.jpg</normaloff>:/buttons/resources/restore_button.jpg</iconset>
</property>
<property name="iconSize">
<size>
<width>120</width>
<height>120</height>
</size>
</property>
</widget>
</widget>
<widget class="QSplitter" name="splitter">
<widget class="QSplitter" name="splitter_cues">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>