Skip to content

Adding native Voicemeeter intergration - #29

Open
SkellyVamps wants to merge 3 commits into
HeadsetControl-GUI:mainfrom
SkellyVamps:main
Open

Adding native Voicemeeter intergration#29
SkellyVamps wants to merge 3 commits into
HeadsetControl-GUI:mainfrom
SkellyVamps:main

Conversation

@SkellyVamps

Copy link
Copy Markdown

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.

@nicola02nb
nicola02nb requested a balanced review from Copilot August 8, 2026 14:41

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • QStringList is 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 behind QT_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 HeadsetControl process executions (via API.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() calls API.updateChatMix(), which blocks on QProcess::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;
    }

@SkellyVamps

SkellyVamps commented Aug 8, 2026

Copy link
Copy Markdown
Author

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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants