diff --git a/drummachinesettings.cpp b/drummachinesettings.cpp index ed88960..1e8dd83 100644 --- a/drummachinesettings.cpp +++ b/drummachinesettings.cpp @@ -1,5 +1,45 @@ #include "drummachinesettings.h" +QString DrumMachineSettings::lastAudioDevice() const +{ + return value("lastAudioDevice").toString(); +} + +void DrumMachineSettings::setLastAudioDevice(const QString &lastAudioDevice) +{ + setValue("lastAudioDevice", lastAudioDevice); +} + +unsigned int DrumMachineSettings::framesPerBuffer() const +{ + return value("framesPerBuffer", 32).toUInt(); +} + +void DrumMachineSettings::setFramesPerBuffer(unsigned int framesPerBuffer) +{ + setValue("framesPerBuffer", framesPerBuffer); +} + +QString DrumMachineSettings::lastMidiInDevice() const +{ + return value("lastMidiInDevice").toString(); +} + +void DrumMachineSettings::setLastMidiInDevice(const QString &lastMidiInDevice) +{ + setValue("lastMidiInDevice", lastMidiInDevice); +} + +QString DrumMachineSettings::lastMidiOutDevice() const +{ + return value("lastMidiOutDevice").toString(); +} + +void DrumMachineSettings::setLastMidiOutDevice(const QString &lastMidiOutDevice) +{ + setValue("lastMidiOutDevice", lastMidiOutDevice); +} + quint8 DrumMachineSettings::padChannel(quint8 pad) const { return value(QString{"pad%0/channel"}.arg(pad)).toUInt(); diff --git a/drummachinesettings.h b/drummachinesettings.h index 5ac8ade..e4f82ef 100644 --- a/drummachinesettings.h +++ b/drummachinesettings.h @@ -7,6 +7,18 @@ class DrumMachineSettings : public QSettings public: using QSettings::QSettings; + QString lastAudioDevice() const; + void setLastAudioDevice(const QString &lastAudioDevice); + + unsigned int framesPerBuffer() const; + void setFramesPerBuffer(unsigned int framesPerBuffer); + + QString lastMidiInDevice() const; + void setLastMidiInDevice(const QString &lastMidiInDevice); + + QString lastMidiOutDevice() const; + void setLastMidiOutDevice(const QString &lastMidiOutDevice); + quint8 padChannel(quint8 pad) const; void setPadChannel(quint8 pad, quint8 channel); diff --git a/mainwindow.cpp b/mainwindow.cpp index 91fb165..09338c1 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -53,56 +53,40 @@ MainWindow::MainWindow(QWidget *parent) : m_ui->drumPadWidget->injectDecodingThread(m_decoderThread); m_ui->djWidget->injectDecodingThread(m_decoderThread); - updateMidiInDevices(); + updateAudioDevices(); + connect(m_ui->pushButtonRefreshAudioDevices, &QAbstractButton::pressed, this, &MainWindow::updateAudioDevices); + if (const auto &lastAudioDevice = m_settings.lastAudioDevice(); !lastAudioDevice.isEmpty()) + { + if (const auto index = m_ui->comboBoxAudioDevice->findText(lastAudioDevice); index >= 0) + m_ui->comboBoxAudioDevice->setCurrentIndex(index); + else + goto paDefault; + } + else + { +paDefault: + m_ui->comboBoxAudioDevice->setCurrentIndex(Pa_GetDefaultOutputDevice()); + } + m_ui->spinBoxBufferSize->setValue(m_settings.framesPerBuffer()); + connect(m_ui->pushButtonAudioDevice, &QAbstractButton::pressed, this, &MainWindow::openAudioDevice); + + updateMidiInDevices(); + connect(m_ui->pushButtonRefreshMidiIn, &QAbstractButton::pressed, this, &MainWindow::updateMidiInDevices); + if (const auto &lastMidiInDevice = m_settings.lastMidiInDevice(); !lastMidiInDevice.isEmpty()) + { + if (const auto index = m_ui->comboBoxMidiIn->findText(lastMidiInDevice); index >= 0) + m_ui->comboBoxMidiIn->setCurrentIndex(index); + } + connect(m_ui->pushButtonMidiIn, &QAbstractButton::pressed, this, &MainWindow::openMidiInDevice); updateMidiOutDevices(); - - connect(m_ui->pushButtonRefreshMidiIn, &QAbstractButton::pressed, this, &MainWindow::updateMidiInDevices); - connect(m_ui->pushButtonRefreshMidiOut, &QAbstractButton::pressed, this, &MainWindow::updateMidiOutDevices); - - connect(m_ui->pushButtonMidiIn, &QAbstractButton::pressed, this, [this](){ - if (m_midiIn.isPortOpen()) - m_midiIn.closePort(); - else - { - const auto index = m_ui->comboBoxMidiIn->currentIndex(); - if (index != -1) - m_midiIn.openPort(index, "Input"); - } - - m_ui->comboBoxMidiIn->setDisabled(m_midiIn.isPortOpen()); - m_ui->pushButtonMidiIn->setText(m_midiIn.isPortOpen() ? tr("Close") : tr("Open")); - }); - - connect(m_ui->pushButtonMidiOut, &QAbstractButton::pressed, this, [this](){ - if (m_midiOut.isPortOpen()) - { - qDebug() << "closing port"; - unsendColors(m_ui->tabWidget->currentIndex()); - m_midiOut.closePort(); - } - else - { - const auto index = m_ui->comboBoxMidiOut->currentIndex(); - if (index != -1) - { - m_midiOut.openPort(index, "Output"); - sendColors(m_ui->tabWidget->currentIndex()); - } - } - - m_ui->comboBoxMidiOut->setDisabled(m_midiOut.isPortOpen()); - m_ui->pushButtonMidiOut->setText(m_midiOut.isPortOpen() ? tr("Close") : tr("Open")); - }); - - updateAudioDevices(); - - connect(m_ui->pushButtonRefreshAudioDevices, &QAbstractButton::pressed, this, &MainWindow::updateAudioDevices); - - m_ui->comboBoxAudioDevice->setCurrentIndex(Pa_GetDefaultOutputDevice()); - - connect(m_ui->pushButtonAudioDevice, &QAbstractButton::pressed, this, &MainWindow::openAudioDevice); + if (const auto &lastMidiOutDevice = m_settings.lastMidiOutDevice(); !lastMidiOutDevice.isEmpty()) + { + if (const auto index = m_ui->comboBoxMidiOut->findText(lastMidiOutDevice); index >= 0) + m_ui->comboBoxMidiOut->setCurrentIndex(index); + } + connect(m_ui->pushButtonMidiOut, &QAbstractButton::pressed, this, &MainWindow::openMidiOutDevice); loadSettings(); @@ -191,9 +175,51 @@ void MainWindow::openAudioDevice() m_ui->comboBoxAudioDevice->setEnabled(false); m_ui->spinBoxBufferSize->setEnabled(false); m_ui->pushButtonAudioDevice->setText(tr("Close")); + + m_settings.setLastAudioDevice(m_ui->comboBoxAudioDevice->currentText()); + m_settings.setFramesPerBuffer(m_ui->spinBoxBufferSize->value()); } } +void MainWindow::openMidiInDevice() +{ + if (m_midiIn.isPortOpen()) + m_midiIn.closePort(); + else + { + const auto index = m_ui->comboBoxMidiIn->currentIndex(); + if (index != -1) + m_midiIn.openPort(index, "Input"); + m_settings.setLastMidiInDevice(m_ui->comboBoxMidiIn->currentText()); + } + + m_ui->comboBoxMidiIn->setDisabled(m_midiIn.isPortOpen()); + m_ui->pushButtonMidiIn->setText(m_midiIn.isPortOpen() ? tr("Close") : tr("Open")); +} + +void MainWindow::openMidiOutDevice() +{ + if (m_midiOut.isPortOpen()) + { + qDebug() << "closing port"; + unsendColors(m_ui->tabWidget->currentIndex()); + m_midiOut.closePort(); + } + else + { + const auto index = m_ui->comboBoxMidiOut->currentIndex(); + if (index != -1) + { + m_midiOut.openPort(index, "Output"); + m_settings.setLastMidiOutDevice(m_ui->comboBoxMidiOut->currentText()); + sendColors(m_ui->tabWidget->currentIndex()); + } + } + + m_ui->comboBoxMidiOut->setDisabled(m_midiOut.isPortOpen()); + m_ui->pushButtonMidiOut->setText(m_midiOut.isPortOpen() ? tr("Close") : tr("Open")); +} + void MainWindow::messageReceived(const midi::MidiMessage &message) { m_ui->statusbar->showMessage(tr("Received midi message: flag: %0 cmd: %1 channel: %2 note: %3 velocity: %4") @@ -221,6 +247,19 @@ void MainWindow::currentChanged(int index) sendColors(index); } +void MainWindow::updateAudioDevices() +{ + m_ui->comboBoxAudioDevice->clear(); + + const auto count = Pa_GetDeviceCount(); + + for (PaDeviceIndex i = 0; i < count; i++) + { + const auto info = Pa_GetDeviceInfo(i); + m_ui->comboBoxAudioDevice->addItem(info->name); + } +} + void MainWindow::updateMidiInDevices() { m_ui->comboBoxMidiIn->clear(); @@ -241,19 +280,6 @@ void MainWindow::updateMidiOutDevices() m_ui->pushButtonMidiOut->setEnabled(m_ui->comboBoxMidiOut->count() > 0); } -void MainWindow::updateAudioDevices() -{ - m_ui->comboBoxAudioDevice->clear(); - - const auto count = Pa_GetDeviceCount(); - - for (PaDeviceIndex i = 0; i < count; i++) - { - const auto info = Pa_GetDeviceInfo(i); - m_ui->comboBoxAudioDevice->addItem(info->name); - } -} - void MainWindow::loadSettings() { m_ui->drumPadWidget->loadSettings(m_settings); diff --git a/mainwindow.h b/mainwindow.h index 27cd9e8..daa49b6 100755 --- a/mainwindow.h +++ b/mainwindow.h @@ -30,14 +30,16 @@ public: private slots: void openAudioDevice(); + void openMidiInDevice(); + void openMidiOutDevice(); void messageReceived(const midi::MidiMessage &message); void sendMidi(const midi::MidiMessage &midiMsg); void currentChanged(int index); private: + void updateAudioDevices(); void updateMidiInDevices(); void updateMidiOutDevices(); - void updateAudioDevices(); void loadSettings(); void unsendColors(int index); void sendColors(int index); diff --git a/mainwindow.ui b/mainwindow.ui index 5ece7c0..de5184b 100755 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -30,9 +30,9 @@ - + - <b>UltraDj</b> + <b>DrumMachine</b>