From 46504e4367de2c96d1e9a112e8cb84db54ff2ed1 Mon Sep 17 00:00:00 2001 From: Dan G Date: Fri, 5 Aug 2022 19:42:22 +0200 Subject: [PATCH] bump to v2 --- src/flexasio/FlexASIO/control_panel.cpp | 20 ++-- src/kdasioconfig/images/Fader BTN.png | Bin 23608 -> 21664 bytes src/kdasioconfig/images/Koord Logo.png | Bin 4404 -> 6932 bytes src/kdasioconfig/kdasioconfig.cpp | 110 ++++++++++++++++++- src/kdasioconfig/kdasioconfig.h | 10 +- src/kdasioconfig/kdasioconfigbase.ui | 135 ++++++++++++++++-------- src/kdasioconfig/main.cpp | 2 +- windows/deploy_windows.ps1 | 8 +- windows/kdinstaller.iss | 11 +- 9 files changed, 225 insertions(+), 71 deletions(-) diff --git a/src/flexasio/FlexASIO/control_panel.cpp b/src/flexasio/FlexASIO/control_panel.cpp index cd89d770..d5f67454 100644 --- a/src/flexasio/FlexASIO/control_panel.cpp +++ b/src/flexasio/FlexASIO/control_panel.cpp @@ -66,43 +66,43 @@ namespace flexasio { UniqueHKEY OpenFlexAsioGuiInstallRegistryKey() { HKEY registryKey; - const auto regOpenKeyError = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Fabrikat\\FlexASIOGUI\\Install", {}, KEY_QUERY_VALUE | KEY_WOW64_64KEY, ®istryKey); - if (regOpenKeyError != ERROR_SUCCESS) throw std::runtime_error("Unable to open FlexASIOGUI registry key: " + GetWindowsErrorString(regOpenKeyError)); + const auto regOpenKeyError = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\KoordASIO\\Install", {}, KEY_QUERY_VALUE | KEY_WOW64_64KEY, ®istryKey); + if (regOpenKeyError != ERROR_SUCCESS) throw std::runtime_error("Unable to open KoordASIOSetup registry key: " + GetWindowsErrorString(regOpenKeyError)); return UniqueHKEY(registryKey); } std::wstring GetFlexAsioGuiInstallDirectory() { - Log() << "Attempting to open FlexASIOGUI install registry key"; + Log() << "Attempting to open KoordASIOSetup install registry key"; const auto installRegistryKey = OpenFlexAsioGuiInstallRegistryKey(); - Log() << "Attempting to query FlexASIOGUI install path registry value"; + Log() << "Attempting to query KoordASIOSetup install path registry value"; return GetStringRegistryValue(installRegistryKey.get(), L"InstallPath"); } void OpenFlexAsioGui(HWND windowHandle) { const auto installDirectory = GetFlexAsioGuiInstallDirectory(); - Log() << "FlexASIOGUI install directory: " << ConvertToUTF8(installDirectory); + Log() << "KoordASIOSetup install directory: " << ConvertToUTF8(installDirectory); - Execute(windowHandle, installDirectory + L"\\FlexASIOGUI.exe"); + Execute(windowHandle, installDirectory + L"\\KoordASIOSetup.exe"); } void OpenConfigurationDocs(HWND windowHandle) { - Execute(windowHandle, std::wstring(L"/~https://github.com/dechamps/FlexASIO/blob/") + ConvertFromUTF8(::dechamps_CMakeUtils_gitDescription) + L"/CONFIGURATION.md"); + Execute(windowHandle, std::wstring(L"/~https://github.com/koord-live/KoordASIO/blob/") + ConvertFromUTF8(::dechamps_CMakeUtils_gitDescription) + L"/CONFIGURATION.md"); } } void OpenControlPanel(HWND windowHandle) { - Log() << "Attempting to open FlexASIO GUI"; + Log() << "Attempting to open KoordASIOSetup"; try { OpenFlexAsioGui(windowHandle); return; } catch (const std::exception& exception) { - Log() << "Unable to open FlexASIO GUI: " << ::dechamps_cpputil::GetNestedExceptionMessage(exception); + Log() << "Unable to open KoordASIOSetup: " << ::dechamps_cpputil::GetNestedExceptionMessage(exception); } catch (...) { - Log() << "Unable to open FlexASIO GUI due to unknown exception"; + Log() << "Unable to open KoordASIOSetup due to unknown exception"; } Log() << "Attempting to open configuration docs"; diff --git a/src/kdasioconfig/images/Fader BTN.png b/src/kdasioconfig/images/Fader BTN.png index f9584562a10304aeab394d87c754a66e1b7dadfb..0f2a2bbcf60633125e626679f5791689702f61e0 100644 GIT binary patch literal 21664 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 P00000NkvXXu0mjfia!6D literal 23608 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 P00000NkvXXu0mjf`K4y&|Y8t6Y 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 M07*qoM6N<$g6TxzG5`Po delta 4211 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 JPDHLkV1f?2VEF(5 diff --git a/src/kdasioconfig/kdasioconfig.cpp b/src/kdasioconfig/kdasioconfig.cpp index 991ad70b..be25b571 100644 --- a/src/kdasioconfig/kdasioconfig.cpp +++ b/src/kdasioconfig/kdasioconfig.cpp @@ -8,6 +8,10 @@ #include "toml.h" #include #include +#include +#include +#include +#include KdASIOConfigBase::KdASIOConfigBase(QWidget *parent) : QMainWindow(parent) @@ -29,9 +33,20 @@ KdASIOConfig::KdASIOConfig(QWidget *parent) connect(outputAudioSettButton, &QPushButton::pressed, this, &KdASIOConfig::outputAudioSettClicked); connect(bufferSizeSlider, &QSlider::valueChanged, this, &KdASIOConfig::bufferSizeChanged); connect(bufferSizeSlider, &QSlider::valueChanged, this, &KdASIOConfig::bufferSizeDisplayChange); + // info buttons + connect(inputInfoButton, &QPushButton::pressed, this, &KdASIOConfig::inputInfoClicked); + connect(outputInfoButton, &QPushButton::pressed, this, &KdASIOConfig::outputInfoClicked); + connect(renderInfoButton, &QPushButton::pressed, this, &KdASIOConfig::renderInfoClicked); + connect(bufferInfoButton, &QPushButton::pressed, this, &KdASIOConfig::bufferInfoClicked); + // connect footer buttons + connect(koordLiveButton, &QPushButton::pressed, this, &KdASIOConfig::koordLiveClicked); + connect(githubButton, &QPushButton::pressed, this, &KdASIOConfig::githubClicked); // bufferSizeDisplay->setStyleSheet("background-color: black"); + koordLiveButton->setCursor(Qt::PointingHandCursor); + githubButton->setCursor(Qt::PointingHandCursor); + // populate input device choices inputDeviceBox->clear(); const auto input_devices = m_devices->audioInputs(); @@ -191,6 +206,7 @@ void KdASIOConfig::bufferSizeChanged(int idx) // THUS avoiding lots of spurious intermediate updates on buffer changes bufferSize = bufferSizes[idx]; bufferSizeSlider->setValue(idx); + latencyLabel->setText(QString::number(double(bufferSize) / 48, 'f', 2)); writeTomlFile(); } @@ -252,12 +268,102 @@ void KdASIOConfig::inputAudioSettClicked() { // open Windows audio input settings control panel QProcess *myProcess = new QProcess(this); - myProcess->startDetached(inputAudioSettPath); + myProcess->startDetached("control", QStringList() << inputAudioSettPath); } void KdASIOConfig::outputAudioSettClicked() { // open Windows audio output settings control panel QProcess *myProcess = new QProcess(this); - myProcess->startDetached(outputAudioSettPath); + myProcess->startDetached("control", QStringList() << outputAudioSettPath); +} + + +void KdASIOConfig::inputInfoClicked() +{ + QDialog *qd = new QDialog(this); + QLabel *qlab = new QLabel(); + QString inputInfoText = "" + + tr ( "AUDIO INPUT DEVICE - Tips" ) + + " " + + "
" + "
" + + "Choose your Audio Input Device here, eg your microphone. " + + "
" + "
" + + "Click the tool button to go to Windows audio control panel and configure."; + qlab->setText(inputInfoText); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(qlab); + qd->setLayout(layout); + qd->setPalette(QPalette("#1d1f21")); + qd->show(); +} + +void KdASIOConfig::outputInfoClicked() +{ + QDialog *qd = new QDialog(this); + QLabel *qlab = new QLabel(); + QString outputInfoText = "" + + tr ( "AUDIO OUTPUT DEVICE - Tips" ) + + " " + + "
" + "
" + + "Choose your Audio Output Device here, eg your headphones. " + + "
" + "
" + + "Click the tool button to go to Windows audio control panel and configure."; + qlab->setText(outputInfoText); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(qlab); + qd->setLayout(layout); + qd->setPalette(QPalette("#1d1f21")); + qd->show(); +} + +void KdASIOConfig::renderInfoClicked() +{ + QDialog *qd = new QDialog(this); + QLabel *qlab = new QLabel(); + QString renderInfoText = "" + + tr ( "RENDERING MODE - Tips" ) + + " " + + "
" + "
" + + "Choose between Shared and Exclusive modes, provided by the WASAPI Windows audio system." + + "
" + "
" + + "Shared Mode: mix ASIO with regular Windows audio." + + "
" + "
" + + "Exclusive Mode: lowest latency, locks out access from other audio applications." + ; + qlab->setText(renderInfoText); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(qlab); + qd->setLayout(layout); + qd->setPalette(QPalette("#1d1f21")); + qd->show(); +} + +void KdASIOConfig::bufferInfoClicked() +{ + QDialog *qd = new QDialog(this); + QLabel *qlab = new QLabel(); + QString inputInfoText = "" + + tr ( "BUFFER SIZE - Tips" ) + + " " + + "
" + "
" + + "Select the size of the ASIO Buffer, by the number of samples. " + + "
" + "
" + + "A lower size may cause glitches in your sound, while higher size causes higher latency."; + qlab->setText(inputInfoText); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(qlab); + qd->setLayout(layout); + qd->setPalette(QPalette("#1d1f21")); + qd->show(); +} + +void KdASIOConfig::koordLiveClicked() +{ + QDesktopServices::openUrl(QUrl("https://koord.live", QUrl::TolerantMode)); +} + +void KdASIOConfig::githubClicked() +{ + QDesktopServices::openUrl(QUrl("/~https://github.com/koord-live/KoordASIO/releases", QUrl::TolerantMode)); } diff --git a/src/kdasioconfig/kdasioconfig.h b/src/kdasioconfig/kdasioconfig.h index b9e5fe9c..65ca5367 100644 --- a/src/kdasioconfig/kdasioconfig.h +++ b/src/kdasioconfig/kdasioconfig.h @@ -87,8 +87,8 @@ class KdASIOConfig : public KdASIOConfigBase QString outputDeviceName; QString inputDeviceName; QString fullpath = QDir::homePath() + "/.KoordASIO-builtin.toml"; - QString inputAudioSettPath = "control mmsys.cpl,,1"; - QString outputAudioSettPath = "control mmsys.cpl"; + QString inputAudioSettPath = "mmsys.cpl,,1"; + QString outputAudioSettPath = "mmsys.cpl"; QList bufferSizes = { 32, 64, 128, 256, 512, 1024, 2048 }; private slots: @@ -105,6 +105,12 @@ private slots: void setValuesFromToml(std::ifstream *ifs, toml::ParseResult *pr); void inputAudioSettClicked(); void outputAudioSettClicked(); + void inputInfoClicked(); + void outputInfoClicked(); + void renderInfoClicked(); + void bufferInfoClicked(); + void koordLiveClicked(); + void githubClicked(); }; #endif diff --git a/src/kdasioconfig/kdasioconfigbase.ui b/src/kdasioconfig/kdasioconfigbase.ui index d8d58fd9..8c0c4192 100644 --- a/src/kdasioconfig/kdasioconfigbase.ui +++ b/src/kdasioconfig/kdasioconfigbase.ui @@ -133,6 +133,12 @@ + + + 16777215 + 20 + + Rubik @@ -143,7 +149,13 @@ color: gray; - open-source, universal ASIO + open-source universal ASIO driver + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false @@ -247,7 +259,7 @@ - :/img/images/CONFIG BTN ON.png:/img/images/CONFIG BTN ON.png + :/img/images/CONFIG BTN OFF.png:/img/images/CONFIG BTN OFF.png @@ -261,7 +273,7 @@ - + 0 @@ -279,6 +291,15 @@ PreferDefault + + + + + + + + + false @@ -287,7 +308,7 @@ - :/img/images/INFO BTN ON.png:/img/images/INFO BTN ON.png + :/img/images/INFO BTN OFF.png:/img/images/INFO BTN OFF.png @@ -295,6 +316,9 @@ 25 + + false + false @@ -672,7 +696,7 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - :/img/images/CONFIG BTN ON.png:/img/images/CONFIG BTN ON.png + :/img/images/CONFIG BTN OFF.png:/img/images/CONFIG BTN OFF.png @@ -686,7 +710,7 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - + 0 @@ -707,7 +731,8 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - :/img/images/INFO BTN ON.png:/img/images/INFO BTN ON.png + :/img/images/INFO BTN OFF.png + :/img/images/INFO BTN ON.png:/img/images/INFO BTN OFF.png @@ -715,6 +740,9 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ 25 + + true + false @@ -871,7 +899,7 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - + 0 @@ -886,7 +914,7 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - :/img/images/INFO BTN ON.png:/img/images/INFO BTN ON.png + :/img/images/INFO BTN OFF.png:/img/images/INFO BTN OFF.png @@ -959,8 +987,8 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ padding-right: -4px; padding-bottom: -2px; border-radius: 5px; - border: 2px solid black; - background-color: black; + border: 2px solid #1d1f21; + background-color: #1d1f21; } @@ -1025,8 +1053,8 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ padding-right: -4px; padding-bottom: -2px; border-radius: 5px; - border: 2px solid black; - background-color: black; + border: 2px solid #1d1f21; + background-color: #1d1f21; } @@ -1149,7 +1177,7 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - + 0 @@ -1164,7 +1192,7 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - :/img/images/INFO BTN ON.png:/img/images/INFO BTN ON.png + :/img/images/INFO BTN OFF.png:/img/images/INFO BTN OFF.png @@ -1221,8 +1249,8 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ QLCDNumber{ - background-color: black; - border: 2px solid black; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #17191A, stop:1 #1E2122); + border: 2px solid #1d1f21; border-width: 2px; border-radius: 5px; color: orange; @@ -1242,6 +1270,13 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ + + + + TextLabel + + + @@ -1270,8 +1305,9 @@ QComboBox::down-arrow:on { /* shift the arrow when popup is open */ QSlider::groove:horizontal { - height: 12px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4); + height: 18px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #BF740D, stop:1 #FF9B12); + border-radius: 5px; } @@ -1279,16 +1315,18 @@ QSlider::handle:horizontal { image: url(:/img/images/Fader BTN.png); width: 30px; margin: -20px 20px; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ + margin-left: -3px; + margin-right: -3px; border-radius: 3px; } -QSlider::add-page:horizontal { +/*QSlider::add-page:horizontal { background: #1d1f21; } QSlider::sub-page:horizontal { background: #ff9c12; -} +}*/ 6 @@ -1392,25 +1430,32 @@ QSlider::sub-page:horizontal { - - - - 0 - 0 - - + - 108 - 27 + 101 + 15 - - image: url(:/img/images/Koord Logo.png); + + false + + + :/img/images/Koord Logo.png:/img/images/Koord Logo.png + + + + 166 + 29 + + + + true + @@ -1427,24 +1472,22 @@ QSlider::sub-page:horizontal { - - - - 0 - 0 - + + + - + + + :/img/images/mark-github-24.png:/img/images/mark-github-24.png + + - 24 - 24 + 18 + 18 - - image: url(:/img/images/mark-github-24.png); - - - + + true diff --git a/src/kdasioconfig/main.cpp b/src/kdasioconfig/main.cpp index b985e85a..296dbd85 100644 --- a/src/kdasioconfig/main.cpp +++ b/src/kdasioconfig/main.cpp @@ -55,7 +55,7 @@ int main(int argv, char **args) { QApplication app(argv, args); - app.setApplicationName("Audio Device Test"); + app.setApplicationName("KoordASIO Setup"); KdASIOConfig audio; audio.show(); diff --git a/windows/deploy_windows.ps1 b/windows/deploy_windows.ps1 index 35909495..ad5db0a5 100644 --- a/windows/deploy_windows.ps1 +++ b/windows/deploy_windows.ps1 @@ -262,7 +262,7 @@ Function Build-App Invoke-Native-Command -Command "$Env:QtWinDeployPath" ` -Arguments ("--$BuildConfig", "--no-compiler-runtime", "--dir=$DeployPath\$BuildArch", ` "--no-system-d3d-compiler", "--no-opengl-sw", ` - "$BuildPath\$BuildConfig\kdasioconfig\kdasioconfig.exe") + "$BuildPath\$BuildConfig\kdasioconfig\KoordASIOSetup.exe") # Get-ChildItem -Recurse "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\" @@ -272,15 +272,15 @@ Function Build-App # all build files: # kdasioconfig files inc qt dlls now in # D:/a/KoordASIO/KoordASIO/deploy/x86_64/ - # - kdasioconfig.exe + # - KoordASIOSetup.exe # all qt dlls etc ... # flexasio files in: # D:\a\KoordASIO\KoordASIO\build\flexasio\install\bin # - FlexASIO.dll # - portaudio_x64.dll - # Move kdasioconfig.exe to deploy dir - Move-Item -Path "$BuildPath\$BuildConfig\kdasioconfig\kdasioconfig.exe" -Destination "$DeployPath\$BuildArch" -Force + # Move KoordASIOSetup.exe to deploy dir + Move-Item -Path "$BuildPath\$BuildConfig\kdasioconfig\KoordASIOSetup.exe" -Destination "$DeployPath\$BuildArch" -Force # Move 2 x FlexASIO dlls to deploy dir, rename DLL here for separation Move-Item -Path "$BuildPath\$BuildConfig\flexasio\install\bin\KoordASIO.dll" -Destination "$DeployPath\$BuildArch" -Force Move-Item -Path "$BuildPath\$BuildConfig\flexasio\install\bin\portaudio_x64.dll" -Destination "$DeployPath\$BuildArch" -Force diff --git a/windows/kdinstaller.iss b/windows/kdinstaller.iss index 3d822801..a1295e34 100644 --- a/windows/kdinstaller.iss +++ b/windows/kdinstaller.iss @@ -3,8 +3,7 @@ [Setup] AppID=KoordASIO AppName=KoordASIO -AppVerName=KoordASIO_1.7a-k03 -AppVersion=1.7a-k03 +AppVersion=2.0 AppPublisher=Koord.Live AppPublisherURL=/~https://github.com/koord-live/KoordASIO AppSupportURL=/~https://github.com/koord-live/KoordASIO/issues @@ -18,7 +17,7 @@ ArchitecturesInstallIn64BitMode=x64 [Files] Source:"deploy\x86_64\KoordASIO.dll"; DestDir: "{app}"; Flags: ignoreversion regserver 64bit; Check: Is64BitInstallMode -; install everything else in deploy dir, including portaudio.dll, kdasioconfig.exe and all Qt dll deps +; install everything else in deploy dir, including portaudio.dll, KoordASIOSetup.exe and all Qt dll deps Source:"deploy\x86_64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs 64bit; Check: Is64BitInstallMode ; Source:"x86\install\bin\FlexASIO.dll"; DestDir: "{app}\x86"; Flags: ignoreversion regserver ; Source:"x86\install\bin\*"; DestDir: "{app}\x86"; Flags: ignoreversion @@ -26,12 +25,12 @@ Source:"deploy\x86_64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs ; Source:"*.md"; DestDir:"{app}"; Flags: ignoreversion [Icons] -Name: "{group}\KoordASIO Config"; Filename: "{app}\kdasioconfig.exe"; WorkingDir: "{app}" +Name: "{group}\KoordASIO Config"; Filename: "{app}\KoordASIOSetup.exe"; WorkingDir: "{app}" [Run] -Filename: "{app}\kdasioconfig.exe"; Description: "Run KoordASIO Config"; Flags: postinstall nowait skipifsilent +Filename: "{app}\KoordASIOSetup.exe"; Description: "Run KoordASIO Config"; Flags: postinstall nowait skipifsilent -; install reg key to locate kdasioconfig at runtime +; install reg key to locate KoordASIOSetup at runtime [Registry] Root: HKLM64; Subkey: "Software\Koord"; Flags: uninsdeletekeyifempty Root: HKLM64; Subkey: "Software\Koord\KoordASIO"; Flags: uninsdeletekey