Compare commits
6 commits
46b7624fb5
...
f665ccfd7d
Author | SHA1 | Date | |
---|---|---|---|
|
f665ccfd7d | ||
|
f4bf71dbcf | ||
|
f6eb15f13c | ||
|
11bd76a458 | ||
|
8716004c5e | ||
|
eed68d1817 |
21 changed files with 1037 additions and 491 deletions
|
@ -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
8
docs/lms-audio.xml
Normal 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>
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
BIN
resources/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
BIN
resources/panic_button.jpg
Normal file
BIN
resources/panic_button.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
BIN
resources/restore_button.jpg
Normal file
BIN
resources/restore_button.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 80 KiB |
|
@ -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") {
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include <QTableWidget>
|
||||
#include <QTableWidgetItem>
|
||||
#include "defines.h"
|
||||
#include "editcuetrackwidget.h"
|
||||
|
||||
class CueTrackListWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue