Remember last selected audio and midi devices

This commit is contained in:
2022-12-26 11:49:35 +01:00
parent 6d6c029608
commit 9a71bf9dd3
5 changed files with 143 additions and 63 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -30,9 +30,9 @@
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="labelUltraDj">
<widget class="QLabel" name="labelDrumMachine">
<property name="text">
<string>&lt;b&gt;UltraDj&lt;/b&gt;</string>
<string>&lt;b&gt;DrumMachine&lt;/b&gt;</string>
</property>
</widget>
</item>