[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [minuet/refactoring] src: Move drumstick code to soundbackend plugin
From: Sandro S. Andrade <sandroandrade () kde ! org>
Date: 2016-06-30 21:44:27
Message-ID: E1bIjl5-0000nI-Lt () code ! kde ! org
[Download RAW message or body]
Git commit a6ca2b16362ffad10e7db81a0dfb023ba00fbb31 by Sandro S. Andrade.
Committed on 30/06/2016 at 21:44.
Pushed by sandroandrade into branch 'refactoring'.
Move drumstick code to soundbackend plugin
M +1 -0 src/interfaces/CMakeLists.txt
M +4 -1 src/interfaces/icore.h
M +3 -0 src/interfaces/iexercisecontroller.cpp
M +2 -1 src/interfaces/iexercisecontroller.h
M +4 -0 src/interfaces/isoundbackend.cpp
M +1 -0 src/plugins/drumsticksoundbackend/CMakeLists.txt
M +56 -0 src/plugins/drumsticksoundbackend/drumsticksoundbackend.cpp
M +12 -0 src/plugins/drumsticksoundbackend/drumsticksoundbackend.h
M +0 -3 src/plugins/drumsticksoundbackend/midisequenceroutputthread.h
M +16 -11 src/shell/core.cpp
M +3 -3 src/shell/core.h
M +5 -10 src/shell/exercisecontroller.cpp
M +5 -5 src/shell/exercisecontroller.h
M +1 -1 src/shell/midisequencer.cpp
M +0 -3 src/shell/midisequenceroutputthread.h
M +6 -85 src/shell/minuetmainwindow.cpp
M +3 -13 src/shell/minuetmainwindow.h
M +12 -12 src/shell/qml/ExerciseView.qml
M +15 -15 src/shell/qml/Main.qml
M +11 -11 src/shell/qml/MinuetMenu.qml
M +3 -3 src/shell/qml/midiplayer/MidiPlayer.qml
M +4 -2 src/shell/uicontroller.cpp
M +3 -1 src/shell/uicontroller.h
http://commits.kde.org/minuet/a6ca2b16362ffad10e7db81a0dfb023ba00fbb31
diff --git a/src/interfaces/CMakeLists.txt b/src/interfaces/CMakeLists.txt
index d8f1ae8..d93a136 100644
--- a/src/interfaces/CMakeLists.txt
+++ b/src/interfaces/CMakeLists.txt
@@ -14,6 +14,7 @@ generate_export_header(minuetinterfaces EXPORT_FILE_NAME \
minuetinterfacesexport.
target_link_libraries(minuetinterfaces
Qt5::Core
+ Qt5::Quick
)
install(TARGETS
diff --git a/src/interfaces/icore.h b/src/interfaces/icore.h
index 5caa957..feaf879 100644
--- a/src/interfaces/icore.h
+++ b/src/interfaces/icore.h
@@ -40,7 +40,7 @@ class MINUETINTERFACES_EXPORT ICore : public QObject
Q_OBJECT
Q_PROPERTY(IPluginController * pluginController READ pluginController);
- Q_PROPERTY(ISoundBackend * soundBackend READ soundBackend);
+ Q_PROPERTY(ISoundBackend * soundBackend READ soundBackend NOTIFY soundBackendChanged);
Q_PROPERTY(IExerciseController * exerciseController READ exerciseController);
Q_PROPERTY(IUiController * uiController READ uiController);
@@ -54,6 +54,9 @@ public:
virtual Minuet::IExerciseController *exerciseController() = 0;
virtual Minuet::IUiController *uiController() = 0;
+Q_SIGNALS:
+ void soundBackendChanged(ISoundBackend *newSoundBackend);
+
protected:
explicit ICore(QObject *parent = 0);
static ICore *m_self;
diff --git a/src/interfaces/iexercisecontroller.cpp b/src/interfaces/iexercisecontroller.cpp
index 5cf6691..7a81f4e 100644
--- a/src/interfaces/iexercisecontroller.cpp
+++ b/src/interfaces/iexercisecontroller.cpp
@@ -22,6 +22,8 @@
#include "iexercisecontroller.h"
+#include <QtQml>
+
namespace Minuet
{
@@ -31,6 +33,7 @@ IExerciseController::IExerciseController(QObject *parent)
m_maxRootNote(0),
m_answerLength(1)
{
+ qmlRegisterInterface<IExerciseController>("IExerciseController");
}
IExerciseController::~IExerciseController()
diff --git a/src/interfaces/iexercisecontroller.h b/src/interfaces/iexercisecontroller.h
index 21afa6e..028077d 100644
--- a/src/interfaces/iexercisecontroller.h
+++ b/src/interfaces/iexercisecontroller.h
@@ -36,6 +36,7 @@ class MINUETINTERFACES_EXPORT IExerciseController : public QObject
Q_OBJECT
Q_PROPERTY(quint8 minRootNote MEMBER m_minRootNote)
Q_PROPERTY(quint8 maxRootNote MEMBER m_maxRootNote)
+ Q_PROPERTY(QJsonArray exercises READ exercises)
Q_PROPERTY(QJsonArray currentExercise MEMBER m_currentExercise)
Q_PROPERTY(quint8 answerLength MEMBER m_answerLength)
Q_PROPERTY(QJsonArray selectedOptions MEMBER m_selectedOptions)
@@ -43,7 +44,7 @@ class MINUETINTERFACES_EXPORT IExerciseController : public QObject
public:
virtual ~IExerciseController() override;
- virtual QJsonObject exercises() const = 0;
+ virtual QJsonArray exercises() const = 0;
public Q_SLOTS:
virtual void randomlySelectOptions() = 0;
diff --git a/src/interfaces/isoundbackend.cpp b/src/interfaces/isoundbackend.cpp
index d73c314..8d6c19c 100644
--- a/src/interfaces/isoundbackend.cpp
+++ b/src/interfaces/isoundbackend.cpp
@@ -22,6 +22,8 @@
#include "isoundbackend.h"
+#include <QtQml>
+
namespace Minuet
{
@@ -29,6 +31,8 @@ ISoundBackend::ISoundBackend(QObject *parent)
: IPlugin(parent),
m_state(StoppedState)
{
+ qmlRegisterInterface<ISoundBackend>("ISoundBackend");
+ qmlRegisterUncreatableType<ISoundBackend>("org.kde.minuet", 1, 0, "ISoundBackend", \
"ISoundBackend cannot be instantiated"); }
ISoundBackend::~ISoundBackend()
diff --git a/src/plugins/drumsticksoundbackend/CMakeLists.txt \
b/src/plugins/drumsticksoundbackend/CMakeLists.txt index 8893d75..56e69c5 100644
--- a/src/plugins/drumsticksoundbackend/CMakeLists.txt
+++ b/src/plugins/drumsticksoundbackend/CMakeLists.txt
@@ -14,6 +14,7 @@ target_link_libraries(minuetdrumsticksoundbackend
drumstick-alsa
drumstick-file
Minuet::Interfaces
+ KF5::CoreAddons
)
install(TARGETS minuetdrumsticksoundbackend DESTINATION ${PLUGIN_INSTALL_DIR}/minuet/)
diff --git a/src/plugins/drumsticksoundbackend/drumsticksoundbackend.cpp \
b/src/plugins/drumsticksoundbackend/drumsticksoundbackend.cpp index 62adc89..6c19926 100644
--- a/src/plugins/drumsticksoundbackend/drumsticksoundbackend.cpp
+++ b/src/plugins/drumsticksoundbackend/drumsticksoundbackend.cpp
@@ -23,6 +23,7 @@
#include "drumsticksoundbackend.h"
#include <QtMath>
+#include <QTime>
#include <QJsonObject>
#include <drumstick/alsaqueue.h>
@@ -84,7 +85,11 @@ DrumstickSoundBackend::DrumstickSoundBackend(QObject *parent)
connect(m_midiSequencerOutputThread, &MidiSequencerOutputThread::stopped, this, \
&DrumstickSoundBackend::outputThreadStopped);
connect(m_midiSequencerOutputThread, &MidiSequencerOutputThread::finished, this, [=]() {
setPlaybackLabel(QStringLiteral("00:00.00"));
+ setState(StoppedState);
});
+
+ startTimidity();
+ m_outputPort->subscribeTo("TiMidity:0");
}
DrumstickSoundBackend::~DrumstickSoundBackend()
@@ -235,4 +240,55 @@ void DrumstickSoundBackend::appendEvent(drumstick::SequencerEvent *ev, \
unsigned m_tick = tick;
}
+void DrumstickSoundBackend::startTimidity()
+{
+ QString error;
+ if (!availableOutputPorts().contains(QStringLiteral("TiMidity:0"))) {
+// qCDebug(MINUET) << "Starting TiMidity++ at" << \
MinuetSettings::timidityLocation().remove(QStringLiteral("file://")); +// \
m_timidityProcess.setProgram(MinuetSettings::timidityLocation().remove(QStringLiteral("file://")), \
QStringList() << MinuetSettings::timidityParameters()); + \
m_timidityProcess.setProgram("/usr/bin/timidity", QStringList() << "-iA"); + \
m_timidityProcess.start(); + if (!m_timidityProcess.waitForStarted(-1)) {
+ error = m_timidityProcess.errorString();
+ }
+ else {
+ if (!waitForTimidityOutputPorts(3000))
+// error = i18n("error when waiting for TiMidity++ output ports!");
+ error = "error when waiting for TiMidity++ output ports!";
+ else
+ qCDebug(MINUET) << "TiMidity++ started!";
+ }
+ }
+ else {
+ qCDebug(MINUET) << "TiMidity++ already running!";
+ }
+// if (!error.isEmpty())
+// KMessageBox::error(this,
+// i18n("There was an error when starting TiMidity++: \"%1\". "
+// "Is another application using the audio system? "
+// "Also, please check Minuet settings!", error),
+// i18n("Minuet startup"));
+}
+
+bool DrumstickSoundBackend::waitForTimidityOutputPorts(int msecs)
+{
+ QTime time;
+ time.start();
+ while (!availableOutputPorts().contains(QStringLiteral("TiMidity:0")))
+ if (msecs != -1 && time.elapsed() > msecs)
+ return false;
+ return true;
+}
+
+QStringList DrumstickSoundBackend::availableOutputPorts() const
+{
+ QStringList availableOutputPorts;
+ QListIterator<drumstick::PortInfo> it(m_client->getAvailableOutputs());
+ while(it.hasNext()) {
+ drumstick::PortInfo p = it.next();
+ availableOutputPorts << \
QStringLiteral("%1:%2").arg(p.getClientName()).arg(p.getPort()); + }
+ return availableOutputPorts;
+}
+
#include "moc_drumsticksoundbackend.cpp"
diff --git a/src/plugins/drumsticksoundbackend/drumsticksoundbackend.h \
b/src/plugins/drumsticksoundbackend/drumsticksoundbackend.h index 535870b..7ce1c15 100644
--- a/src/plugins/drumsticksoundbackend/drumsticksoundbackend.h
+++ b/src/plugins/drumsticksoundbackend/drumsticksoundbackend.h
@@ -25,6 +25,13 @@
#include <interfaces/isoundbackend.h>
+#include <QLoggingCategory>
+
+#include <KProcess>
+
+Q_DECLARE_LOGGING_CATEGORY(MINUET)
+Q_LOGGING_CATEGORY(MINUET, "minuet")
+
namespace drumstick {
class MidiClient;
class MidiPort;
@@ -61,6 +68,9 @@ private Q_SLOTS:
private:
void appendEvent(drumstick::SequencerEvent *ev, unsigned long tick);
+ void startTimidity();
+ bool waitForTimidityOutputPorts(int msecs);
+ QStringList availableOutputPorts() const;
drumstick::MidiClient *m_client;
drumstick::MidiPort *m_outputPort;
@@ -72,6 +82,8 @@ private:
drumstick::MidiQueue *m_queue;
int m_queueId;
QScopedPointer<Song> m_song;
+
+ KProcess m_timidityProcess;
};
#endif
diff --git a/src/plugins/drumsticksoundbackend/midisequenceroutputthread.h \
b/src/plugins/drumsticksoundbackend/midisequenceroutputthread.h index 1bdbf31..cd15f50 100644
--- a/src/plugins/drumsticksoundbackend/midisequenceroutputthread.h
+++ b/src/plugins/drumsticksoundbackend/midisequenceroutputthread.h
@@ -53,9 +53,6 @@ public:
void setTempoFactor(float value);
void resetPosition();
-Q_SIGNALS:
- void allNotesoff();
-
private:
void allNotesOff();
void sendControllerEvent(int chan, int control, int value);
diff --git a/src/shell/core.cpp b/src/shell/core.cpp
index 1e49155..dac1d6d 100644
--- a/src/shell/core.cpp
+++ b/src/shell/core.cpp
@@ -47,7 +47,7 @@ bool Core::initialize()
IPluginController *Core::pluginController()
{
- return m_pluginController.data();
+ return m_pluginController;
}
ISoundBackend *Core::soundBackend()
@@ -57,29 +57,34 @@ ISoundBackend *Core::soundBackend()
IExerciseController *Core::exerciseController()
{
- return m_exerciseController.data();
+ return m_exerciseController;
}
IUiController *Core::uiController()
{
- return m_uiController.data();
+ return m_uiController;
}
void Core::setSoundBackend(ISoundBackend *soundBackend)
{
- m_soundBackend = soundBackend;
+ if (m_soundBackend != soundBackend) {
+ m_soundBackend = soundBackend;
+ emit soundBackendChanged(m_soundBackend);
+ }
}
Core::Core(QObject *parent)
: ICore(parent),
- m_pluginController(new PluginController),
- m_soundBackend(0),
- m_exerciseController(new ExerciseController),
- m_uiController(new UiController)
-
+ m_soundBackend(0)
{
- ((PluginController *)m_pluginController.data())->initialize(this);
- ((UiController *)m_uiController.data())->initialize();
+ m_pluginController = new PluginController(this);
+ ((PluginController *)m_pluginController)->initialize(this);
+
+ m_exerciseController = new ExerciseController(this);
+ ((ExerciseController *)m_exerciseController)->initialize(this);
+
+ m_uiController = new UiController(this);
+ ((UiController *)m_uiController)->initialize(this);
}
}
diff --git a/src/shell/core.h b/src/shell/core.h
index 6a7c8fc..535967f 100644
--- a/src/shell/core.h
+++ b/src/shell/core.h
@@ -49,10 +49,10 @@ public:
private:
Core(QObject *parent = 0);
- QScopedPointer<IPluginController> m_pluginController;
+ IPluginController *m_pluginController;
ISoundBackend *m_soundBackend;
- QScopedPointer<IExerciseController> m_exerciseController;
- QScopedPointer<IUiController> m_uiController;
+ IExerciseController *m_exerciseController;
+ IUiController *m_uiController;
};
}
diff --git a/src/shell/exercisecontroller.cpp b/src/shell/exercisecontroller.cpp
index 32afb60..e36df6b 100644
--- a/src/shell/exercisecontroller.cpp
+++ b/src/shell/exercisecontroller.cpp
@@ -38,8 +38,8 @@
namespace Minuet
{
-ExerciseController::ExerciseController(MidiSequencer *midiSequencer) :
- m_midiSequencer(midiSequencer),
+ExerciseController::ExerciseController(QObject *parent) :
+ IExerciseController(parent),
m_chosenRootNote(0)
{
m_exercises["exercises"] = QJsonArray();
@@ -51,7 +51,7 @@ ExerciseController::~ExerciseController()
{
}
-bool ExerciseController::initialize()
+bool ExerciseController::initialize(Core *core)
{
bool definitionsMerge = mergeJsonFiles("definitions", m_definitions);
bool exercisesMerge = mergeJsonFiles("exercises", m_exercises, true, "name", "children");
@@ -98,19 +98,14 @@ unsigned int ExerciseController::chosenRootNote()
return m_chosenRootNote;
}
-void ExerciseController::playChoosenExercise()
-{
- m_midiSequencer->play();
-}
-
QString ExerciseController::errorString() const
{
return m_errorString;
}
-QJsonObject ExerciseController::exercises() const
+QJsonArray ExerciseController::exercises() const
{
- return m_exercises;
+ return m_exercises[QStringLiteral("exercises")].toArray();
}
bool ExerciseController::mergeJsonFiles(const QString directoryName, QJsonObject \
&targetObject, bool applyDefinitionsFlag, QString commonKey, QString mergeKey)
diff --git a/src/shell/exercisecontroller.h b/src/shell/exercisecontroller.h
index d3b12e7..c571180 100644
--- a/src/shell/exercisecontroller.h
+++ b/src/shell/exercisecontroller.h
@@ -34,22 +34,23 @@ class MidiSequencer;
namespace Minuet
{
+
+class Core;
class MINUETSHELL_EXPORT ExerciseController : public IExerciseController
{
Q_OBJECT
public:
- explicit ExerciseController(MidiSequencer *midiSequencer = 0);
+ explicit ExerciseController(QObject *parent= 0);
virtual ~ExerciseController();
- bool initialize();
+ bool initialize(Core *core);
Q_INVOKABLE unsigned int chosenRootNote();
- Q_INVOKABLE void playChoosenExercise();
QString errorString() const;
- virtual QJsonObject exercises() const override;
+ virtual QJsonArray exercises() const override;
public Q_SLOTS:
virtual void randomlySelectOptions();
@@ -64,7 +65,6 @@ private:
void filterDefinitions(QJsonArray &definitions, QJsonObject &exerciseObject, const QString \
&filterTagsKey, DefinitionFilteringMode definitionFilteringMode);
QJsonArray mergeJsonArrays(QJsonArray oldFile, QJsonArray newFile, QString commonKey = "", \
QString mergeKey = "");
- MidiSequencer *m_midiSequencer;
QJsonObject m_exercises;
QJsonObject m_definitions;
unsigned int m_chosenRootNote;
diff --git a/src/shell/midisequencer.cpp b/src/shell/midisequencer.cpp
index 8979f14..67447d3 100644
--- a/src/shell/midisequencer.cpp
+++ b/src/shell/midisequencer.cpp
@@ -47,7 +47,7 @@ MidiSequencer::MidiSequencer(QObject *parent) :
m_state(StoppedState),
m_playMode(ScalePlayMode)
{
- qmlRegisterType<MidiSequencer>("org.kde.minuet", 1, 0, "MidiSequencer");
+ qmlRegisterUncreatableType<MidiSequencer>("org.kde.minuet", 1, 0, "MidiSequencer", \
"MidiSequencer can't be instantiated"); // MidiClient configuration
m_client = new drumstick::MidiClient(this);
try {
diff --git a/src/shell/midisequenceroutputthread.h b/src/shell/midisequenceroutputthread.h
index 1bdbf31..cd15f50 100644
--- a/src/shell/midisequenceroutputthread.h
+++ b/src/shell/midisequenceroutputthread.h
@@ -53,9 +53,6 @@ public:
void setTempoFactor(float value);
void resetPosition();
-Q_SIGNALS:
- void allNotesoff();
-
private:
void allNotesOff();
void sendControllerEvent(int chan, int control, int value);
diff --git a/src/shell/minuetmainwindow.cpp b/src/shell/minuetmainwindow.cpp
index b915d49..e82f63f 100644
--- a/src/shell/minuetmainwindow.cpp
+++ b/src/shell/minuetmainwindow.cpp
@@ -23,7 +23,6 @@
#include "minuetmainwindow.h"
#include "wizard.h"
-#include "midisequencer.h"
#include "exercisecontroller.h"
#include <KActionCollection>
@@ -45,27 +44,16 @@ Q_LOGGING_CATEGORY(MINUET, "minuet")
#include <QToolBar>
-MinuetMainWindow::MinuetMainWindow() :
- KXmlGuiWindow(),
- m_midiSequencer(new MidiSequencer(this)),
- m_exerciseController(new Minuet::ExerciseController(m_midiSequencer)),
+#include "core.h"
+
+MinuetMainWindow::MinuetMainWindow(Minuet::Core *core, QWidget *parent, Qt::WindowFlags f) :
+ KXmlGuiWindow(parent, f),
m_quickView(new QQuickView),
m_initialGroup(KSharedConfig::openConfig(), "version")
{
- if (m_midiSequencer->schedulingMode() == MidiSequencer::DAMAGED) {
- QTimer::singleShot(0, qApp, SLOT(quit()));
- return;
- }
-
- if (!m_exerciseController->initialize())
- KMessageBox::error(this,
- i18n("There was an error when parsing exercises JSON files: \
\"%1\".", m_exerciseController->errorString()),
- i18n("Minuet startup"));
-
QQmlContext *rootContext = m_quickView->engine()->rootContext();
- rootContext->setContextProperty(QStringLiteral("exerciseCategories"), \
m_exerciseController->exercises()[QStringLiteral("exercises")].toArray());
- rootContext->setContextProperty(QStringLiteral("sequencer"), m_midiSequencer);
- rootContext->setContextProperty(QStringLiteral("exerciseController"), \
m_exerciseController); + rootContext->setContextProperty(QStringLiteral("core"), core);
+
m_quickView->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::DataLocation, \
QStringLiteral("qml/Main.qml")))); \
m_quickView->setResizeMode(QQuickView::SizeRootObjectToView); \
setCentralWidget(QWidget::createWindowContainer(m_quickView, this)); @@ -85,66 +73,11 @@ \
MinuetMainWindow::MinuetMainWindow() :
if (!m_initialGroup.exists())
runWizard();
-
- startTimidity();
- subscribeToMidiOutputPort();
-}
-
-void MinuetMainWindow::startTimidity()
-{
- QString error;
- if (!m_midiSequencer->availableOutputPorts().contains(QStringLiteral("TiMidity:0"))) {
- qCDebug(MINUET) << "Starting TiMidity++ at" << \
MinuetSettings::timidityLocation().remove(QStringLiteral("file://"));
- m_timidityProcess.setProgram(MinuetSettings::timidityLocation().remove(QStringLiteral("file://")), \
QStringList() << MinuetSettings::timidityParameters());
- m_timidityProcess.start();
- if (!m_timidityProcess.waitForStarted(-1)) {
- error = m_timidityProcess.errorString();
- }
- else {
- if (!waitForTimidityOutputPorts(3000))
- error = i18n("error when waiting for TiMidity++ output ports!");
- else
- qCDebug(MINUET) << "TiMidity++ started!";
- }
- }
- else {
- qCDebug(MINUET) << "TiMidity++ already running!";
- }
- if (!error.isEmpty())
- KMessageBox::error(this,
- i18n("There was an error when starting TiMidity++: \"%1\". "
- "Is another application using the audio system? "
- "Also, please check Minuet settings!", error),
- i18n("Minuet startup"));
-}
-
-bool MinuetMainWindow::waitForTimidityOutputPorts(int msecs)
-{
- QTime time;
- time.start();
- while (!m_midiSequencer->availableOutputPorts().contains(QStringLiteral("TiMidity:0")))
- if (msecs != -1 && time.elapsed() > msecs)
- return false;
- return true;
-}
-
-void MinuetMainWindow::subscribeToMidiOutputPort()
-{
- QString midiOutputPort = MinuetSettings::midiOutputPort();
- if (!midiOutputPort.isEmpty() && \
m_midiSequencer->availableOutputPorts().contains(midiOutputPort))
- m_midiSequencer->subscribeTo(midiOutputPort);
}
MinuetMainWindow::~MinuetMainWindow()
{
delete m_quickView;
- delete m_exerciseController;
- m_timidityProcess.kill();
- qCDebug(MINUET) << "Stoping TiMidity++!";
- if (!m_timidityProcess.waitForFinished(-1))
- qCDebug(MINUET) << "Error when stoping TiMidity++:" << \
m_timidityProcess.errorString();
- else
- qCDebug(MINUET) << "TiMidity++ stoped!";
}
bool MinuetMainWindow::queryClose()
@@ -153,15 +86,6 @@ bool MinuetMainWindow::queryClose()
return true;
}
-/*
-void MinuetMainWindow::fileOpen()
-{
- QString fileName = QFileDialog::getOpenFileName(this, i18n("Open File")); // \
krazy:exclude=qclasses
- if (!fileName.isEmpty())
- m_midiSequencer->openFile(fileName);
-}
-*/
-
void MinuetMainWindow::runWizard()
{
QScopedPointer<Wizard> w (new Wizard(this));
@@ -180,11 +104,8 @@ void MinuetMainWindow::settingsConfigure()
QWidget *midiSettingsDialog = new QWidget;
m_settingsMidi.setupUi(midiSettingsDialog);
m_settingsMidi.kcfg_midiOutputPort->setVisible(false);
- m_settingsMidi.cboMidiOutputPort->insertItems(0, m_midiSequencer->availableOutputPorts());
m_settingsMidi.cboMidiOutputPort->setCurrentIndex(m_settingsMidi.cboMidiOutputPort->findText(MinuetSettings::midiOutputPort()));
dialog->addPage(midiSettingsDialog, i18n("MIDI"), QStringLiteral("media-playback-start"));
dialog->setAttribute(Qt::WA_DeleteOnClose);
- if (dialog->exec() == QDialog::Accepted)
- subscribeToMidiOutputPort();
delete dialog;
}
diff --git a/src/shell/minuetmainwindow.h b/src/shell/minuetmainwindow.h
index 0e669b3..3f560ef 100644
--- a/src/shell/minuetmainwindow.h
+++ b/src/shell/minuetmainwindow.h
@@ -25,18 +25,16 @@
#include "ui_settingsmidi.h"
#include "minuetsettings.h"
+#include "midisequencer.h"
-#include <KProcess>
#include <KXmlGuiWindow>
#include <QLoggingCategory>
class QQuickView;
-class MidiSequencer;
-
namespace Minuet {
- class ExerciseController;
+ class Core;
}
Q_DECLARE_LOGGING_CATEGORY(MINUET)
@@ -57,7 +55,7 @@ public:
/**
* Default Constructor
*/
- MinuetMainWindow();
+ MinuetMainWindow(Minuet::Core *core, QWidget *parent=0, Qt::WindowFlags \
f=KDE_DEFAULT_WINDOWFLAGS);
/**
* Default Destructor
@@ -67,11 +65,6 @@ public:
protected:
virtual bool queryClose();
-private:
- void startTimidity();
- bool waitForTimidityOutputPorts(int msecs);
- void subscribeToMidiOutputPort();
-
private Q_SLOTS:
/**
* Create a new window
@@ -86,11 +79,8 @@ private Q_SLOTS:
private:
Ui::SettingsMidi m_settingsMidi;
- MidiSequencer *m_midiSequencer;
- Minuet::ExerciseController *m_exerciseController;
QQuickView *m_quickView;
KConfigGroup m_initialGroup;
- KProcess m_timidityProcess;
};
#endif // MINUETMAINWINDOW_H
diff --git a/src/shell/qml/ExerciseView.qml b/src/shell/qml/ExerciseView.qml
index 3272848..1e1203b 100644
--- a/src/shell/qml/ExerciseView.qml
+++ b/src/shell/qml/ExerciseView.qml
@@ -51,12 +51,12 @@ Item {
answerRectangle = answerGrid.children[i]
}
answerRectangle.model.sequence.split(' ').forEach(function(note) {
- answerHoverEnter(0, exerciseController.chosenRootNote() + parseInt(note), 0, \
answerRectangle.color) + answerHoverEnter(0, \
core.exerciseController.chosenRootNote() + parseInt(note), 0, answerRectangle.color) })
animation.start()
}
function itemChanged(model) {
- sequencer.allNotesOff()
+// sequencer.allNotesOff()
clearExerciseGrid()
var length = model.length
answerGrid.columns = Math.min(6, length)
@@ -109,9 +109,9 @@ Item {
text: i18n("new question")
onClicked: {
exerciseView.state = "waitingForAnswer"
- exerciseController.randomlySelectOptions()
- var selectedOptions = exerciseController.selectedOptions
- sequencer.generateSong(selectedOptions)
+ core.exerciseController.randomlySelectOptions()
+ var selectedOptions = core.exerciseController.selectedOptions
+ core.soundBackend.prepareFromExerciseOptions(selectedOptions, "scale")
var newChosenExercises = [];
for (var i = 0; i < selectedOptions.length; ++i)
newChosenExercises.push(selectedOptions[i].name);
@@ -126,8 +126,8 @@ Item {
return i18n("Hear %1 and then choose an answer from options \
below!<br/>Click 'play question' if you want to hear again!", i18nc("technical term, do you \
have a musician friend?", userMessage)) })
if (userMessage != "the rhythm")
- answerHoverEnter(0, exerciseController.chosenRootNote(), 0, "white")
- exerciseController.playChoosenExercise()
+ answerHoverEnter(0, core.exerciseController.chosenRootNote(), 0, \
"white") + core.soundBackend.play()
}
style: MinuetButtonStyle{ labelHorizontalAlignment: Qt.AlignHCenter }
}
@@ -136,7 +136,7 @@ Item {
width: 124; height: 44
text: i18n("play question")
- onClicked: exerciseController.playChoosenExercise()
+ onClicked: core.soundBackend.play()
style: MinuetButtonStyle{ labelHorizontalAlignment: Qt.AlignHCenter }
}
Button {
@@ -210,7 +210,7 @@ Item {
messageText.text = i18n("Congratulations!<br/>You \
answered correctly!") else
messageText.text = i18n("Oops, not this time!<br/>Try \
again!")
- answerHoverExit(0, exerciseController.chosenRootNote() + \
parseInt(model.sequence), 0) + answerHoverExit(0, \
core.exerciseController.chosenRootNote() + parseInt(model.sequence), 0) highlightRightAnswer()
}
else {
@@ -222,7 +222,7 @@ Item {
answerRectangle.color = Qt.darker(answerRectangle.color, 1.1)
if (userMessage != "the rhythm") {
model.sequence.split(' ').forEach(function(note) {
- answerHoverEnter(0, \
exerciseController.chosenRootNote() + parseInt(note), 0, colors[answerRectangle.index]) + \
answerHoverEnter(0, core.exerciseController.chosenRootNote() + parseInt(note), 0, \
colors[answerRectangle.index]) })
}
}
@@ -231,7 +231,7 @@ Item {
if (userMessage != "the rhythm") {
if (!animation.running)
model.sequence.split(' ').forEach(function(note) {
- answerHoverExit(0, \
exerciseController.chosenRootNote() + parseInt(note), 0) + \
answerHoverExit(0, core.exerciseController.chosenRootNote() + parseInt(note), 0) })
}
}
@@ -258,7 +258,7 @@ Item {
name: "waitingForAnswer"
StateChangeScript {
script: {
- sequencer.allNotesOff()
+// sequencer.allNotesOff()
for (var i = 0; i < answerGrid.children.length; ++i) {
answerGrid.children[i].opacity = 1
answerGrid.children[i].enabled = true
diff --git a/src/shell/qml/Main.qml b/src/shell/qml/Main.qml
index cb4a26a..e4e0d80 100644
--- a/src/shell/qml/Main.qml
+++ b/src/shell/qml/Main.qml
@@ -80,42 +80,42 @@ Item {
}
}
Binding {
- target: sequencer
+ target: core.soundBackend
property: "pitch"
value: midiPlayer.pitch
}
Binding {
- target: sequencer
+ target: core.soundBackend
property: "volume"
value: midiPlayer.volume
}
Binding {
- target: sequencer
+ target: core.soundBackend
property: "tempo"
value: midiPlayer.tempo
}
Binding {
target: midiPlayer
property: "playbackLabel"
- value: sequencer.playbackLabel
+ value: core.soundBackend.playbackLabel
}
Binding {
target: midiPlayer
property: "sequencerState"
- value: sequencer.state
+ value: core.soundBackend.state
}
Connections {
target: midiPlayer
- onPlayActivated: sequencer.play()
- onPauseActivated: sequencer.pause()
- onStopActivated: sequencer.stop()
- }
- Connections {
- target: sequencer
- onNoteOn: pianoView.noteOn(chan, pitch, vel)
- onNoteOff: pianoView.noteOff(chan, pitch, vel)
- onAllNotesOff: pianoView.allNotesOff()
- }
+ onPlayActivated: core.soundBackend.play()
+ onPauseActivated: core.soundBackend.pause()
+ onStopActivated: core.soundBackend.stop()
+ }
+// Connections {
+// target: sequencer
+// onNoteOn: pianoView.noteOn(chan, pitch, vel)
+// onNoteOff: pianoView.noteOff(chan, pitch, vel)
+// onAllNotesOff: pianoView.allNotesOff()
+// }
Connections {
target: minuetMenu
onItemChanged: exerciseView.itemChanged(model)
diff --git a/src/shell/qml/MinuetMenu.qml b/src/shell/qml/MinuetMenu.qml
index ab4a728..7c56146 100644
--- a/src/shell/qml/MinuetMenu.qml
+++ b/src/shell/qml/MinuetMenu.qml
@@ -39,7 +39,7 @@ Item {
function itemClicked(delegateRect, index) {
var model = delegateRect.ListView.view.model[index].options
if (model != undefined) {
- exerciseController.currentExercise = model
+ core.exerciseController.currentExercise = model
minuetMenu.itemChanged(model)
}
}
@@ -50,8 +50,8 @@ Item {
width: (stackView.depth > 1) ? 24:0; height: parent.height
iconName: "go-previous"
onClicked: {
- sequencer.allNotesOff()
- sequencer.clearSong()
+// sequencer.allNotesOff()
+// sequencer.clearSong()
minuetMenu.breadcrumbPressed()
selectedMenuItem = null
stackView.pop()
@@ -92,17 +92,17 @@ Item {
stackView.push(categoryMenu.createObject(stackView, {model: \
children}))
var root = delegateRect.ListView.view.model[index].root
if (root != undefined) {
- exerciseController.minRootNote = parseInt(root.split('.')[0])
- exerciseController.maxRootNote = parseInt(root.split('.')[2])
+ core.exerciseController.minRootNote = parseInt(root.split('.')[0])
+ core.exerciseController.maxRootNote = parseInt(root.split('.')[2])
}
var playMode = delegateRect.ListView.view.model[index].playMode
if (playMode != undefined) {
- if (playMode == "scale") sequencer.setPlayMode(0) // ScalePlayMode
- if (playMode == "chord") sequencer.setPlayMode(1) // ChordPlayMode
- exerciseController.answerLength = 1
+// if (playMode == "scale") sequencer.setPlayMode(0) // \
ScalePlayMode +// if (playMode == "chord") sequencer.setPlayMode(1) \
// ChordPlayMode + core.exerciseController.answerLength = 1
if (playMode == "rhythm") {
- exerciseController.setPlayMode(2) // RhythmPlayMode
- exerciseController.answerLength = 4
+ core.exerciseController.setPlayMode(2) // RhythmPlayMode
+ core.exerciseController.answerLength = 4
}
}
}
@@ -128,6 +128,6 @@ Item {
}
}
- Component.onCompleted: { stackView.push(categoryMenu.createObject(stackView, {model: \
exerciseCategories})) } + Component.onCompleted: { \
stackView.push(categoryMenu.createObject(stackView, {model: \
core.exerciseController.exercises})) } }
}
diff --git a/src/shell/qml/midiplayer/MidiPlayer.qml b/src/shell/qml/midiplayer/MidiPlayer.qml
index f466c62..16b5af3 100644
--- a/src/shell/qml/midiplayer/MidiPlayer.qml
+++ b/src/shell/qml/midiplayer/MidiPlayer.qml
@@ -89,10 +89,10 @@ Rectangle {
width: playbackLabelText.contentWidth / 2
anchors.horizontalCenterOffset: -30
anchors { top: playbackLabelText.bottom; horizontalCenter: \
playbackLabelText.horizontalCenter }
- text: (sequencerState != MidiSequencer.PlayingState) ? i18n("Play"):i18n("Pause")
- source: (sequencerState != MidiSequencer.PlayingState) ? \
"../images/multimedia-play.png":"../images/multimedia-pause.png" + text: \
(sequencerState != ISoundBackend.PlayingState) ? i18n("Play"):i18n("Pause") + \
source: (sequencerState != ISoundBackend.PlayingState) ? \
"../images/multimedia-play.png":"../images/multimedia-pause.png" onActivated: {
- if (sequencerState == MidiSequencer.StoppedState || sequencerState == \
MidiSequencer.PausedState) + if (sequencerState == ISoundBackend.StoppedState || \
sequencerState == MidiSequencer.PausedState) playActivated()
else
pauseActivated()
diff --git a/src/shell/uicontroller.cpp b/src/shell/uicontroller.cpp
index 2a61955..1a09f93 100644
--- a/src/shell/uicontroller.cpp
+++ b/src/shell/uicontroller.cpp
@@ -22,12 +22,14 @@
#include "uicontroller.h"
+#include "core.h"
+
namespace Minuet
{
UiController::UiController(QObject *parent)
: IUiController(parent),
- m_mainWindow(new MinuetMainWindow)
+ m_mainWindow(new MinuetMainWindow(qobject_cast<Core *>(parent)))
{
}
@@ -35,7 +37,7 @@ UiController::~UiController()
{
}
-bool UiController::initialize()
+bool UiController::initialize(Core *core)
{
m_mainWindow->show();
return true;
diff --git a/src/shell/uicontroller.h b/src/shell/uicontroller.h
index 00df223..0cd2163 100644
--- a/src/shell/uicontroller.h
+++ b/src/shell/uicontroller.h
@@ -32,6 +32,8 @@
namespace Minuet
{
+class Core;
+
class MINUETSHELL_EXPORT UiController : public IUiController
{
Q_OBJECT
@@ -40,7 +42,7 @@ public:
UiController(QObject *parent = 0);
~UiController() override;
- bool initialize();
+ bool initialize(Core *core);
private:
QScopedPointer<MinuetMainWindow> m_mainWindow;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic