Adding native Voicemeeter intergration - #29
Conversation
Add native Voicemeeter ChatMix integration
forgot to update readme
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 11 out of 11 changed files in this pull request and generated no new comments.
Suppressed comments (6)
src/UI/mainwindow.cpp:161
- The UI allows selecting update intervals as low as 20ms, but the implementation refreshes ChatMix by synchronously spawning
HeadsetControl(waitForFinished()), which is unlikely to be safe/necessary at that frequency. Consider raising the minimum to match the runtime clamp.
voicemeeterIntervalSpinBox = new QSpinBox(connectionGroup);
voicemeeterIntervalSpinBox->setRange(20, 1000);
voicemeeterIntervalSpinBox->setSuffix(tr(" ms"));
voicemeeterIntervalSpinBox->setValue(settings.voicemeeterUpdateIntervalMs);
src/Utils/voicemeetercontroller.h:8
QStringListis used in the class interface (dllCandidates()return type) but the header doesn't include<QStringList>, which can cause a compile error depending on include order.
#include "settings.h"
#include <QLibrary>
#include <QString>
src/Utils/voicemeetercontroller.cpp:113
- This
qDebug()runs for every mapping on every timer tick, which can spam logs and impact performance at low update intervals. Consider gating it behindQT_DEBUG(or a logging category).
const long result = m_setParameterFloat(parameter.data(), gain);
qDebug() << "Voicemeeter ChatMix" << chatmix << parameter << gain << "result" << result;
src/DataTypes/settings.h:69
- Defaulting to a 50ms update interval causes frequent synchronous
HeadsetControlprocess executions (viaAPI.updateChatMix()), which can lead to high CPU usage and UI stutter. A higher default is safer for most systems.
bool voicemeeterInvert = false;
int voicemeeterUpdateIntervalMs = 50;
int voicemeeterDeadband = 0;
QString voicemeeterActiveProfile = "Game / Chat";
src/UI/mainwindow.cpp:121
updateVoicemeeterChatMix()callsAPI.updateChatMix(), which blocks onQProcess::waitForFinished(). Allowing a 20ms timer interval can create near-continuous blocking work on the UI thread. Consider clamping the minimum interval higher (or making the chatmix refresh async).
This issue also appears on line 158 of the same file.
voicemeeterController.configure(settings);
timerVoicemeeter->stop();
if (settings.voicemeeterEnabled)
timerVoicemeeter->start(qBound(20, settings.voicemeeterUpdateIntervalMs, 1000));
}
src/Utils/voicemeetercontroller.cpp:47
- If a candidate DLL exists but fails to load (e.g., missing dependencies / wrong architecture), the current error message says the DLL "was not found", which is misleading. Track whether a file was found and include
QLibrary::errorString()when load fails.
if (m_loggedIn) return true;
for (const QString &candidate : dllCandidates()) {
if (!QFileInfo::exists(candidate)) continue;
m_library.setFileName(candidate);
if (m_library.load()) break;
}
if (!m_library.isLoaded()) {
m_lastError = "VoicemeeterRemote64.dll was not found. Install Voicemeeter or copy the DLL beside the application.";
return false;
}
|
I did forget to say that it might be best to merge this into its own fork as I know I did not really put much effort into this, outside of trying to just get it to work as before i was using a python script to get the same effect inside one application. I will say that I know my coding is bad and this is what is left after having ai reduce and simplify most changes and double check my own work. feel free to give me feed back and tell me where I can improve as having human feedback is far more informative to me. After using it for a few days with its default settings though I have seen no noticeable difference in performance in the games I play or the benchmarks I've run with it on and off (3d mark, rise of the tomb raider, cyberpunk 2077). |
This commit adds the ability to control the gain sliders in voicemeeter to recreate the chat mix function from the sonar app from steelseries. Currently only tested with the Arctis Nova 7 and Voicemeeter Potato.