From kde-commits Thu Jun 30 21:44:27 2016 From: Sandro S. Andrade Date: Thu, 30 Jun 2016 21:44:27 +0000 To: kde-commits Subject: [minuet/refactoring] src: Move drumstick code to soundbackend plugin Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=146732308110445 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 sound= BackendChanged); Q_PROPERTY(IExerciseController * exerciseController READ exerciseContr= oller); Q_PROPERTY(IUiController * uiController READ uiController); = @@ -54,6 +54,9 @@ public: virtual Minuet::IExerciseController *exerciseController() =3D 0; virtual Minuet::IUiController *uiController() =3D 0; = +Q_SIGNALS: + void soundBackendChanged(ISoundBackend *newSoundBackend); + protected: explicit ICore(QObject *parent =3D 0); static ICore *m_self; diff --git a/src/interfaces/iexercisecontroller.cpp b/src/interfaces/iexerc= isecontroller.cpp index 5cf6691..7a81f4e 100644 --- a/src/interfaces/iexercisecontroller.cpp +++ b/src/interfaces/iexercisecontroller.cpp @@ -22,6 +22,8 @@ = #include "iexercisecontroller.h" = +#include + namespace Minuet { = @@ -31,6 +33,7 @@ IExerciseController::IExerciseController(QObject *parent) m_maxRootNote(0), m_answerLength(1) { + qmlRegisterInterface("IExerciseController"); } = IExerciseController::~IExerciseController() diff --git a/src/interfaces/iexercisecontroller.h b/src/interfaces/iexercis= econtroller.h index 21afa6e..028077d 100644 --- a/src/interfaces/iexercisecontroller.h +++ b/src/interfaces/iexercisecontroller.h @@ -36,6 +36,7 @@ class MINUETINTERFACES_EXPORT IExerciseController : publi= c 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 : publi= c QObject public: virtual ~IExerciseController() override; = - virtual QJsonObject exercises() const =3D 0; + virtual QJsonArray exercises() const =3D 0; = public Q_SLOTS: virtual void randomlySelectOptions() =3D 0; diff --git a/src/interfaces/isoundbackend.cpp b/src/interfaces/isoundbacken= d.cpp index d73c314..8d6c19c 100644 --- a/src/interfaces/isoundbackend.cpp +++ b/src/interfaces/isoundbackend.cpp @@ -22,6 +22,8 @@ = #include "isoundbackend.h" = +#include + namespace Minuet { = @@ -29,6 +31,8 @@ ISoundBackend::ISoundBackend(QObject *parent) : IPlugin(parent), m_state(StoppedState) { + qmlRegisterInterface("ISoundBackend"); + qmlRegisterUncreatableType("org.kde.minuet", 1, 0, "ISo= undBackend", "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_D= IR}/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 +#include #include = #include @@ -84,7 +85,11 @@ DrumstickSoundBackend::DrumstickSoundBackend(QObject *pa= rent) connect(m_midiSequencerOutputThread, &MidiSequencerOutputThread::stopp= ed, this, &DrumstickSoundBackend::outputThreadStopped); connect(m_midiSequencerOutputThread, &MidiSequencerOutputThread::finis= hed, this, [=3D]() { setPlaybackLabel(QStringLiteral("00:00.00")); + setState(StoppedState); }); + + startTimidity(); + m_outputPort->subscribeTo("TiMidity:0"); } = DrumstickSoundBackend::~DrumstickSoundBackend() @@ -235,4 +240,55 @@ void DrumstickSoundBackend::appendEvent(drumstick::Seq= uencerEvent *ev, unsigned m_tick =3D tick; } = +void DrumstickSoundBackend::startTimidity() +{ + QString error; + if (!availableOutputPorts().contains(QStringLiteral("TiMidity:0"))) { +// qCDebug(MINUET) << "Starting TiMidity++ at" << MinuetSettings::t= imidityLocation().remove(QStringLiteral("file://")); +// m_timidityProcess.setProgram(MinuetSettings::timidityLocation().= remove(QStringLiteral("file://")), QStringList() << MinuetSettings::timidit= yParameters()); + m_timidityProcess.setProgram("/usr/bin/timidity", QStringList() <<= "-iA"); + m_timidityProcess.start(); + if (!m_timidityProcess.waitForStarted(-1)) { + error =3D m_timidityProcess.errorString(); + } + else { + if (!waitForTimidityOutputPorts(3000)) +// error =3D i18n("error when waiting for TiMidity++ output= ports!"); + error =3D "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 TiMidi= ty++: \"%1\". " +// "Is another application using the audio = system? " +// "Also, please check Minuet settings!", e= rror), +// i18n("Minuet startup")); +} + +bool DrumstickSoundBackend::waitForTimidityOutputPorts(int msecs) +{ + QTime time; + time.start(); + while (!availableOutputPorts().contains(QStringLiteral("TiMidity:0"))) + if (msecs !=3D -1 && time.elapsed() > msecs) + return false; + return true; +} + +QStringList DrumstickSoundBackend::availableOutputPorts() const +{ + QStringList availableOutputPorts; + QListIterator it(m_client->getAvailableOutputs()); + while(it.hasNext()) { + drumstick::PortInfo p =3D it.next(); + availableOutputPorts << QStringLiteral("%1:%2").arg(p.getClientNam= e()).arg(p.getPort()); + } + return availableOutputPorts; +} + #include "moc_drumsticksoundbackend.cpp" diff --git a/src/plugins/drumsticksoundbackend/drumsticksoundbackend.h b/sr= c/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 = +#include + +#include + +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 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 =3D soundBackend; + if (m_soundBackend !=3D soundBackend) { + m_soundBackend =3D 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 =3D new PluginController(this); + ((PluginController *)m_pluginController)->initialize(this); + + m_exerciseController =3D new ExerciseController(this); + ((ExerciseController *)m_exerciseController)->initialize(this); + + m_uiController =3D 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 =3D 0); = - QScopedPointer m_pluginController; + IPluginController *m_pluginController; ISoundBackend *m_soundBackend; - QScopedPointer m_exerciseController; - QScopedPointer m_uiController; + IExerciseController *m_exerciseController; + IUiController *m_uiController; }; = } diff --git a/src/shell/exercisecontroller.cpp b/src/shell/exercisecontrolle= r.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"] =3D QJsonArray(); @@ -51,7 +51,7 @@ ExerciseController::~ExerciseController() { } = -bool ExerciseController::initialize() +bool ExerciseController::initialize(Core *core) { bool definitionsMerge =3D mergeJsonFiles("definitions", m_definitions); bool exercisesMerge =3D 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, QJson= Object &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 =3D 0); + explicit ExerciseController(QObject *parent=3D 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 &exerciseO= bject, const QString &filterTagsKey, DefinitionFilteringMode definitionFilt= eringMode); QJsonArray mergeJsonArrays(QJsonArray oldFile, QJsonArray newFile, QSt= ring commonKey =3D "", QString mergeKey =3D ""); = - 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("org.kde.minuet", 1, 0, "MidiSequencer"= ); + qmlRegisterUncreatableType("org.kde.minuet", 1, 0, "Mid= iSequencer", "MidiSequencer can't be instantiated"); // MidiClient configuration m_client =3D new drumstick::MidiClient(this); try { diff --git a/src/shell/midisequenceroutputthread.h b/src/shell/midisequence= routputthread.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 @@ -45,27 +44,16 @@ Q_LOGGING_CATEGORY(MINUET, "minuet") = #include = -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() =3D=3D 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 =3D m_quickView->engine()->rootContext(); - rootContext->setContextProperty(QStringLiteral("exerciseCategories"), = m_exerciseController->exercises()[QStringLiteral("exercises")].toArray()); - rootContext->setContextProperty(QStringLiteral("sequencer"), m_midiSeq= uencer); - rootContext->setContextProperty(QStringLiteral("exerciseController"), = m_exerciseController); + rootContext->setContextProperty(QStringLiteral("core"), core); + m_quickView->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QSta= ndardPaths::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::timidityLo= cation().remove(QStringLiteral("file://")); - m_timidityProcess.setProgram(MinuetSettings::timidityLocation().remove(QS= tringLiteral("file://")), QStringList() << MinuetSettings::timidityParamete= rs()); - m_timidityProcess.start(); - if (!m_timidityProcess.waitForStarted(-1)) { - error =3D m_timidityProcess.errorString(); - } - else { - if (!waitForTimidityOutputPorts(3000)) - error =3D 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 sy= stem? " - "Also, please check Minuet settings!", err= or), - i18n("Minuet startup")); -} - -bool MinuetMainWindow::waitForTimidityOutputPorts(int msecs) -{ - QTime time; - time.start(); - while (!m_midiSequencer->availableOutputPorts().contains(QStringLitera= l("TiMidity:0"))) - if (msecs !=3D -1 && time.elapsed() > msecs) - return false; - return true; -} - -void MinuetMainWindow::subscribeToMidiOutputPort() -{ - QString midiOutputPort =3D 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_timidityP= rocess.errorString(); - else - qCDebug(MINUET) << "TiMidity++ stoped!"; } = bool MinuetMainWindow::queryClose() @@ -153,15 +86,6 @@ bool MinuetMainWindow::queryClose() return true; } = -/* -void MinuetMainWindow::fileOpen() -{ - QString fileName =3D QFileDialog::getOpenFileName(this, i18n("Open Fil= e")); // krazy:exclude=3Dqclasses - if (!fileName.isEmpty()) - m_midiSequencer->openFile(fileName); -} -*/ - void MinuetMainWindow::runWizard() { QScopedPointer w (new Wizard(this)); @@ -180,11 +104,8 @@ void MinuetMainWindow::settingsConfigure() QWidget *midiSettingsDialog =3D new QWidget; m_settingsMidi.setupUi(midiSettingsDialog); m_settingsMidi.kcfg_midiOutputPort->setVisible(false); - m_settingsMidi.cboMidiOutputPort->insertItems(0, m_midiSequencer->avai= lableOutputPorts()); m_settingsMidi.cboMidiOutputPort->setCurrentIndex(m_settingsMidi.cboMi= diOutputPort->findText(MinuetSettings::midiOutputPort())); dialog->addPage(midiSettingsDialog, i18n("MIDI"), QStringLiteral("medi= a-playback-start")); dialog->setAttribute(Qt::WA_DeleteOnClose); - if (dialog->exec() =3D=3D 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 #include = #include = 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=3D0, Qt::WindowFl= ags f=3DKDE_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 =3D answerGrid.children[i] } answerRectangle.model.sequence.split(' ').forEach(function(note) { - answerHoverEnter(0, exerciseController.chosenRootNote() + pars= eInt(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 =3D model.length answerGrid.columns =3D Math.min(6, length) @@ -109,9 +109,9 @@ Item { text: i18n("new question") onClicked: { exerciseView.state =3D "waitingForAnswer" - exerciseController.randomlySelectOptions() - var selectedOptions =3D exerciseController.selectedOpt= ions - sequencer.generateSong(selectedOptions) + core.exerciseController.randomlySelectOptions() + var selectedOptions =3D core.exerciseController.select= edOptions + core.soundBackend.prepareFromExerciseOptions(selectedO= ptions, "scale") var newChosenExercises =3D []; for (var i =3D 0; i < selectedOptions.length; ++i) newChosenExercises.push(selectedOptions[i].name); @@ -126,8 +126,8 @@ Item { return i18n("Hear %1 and then choose an answer fro= m options below!
Click 'play question' if you want to hear again!", i18= nc("technical term, do you have a musician friend?", userMessage)) }) if (userMessage !=3D "the rhythm") - answerHoverEnter(0, exerciseController.chosenRootN= ote(), 0, "white") - exerciseController.playChoosenExercise() + answerHoverEnter(0, core.exerciseController.chosen= RootNote(), 0, "white") + core.soundBackend.play() } style: MinuetButtonStyle{ labelHorizontalAlignment: Qt.Ali= gnHCenter } } @@ -136,7 +136,7 @@ Item { = width: 124; height: 44 text: i18n("play question") - onClicked: exerciseController.playChoosenExercise() + onClicked: core.soundBackend.play() style: MinuetButtonStyle{ labelHorizontalAlignment: Qt.Ali= gnHCenter } } Button { @@ -210,7 +210,7 @@ Item { messageText.text =3D i18n("Congrat= ulations!
You answered correctly!") else messageText.text =3D i18n("Oops, n= ot this time!
Try again!") - answerHoverExit(0, exerciseController.= chosenRootNote() + parseInt(model.sequence), 0) + answerHoverExit(0, core.exerciseContro= ller.chosenRootNote() + parseInt(model.sequence), 0) highlightRightAnswer() } else { @@ -222,7 +222,7 @@ Item { answerRectangle.color =3D Qt.darker(answer= Rectangle.color, 1.1) if (userMessage !=3D "the rhythm") { model.sequence.split(' ').forEach(func= tion(note) { - answerHoverEnter(0, exerciseContro= ller.chosenRootNote() + parseInt(note), 0, colors[answerRectangle.index]) + answerHoverEnter(0, core.exerciseC= ontroller.chosenRootNote() + parseInt(note), 0, colors[answerRectangle.inde= x]) }) } } @@ -231,7 +231,7 @@ Item { if (userMessage !=3D "the rhythm") { if (!animation.running) model.sequence.split(' ').forEach(= function(note) { - answerHoverExit(0, exerciseCon= troller.chosenRootNote() + parseInt(note), 0) + answerHoverExit(0, core.exerci= seController.chosenRootNote() + parseInt(note), 0) }) } } @@ -258,7 +258,7 @@ Item { name: "waitingForAnswer" StateChangeScript { script: { - sequencer.allNotesOff() +// sequencer.allNotesOff() for (var i =3D 0; i < answerGrid.children.length; ++i)= { answerGrid.children[i].opacity =3D 1 answerGrid.children[i].enabled =3D 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 =3D delegateRect.ListView.view.model[index].options if (model !=3D undefined) { - exerciseController.currentExercise =3D model + core.exerciseController.currentExercise =3D 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 =3D null stackView.pop() @@ -92,17 +92,17 @@ Item { stackView.push(categoryMenu.createObject(stackView= , {model: children})) var root =3D delegateRect.ListView.view.model[inde= x].root if (root !=3D undefined) { - exerciseController.minRootNote =3D parseInt(ro= ot.split('.')[0]) - exerciseController.maxRootNote =3D parseInt(ro= ot.split('.')[2]) + core.exerciseController.minRootNote =3D parseI= nt(root.split('.')[0]) + core.exerciseController.maxRootNote =3D parseI= nt(root.split('.')[2]) } var playMode =3D delegateRect.ListView.view.model[= index].playMode if (playMode !=3D undefined) { - if (playMode =3D=3D "scale") sequencer.setPlay= Mode(0) // ScalePlayMode - if (playMode =3D=3D "chord") sequencer.setPlay= Mode(1) // ChordPlayMode - exerciseController.answerLength =3D 1 +// if (playMode =3D=3D "scale") sequencer.setPl= ayMode(0) // ScalePlayMode +// if (playMode =3D=3D "chord") sequencer.setPl= ayMode(1) // ChordPlayMode + core.exerciseController.answerLength =3D 1 if (playMode =3D=3D "rhythm") { - exerciseController.setPlayMode(2) // Rhyth= mPlayMode - exerciseController.answerLength =3D 4 + core.exerciseController.setPlayMode(2) // = RhythmPlayMode + core.exerciseController.answerLength =3D 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/midipl= ayer/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: pla= ybackLabelText.horizontalCenter } - text: (sequencerState !=3D MidiSequencer.PlayingState) ? i18n(= "Play"):i18n("Pause") - source: (sequencerState !=3D MidiSequencer.PlayingState) ? "..= /images/multimedia-play.png":"../images/multimedia-pause.png" + text: (sequencerState !=3D ISoundBackend.PlayingState) ? i18n(= "Play"):i18n("Pause") + source: (sequencerState !=3D ISoundBackend.PlayingState) ? "..= /images/multimedia-play.png":"../images/multimedia-pause.png" onActivated: { - if (sequencerState =3D=3D MidiSequencer.StoppedState || se= quencerState =3D=3D MidiSequencer.PausedState) + if (sequencerState =3D=3D ISoundBackend.StoppedState || se= quencerState =3D=3D 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(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 =3D 0); ~UiController() override; = - bool initialize(); + bool initialize(Core *core); = private: QScopedPointer m_mainWindow;